背景: 传感器的急剧增加——视觉数据的生成量急剧增加——计算机视觉的重要性
研究大脑: 大脑的视觉处理:边缘的简单结构——信息的路径移动——(逐步)复杂结构
一、计算机视觉的发展:
-
视觉图像——(简化)几何图形——识别与重建
-
原始草图(Raw Primal Sketch)——二维轮廓(2.5D Sketch)——三维模型(3D Model)
- 原始草图(Raw Primal Sketch)
- 图像预处理:去除图像噪声,增强边缘
- 边缘检测:通过计算图像梯度来检测图像中的边缘和亮度变化
- 特征提取:如亮度、颜色、纹理和边缘方向
- 二维轮廓(2.5D Sketch)
- 深度信息:通过信息,形状和相对位置,来估计物体在三维空间中的定位及其变化(物体的空间关系)(深度信息的草图(即“2.5D”))。
- 三维模型(3D Model)
- 物体建模:根据提取特征和信息,重建物体的三维形状
- 识别与分类:物体识别和分类。(可能涉及比较已有的模型,或者使用学习算法来处理新输入的图像)
- 场景理解:对整个场景的理解,不仅仅局限于单个物体,其实包括对多个物体之间的关系、以及与人类经验的结合。
-
-
图像分割(把有意义的(想研究的)像素点划区域来简化
-
机器学习——基于特征的对象识别——支持向量机/Adaboost——可能有过拟合问题
过拟合问题:这里值得仔细阐述下过拟合:过拟合发生在模型学习到了训练数据中的噪声和细节,而不全是我们期望提取的特征。这意味着模型在训练集上表现得很好,但在未见过的数据上却无法泛化。
我这里可以举一个之前学机器学习分类和回归的简单例子:
其中 Normal 曲线是使用使用了带参数空间限制的最小二乘法进行求解的模型,Overfit 曲线是使用最小二乘法直接求解得到的
角度一:我们可以用训练误差和交叉验证(k 折交叉验证)误差来直观体现这样的情况
-
训练误差反映了模型对**训练数据的拟合程度,而交叉验证误差则反映了模型在新数据上的泛化能力**。
这个图是之前记录的,它说明了随着多项式的复杂,训练误差不断降低,但是交叉验证误差却从某个点开始上升,这就是过拟合
角度二:我们可以从偏差和方差的角度
其中右下角的低偏差高方差就是过拟合
如何消除过拟合?
- 增加样本量
- 各种不同的样本:丰富的数据集包含更多的变异性
- 数据训练进行之前进行数据清洗
- 对于神经网络:要么可以考虑让神经网络不要那么复杂(减少隐藏层数/节点数)、要么可以考虑增加 Drop 层(在每层中随机选取一些节点使其不工作),或是添加 Batch Normalization(对每一层的输入归一化)来减轻过拟合现象
-
-
pascal 视觉对象挑战(基准数据集)——imageNet(巨大数据集) ——用于识别与分类以及各种应用
-
卷积神经网络——CPU 和 GPU 的发展——增加计算提升效果
-
未来的路:对图片的深刻理解(包括图片背后的“故事”含义)
二、图像分类
首先我们需要明确最本质的原理:
数据驱动:数据集——训练(接受图像和它对应的标签)——输出模型——预测
最近邻算法——(进阶)K 最近邻算法(KNN)
这个非常其实类似于聚类算法 K-means++
K 最近邻算法(KNN)
- 一种监督学习算法,主要用于分类任务。它通过计算测试样本与训练样本之间的距离,找到最近的 K 个邻居,并根据这些邻居的标签进行预测。
原理:
- 计算其与所有训练样本的距离(根据问题不同,选择的距离类型也不同)
- 找到距离最近的 K 个训练样本,统计这些样本的标签,选择出现频率最高的标签作为预测结果
特点:
- KNN 不需要显式的训练过程,所有的训练数据在预测时都被使用。
##非常简单的最近邻算法
import numpy as np
class NearestNeighbor:
def __init__(self):
pass
def train(self, X, y):
"""存储训练数据和标签"""
self.Xtr = X
self.ytr = y
//train O(1)
def 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 就是超参数:这里我们需要提到超参数的概念:
超参数是我们在训练模型之前需要设置的参数,而不是通过训练数据学习得到的。
这些参数的选择会直接影响算法的表现和效果
实验和验证来确定最佳的超参数值
下面我要谈到如何实验和验证:
在此之前有两种不好的方式:
一种是整个数据集为训练集,这样前面提到过可能会过拟合,而且不知道超参数的效果
一种是分成训练集和测试集::选择超参数时只依赖于测试集
所以应该把集合分成三个:训练集、验证集和测试集
选择在验证集上表现最佳的超参数,并在测试集上进行最终评估。
这里需要提到的一点是:刚开始可能会有一个疑惑:对于第二种情况,我不能根据测试集的结果来反复改变训练集的参数反复调试吗?
可以明确的说:这是不能的,出于科学的原则,测试集只能在最终测试的时候触碰一次,才能公平得显示模型的优劣,如果可以触碰多次,那么就好像专为了这一个测试集专设的模型(不严谨 且容易出现过拟合的情况)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于