计算机视觉 -hxw

背景: 传感器的急剧增加——视觉数据的生成量急剧增加——计算机视觉的重要性

研究大脑: 大脑的视觉处理:边缘的简单结构——信息的路径移动——(逐步)复杂结构


一、计算机视觉的发展:

  1. 视觉图像——(简化)几何图形——识别与重建

  2. 原始草图(Raw Primal Sketch)——二维轮廓(2.5D Sketch)——三维模型(3D Model)

    1. 原始草图(Raw Primal Sketch)
    • 图像预处理:去除图像噪声,增强边缘
    • 边缘检测:通过计算图像梯度来检测图像中的边缘和亮度变化
    • 特征提取:如亮度、颜色、纹理和边缘方向
    1. 二维轮廓(2.5D Sketch)
    • 深度信息:通过信息,形状和相对位置,来估计物体在三维空间中的定位及其变化(物体的空间关系)(深度信息的草图(即“2.5D”))。
    1. 三维模型(3D Model)
    • 物体建模:根据提取特征和信息,重建物体的三维形状
    • 识别与分类:物体识别和分类。(可能涉及比较已有的模型,或者使用学习算法来处理新输入的图像)
    • 场景理解:对整个场景的理解,不仅仅局限于单个物体,其实包括对多个物体之间的关系、以及与人类经验的结合。​
    1. image
  3. 图像分割(把有意义的(想研究的)像素点划区域来简化

  4. 机器学习——基于特征的对象识别——支持向量机/Adaboost——可能有过拟合问题

    过拟合问题:这里值得仔细阐述下过拟合:过拟合发生在模型学习到了训练数据中的噪声和细节,而不全是我们期望提取的特征。这意味着模型在训练集上表现得很好,但在未见过的数据上却无法泛化。

    我这里可以举一个之前学机器学习分类和回归的简单例子:

    image

    其中 Normal 曲线是使用使用了带参数空间限制的最小二乘法进行求解的模型,Overfit 曲线是使用最小二乘法直接求解得到的

    角度一:我们可以用训练误差和交叉验证(k 折交叉验证)误差来直观体现这样的情况

    • 训练误差反映了模型对**训练数据的拟合程度,而交叉验证误差则反映了模型在新数据上的泛化能力**。

      image

      这个图是之前记录的,它说明了随着多项式的复杂,训练误差不断降低,但是交叉验证误差却从某个点开始上升,这就是过拟合

    角度二:我们可以从偏差和方差的角度

    image

    其中右下角的低偏差高方差就是过拟合

    如何消除过拟合?

    1. 增加样本量
    2. 各种不同的样本:丰富的数据集包含更多的变异性
    3. 数据训练进行之前进行数据清洗
    4. 对于神经网络:要么可以考虑让神经网络不要那么复杂(减少隐藏层数/节点数)、要么可以考虑增加 Drop 层(在每层中随机选取一些节点使其不工作),或是添加 Batch Normalization(对每一层的输入归一化)来减轻过拟合现象
  5. pascal 视觉对象挑战(基准数据集)——imageNet(巨大数据集) ——用于识别与分类以及各种应用

  6. 卷积神经网络——CPU 和 GPU 的发展——增加计算提升效果

  7. 未来的路:对图片的深刻理解(包括图片背后的“故事”含义)

二、图像分类

首先我们需要明确最本质的原理:

数据驱动:数据集——训练(接受图像和它对应的标签)——输出模型——预测

最近邻算法——(进阶)K 最近邻算法(KNN)

这个非常其实类似于聚类算法 K-means++

K 最近邻算法(KNN)

  • 一种监督学习算法,主要用于分类任务。它通过计算测试样本与训练样本之间的距离,找到最近的 K 个邻居,并根据这些邻居的标签进行预测。
  1. 原理:

    • 计算其与所有训练样本的距离(根据问题不同,选择的距离类型也不同)
    • 找到距离最近的 K 个训练样本,统计这些样本的标签,选择出现频率最高的标签作为预测结果
  2. 特点:

    • KNN 不需要显式的训练过程,所有的训练数据在预测时都被使用
##非常简单的最近邻算法 import numpy as np class NearestNeighbor: def __init__(self): pass def train(self, X, y): """存储训练数据和标签""" self.Xtr = X self.ytr = y //train O(1def predict(self, X): """对测试数据进行预测""" num_test = X.shape[0] Ypred = np.zeros(num_test, dtype=self.ytr.dtype) for i in range(num_test): # 计算测试样本与所有训练样本之间的L1距离 distances = np.sum(np.abs(self.Xtr - X[i, :]), axis=1) # 找到距离最小的训练样本的索引 min_index = np.argmin(distances) # 将对应的标签存储在预测结果中 Ypred[i] = self.ytr[min_index] //predict O(n) return Ypred //这其实与我们的期待背道而驰,我们希望训练的时候慢一些,加快预测速度

超参数:比如这里的 K 就是超参数:这里我们需要提到超参数的概念:

  • 超参数是我们在训练模型之前需要设置的参数,而不是通过训练数据学习得到的。

  • 这些参数的选择会直接影响算法的表现和效果

  • 实验和验证来确定最佳的超参数值

    下面我要谈到如何实验和验证:

    在此之前有两种不好的方式:

    一种是整个数据集为训练集,这样前面提到过可能会过拟合,而且不知道超参数的效果

    一种是分成训练集和测试集::选择超参数时只依赖于测试集

    所以应该把集合分成三个:训练集、验证集和测试集

    选择在验证集上表现最佳的超参数,并在测试集上进行最终评估。

这里需要提到的一点是:刚开始可能会有一个疑惑:对于第二种情况,我不能根据测试集的结果来反复改变训练集的参数反复调试吗?

可以明确的说:这是不能的,出于科学的原则,测试集只能在最终测试的时候触碰一次,才能公平得显示模型的优劣,如果可以触碰多次,那么就好像专为了这一个测试集专设的模型(不严谨 且容易出现过拟合的情况)

1 操作
XiaoweiH 在 2024-10-10 02:00:39 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 3 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 604 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖 • 1 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • 倾城之链
    23 引用 • 66 回帖 • 138 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    107 引用 • 295 回帖 • 1 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 637 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 388 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1235 回帖 • 409 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • 反馈

    Communication channel for makers and users.

    123 引用 • 913 回帖 • 249 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 50 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    265 引用 • 666 回帖
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    6 引用 • 63 回帖 • 5 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖 • 2 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 63 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    943 引用 • 1460 回帖 • 1 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 535 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    34 引用 • 148 回帖
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 24 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    53 引用 • 37 回帖 • 2 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 529 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 43 关注