识别的方法(Approaches to recognition)
使用 CNN 物体识别
- 检测局部特征,忽略空间位置(Detect local features, ignore spatial position)
这个方法只关心图像中的局部特征(如边缘、角点等),而不考虑它们在整个图像中的位置。例如,"词袋模型(Bag of Words)"或"特征袋(Bag of Features)"是一种常用的方法。 - 局部特征 + 弱空间关系(Local features + weak spatial relations)
这里不仅检测局部特征,还考虑了它们之间的一些基本的空间关系,但这些空间关系往往是很弱的。一个典型的例子是"空间金字塔模型(Spatial Pyramid Models)"。 - 检测局部特征并模型化它们之间的空间关系(Detect local features and model spatial relations between them)
这种方法更为复杂,它不仅检测局部特征,还尝试理解这些特征之间的复杂空间关系。 - 可变部件模型(Deformable-parts models)
这个方法更进一步,它假设图像中的对象是由多个可变形的部分组成的,然后尝试模型化这些部分和它们之间的空间关系。 - 关键点跟踪/匹配(Keypoint tracking / matching)
这种方法常用于视频或多帧图像分析。它首先在每一帧中找到"关键点",然后在多帧之间进行匹配和跟踪,以理解物体或场景的动态变化。
从本地进行特征识别(Recognition from local features)
特征袋(Bags of Features)
在图像中的应用
在图像处理中,"Bag of Features"模型同样忽视了局部特征(比如边缘、角点、纹理等)在图像中的位置,而只关心这些特征出现的频率。简单地说,在这里的"单词"就是图像中的局部特征。
工作原理
- 特征提取:首先,从图像中提取出各种局部特征。
- 构建词典:通过对这些特征进行聚类,形成一个"视觉词典"。
- 特征直方图:然后,每张图像都可以表示为该词典中"视觉单词"的出现频率的直方图。
这样,每张图像就被转化成了一个特征直方图,进而可以用于图像分类、检索或其他视觉任务。
这种模型的一个主要优点是它的简单 和灵活性 ,但缺点是它忽略了图像中的空间信息,这在某些应用场景下可能是重要的。
问题❓:在图像中,相同的"词"(或称为"特征")可能有多种表现形式
在图像处理中,同一个"视觉词"(即局部特征,如边缘、角点或纹理)可能在不同的图像或图像的不同区域中有多种不同的外观或变化。这种多样性可能会干扰图像识别或分类。
解决方案:合并相似的局部特征,例如使用 k-means 聚类
为了解决这个问题,一种常见的方法是使用 k-means 聚类算法(或其他聚类方法)来对这些局部特征进行分组。这样做的目的是找出那些外观或性质相似的局部特征,并将它们归为同一类,即同一个"视觉词"。
具体步骤如下:
- 特征提取:首先从多张图像中提取局部特征。
- k-means 聚类:然后使用 k-means(或其他聚类算法)对这些特征进行聚类。这样,相似的特征会被分到同一组。
- 构建视觉词典:每一个聚类中心(centroid)可以看作是一个"视觉词",代表该组特征的平均或中心点。
- 特征直方图:最后,用这些聚类中心构建每张图像的特征直方图。
通过这种方式,即使局部特征有多种不同的外观或变化,也能通过聚类合并为更稳定、更一致的"视觉词",从而提高图像识别或分类的准确性。
空间金字塔(Spatial Pyramids)
主要思想:在多个尺度上运行特征袋(Bag of Features)
空间金字塔是一种用于图像识别和分类的高级技术,它通过在多个尺度(或说"分辨率")上应用"特征袋(Bag of Features)"模型来工作。通过这样做,模型能够捕捉到图像在不同尺度下的局部特征,从而获得更为丰富和多样的信息。
注意以下两者之间的区别:
-
在单一尺度上检测特征并在多个尺度上进行池化(Pooling)
在这种情况下,你首先在一个尺度(或分辨率)上识别出局部特征,然后在多个不同尺度上对这些特征进行池化(通常是平均或最大池化)。这样做可以在不同的空间粒度上总结特征,但所有特征仍然是在同一个尺度上提取的。
-
在多个尺度上检测特征
这里,你会在多个不同的尺度上分别提取局部特征。这意味着,对于每一个尺度,你都会得到一组局部特征,这些特征反映了图像在该尺度下的特性。这种方法通常能够捕捉到更多的信息,因为它考虑了图像在不同尺度下的变化。
通过综合利用这两种方法,空间金字塔能够提供一种在多个尺度上捕捉图像特征的强大工具,从而提高图像分类或识别任务的性能。
总结
-
特征袋(Bag of Words/Features) :在图像的任何位置检测局部特征,但忽略特征之间的位置和空间关系。
特征袋模型主要关注于局部特征(如边缘、角点、纹理等)出现的频率,而不关心这些特征在图像中的具体位置。这样做的好处是模型具有很高的灵活性和简单性。
-
空间金字塔(Spatial Pyramids) :在"特征袋"方法的基础上添加了弱的空间关系信息。
空间金字塔通过在多个尺度或分辨率上运行特征袋模型,能够捕捉到一定程度的空间关系信息。这样不仅保留了局部特征的统计信息,还能够考虑到它们在空间上的分布。
-
一般适用于类别级别的识别:对物体的平移和姿态具有高度的不变性。
由于这两种方法都在一定程度上忽略了空间信息,它们通常更适用于类别级别的识别任务,比如判断图像是否包含某种类型的物体(而不是具体哪一个物体)。忽略部分空间信息意味着模型对物体在图像中的平移和姿态更具不变性,因此在这类任务上表现通常较好。
特征检测(Feature detection)
稠密特征与稀疏特征(Dense vs. sparse features)
稠密特征表示(Dense Feature Representation) :在图像的每一个位置都计算局部特征。
在这种表示方法中,图像的每一个像素点或小区域都会被用来计算某种局部特征(比如颜色、纹理、梯度等)。这样会产生大量的特征数据,能够捕捉到图像的细微变化,但同时也会增加计算复杂度和存储需求。
稀疏特征表示(Sparse Feature Representation) :仅在几个"重要"的点上计算局部特征。
与稠密特征相反,稀疏特征表示只在图像中的某些特定点(通常是角点、边缘交汇点或其他高度独特的区域)上计算局部特征。这种方法的优点是计算效率更高,因为它只关注图像中最可能包含有用信息的部分。然而,由于忽略了大部分图像区域,稀疏特征可能会丢失一些信息。
- 稠密特征更适用于需要高度精确和详细信息的应用场景,但计算和存储成本较高。
- 稀疏特征更加高效,适用于实时应用或者资源有限的情况,但可能损失一部分信息。
定义
-
特征检测(Feature Detection) :在图像中找出"重要"的点(感兴趣点或关键点)。
-
什么是重要的点?
通常来说,能够在图像经过变换(如缩放、旋转等)后仍然可靠地被检测到的点被认为是重要的。
-
-
特征描述符(Feature Descriptor) :用于表示图像中某一点的短码 (short code) 或一组数字 (set of number)。
下面哪个是 good keypoint?
💡 答案:是中间的那张
选择一个 good keypoint
- 在小窗口中应该容易识别: 这意味着当你在一小块区域(或称为窗口)内查看关键点时,它应该具有足够的独特性,使你能够轻松地辨别出来。这是因为在图像处理和计算机视觉中,经常需要在小窗口中提取和匹配特征,如果一个关键点在小窗口内部不容易识别,那么它可能不是一个好的关键点。
- 窗口往任何方向移动都应该产生大的亮度变化: 这意味着当你稍微移动或偏移这个小窗口时,窗口内的像素强度(或称为亮度)应该有显著的变化。这样的关键点通常位于图像的边缘、角点或其他有高对比度的区域,这使得这些关键点对于微小的位置变化非常敏感。这种敏感性有助于更准确地匹配和识别关键点。
- uniform = no change in any direction (均匀区域 = 任何方向上都没有变化)
- Edge = no change along edge direction (边缘 = 沿着边缘方向没有变化)
- Corner = change in all directions (角 = 所有方向上都有变化)
Corner 检测
窗口 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( x , y ) w(x,y) </math>w(x,y) 在 <math xmlns="http://www.w3.org/1998/Math/MathML"> [ u , v ] [u,v] </math>[u,v] 方向上的移动时的外观变化
公式:
<math xmlns="http://www.w3.org/1998/Math/MathML"> E ( u , v ) = ∑ x , y [ w ( x , y ) ( I ( x + u , y + v ) − I ( x , y ) ) ] 2 E(u,v) = \sum_{x,y} \left[ w(x,y) \left( I(x+u,y+v) - I(x,y) \right) \right]^2 </math>E(u,v)=∑x,y[w(x,y)(I(x+u,y+v)−I(x,y))]2
-
<math xmlns="http://www.w3.org/1998/Math/MathML"> I ( x + u , y + v ) I(x+u,y+v) </math>I(x+u,y+v): 移动后的强度
-
<math xmlns="http://www.w3.org/1998/Math/MathML"> I ( x , y ) I(x,y) </math>I(x,y): 强度
-
Shifted intensity (移动后的强度): 是指原始图像某位置在沿着某方向移动一定距离后的亮度或颜色值。
-
Intensity (强度): 代表图像某个位置的亮度或颜色值。
常见的窗口函数: square, Gaussian
数学原理
使用泰勒级数(Taylor series)来近似移动后的强度
衍生出来的一些简化:
使用泰勒级数来近似移动后的强度,并用矩阵 M 替代,有助于有效地确定图像中的角点位置。
M 的值
<math xmlns="http://www.w3.org/1998/Math/MathML"> ∂ I ∂ x \frac{\partial I}{\partial x} </math>∂x∂I 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> ∂ I ∂ y \frac{\partial I}{\partial y} </math>∂y∂I 分别是图像强度函数关于 ( x ) 和 ( y ) 的偏导数。 其中,W 是图像的一个小窗口, <math xmlns="http://www.w3.org/1998/Math/MathML"> I x I_x </math>Ix 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> I y I_y </math>Iy 是图像强度函数在 x 和 y 方向的梯度。 <math xmlns="http://www.w3.org/1998/Math/MathML"> I x I y I_xI_y </math>IxIy 代表在特定点上 <math xmlns="http://www.w3.org/1998/Math/MathML"> I x I_x </math>Ix 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> I y I_y </math>Iy 的乘积。
角响应函数 (Corner response function)
使用矩阵 M 的特征值(eigenvalues) <math xmlns="http://www.w3.org/1998/Math/MathML"> λ 1 , λ 2 λ1, λ2 </math>λ1,λ2 来检测角。
为了寻找角,需要找 <math xmlns="http://www.w3.org/1998/Math/MathML"> λ 1 λ 2 λ1λ2 </math>λ1λ2大,但是 <math xmlns="http://www.w3.org/1998/Math/MathML"> λ 1 + λ 2 λ1+λ2 </math>λ1+λ2小的点
Harris 角 (Harris corners)
Harris角点: <math xmlns="http://www.w3.org/1998/Math/MathML"> λ 1 λ 2 和 λ 1 + λ 2 是矩阵 M 的行列式和迹: \lambda_1 \lambda_2 \text{ 和 } \lambda_1 + \lambda_2 \text{ 是矩阵 } M \text{ 的行列式和迹:} </math>λ1λ2 和 λ1+λ2 是矩阵 M 的行列式和迹:
-
<math xmlns="http://www.w3.org/1998/Math/MathML"> det = np.linalg.det(m) \text{det} = \text{np.linalg.det(m)} </math>det=np.linalg.det(m)
-
<math xmlns="http://www.w3.org/1998/Math/MathML"> det ( M ) = λ 1 λ 2 \text{det}(M) = \lambda_1 \lambda_2 </math>det(M)=λ1λ2
-
<math xmlns="http://www.w3.org/1998/Math/MathML"> trace = m.trace() \text{trace} = \text{m.trace()} \quad </math>trace=m.trace()
-
<math xmlns="http://www.w3.org/1998/Math/MathML"> tr ( M ) = λ 1 + λ 2 \text{tr}(M) = \lambda_1 + \lambda_2 </math>tr(M)=λ1+λ2
<math xmlns="http://www.w3.org/1998/Math/MathML"> Harris角点响应: R = det ( M ) − k ( tr ( M ) ) 2 \text{Harris角点响应:} R = \text{det}(M) - k (\text{tr}(M))^2 </math>Harris角点响应:R=det(M)−k(tr(M))2
<math xmlns="http://www.w3.org/1998/Math/MathML"> k 值根据经验确定,大约在 0.04-0.06 之间。 k \text{ 值根据经验确定,大约在 0.04-0.06 之间。} </math>k 值根据经验确定,大约在 0.04-0.06 之间。
不变性 & 容忍性(Invariance / tolerance)
- 角点检测基于图像梯度(边缘),因此它是:
- 对平移具有不变性
- 对光照变化具有容忍性
- 由于角点响应基于特征值,所以它对图像平面的旋转具有不变性
- 对于尺度并不具有不变性!
Harris 角的替代方案
替代的角点响应函数:
- Shi-Tomasi (1994):min(λ1,λ2)
- Brown, Szeliski, & Winder (2005): <math xmlns="http://www.w3.org/1998/Math/MathML"> d e t M t r M \frac{det M}{tr M} </math>trMdetM
角点检测器的替代方案:
- Blob检测器
- 基于机器学习的检测器
特征描述符(Feature descriptors)
在图像中找到关键点后,我们需要一种方式来表示它们 选项包括:
- 图像块(Image patch)
- 自制的描述符(Handcrafted descriptors)
- SIFT
- GLOH
- BRIEF
- BRISK
- ORB
- 基于机器学习的描述符
- DeTone, Malisiewicz, & Rabinovich (2018)
尺度不变特征变换 SIFT(Scale-Invariant Feature Transform)
- 计算梯度,在兴趣点周围的像素网格中取直方图。
- 根据距离补丁中心的距离为梯度幅度赋权重。
- 将直方图标准化以总和为1。
实现细节:
- 补丁大小 = 16 x 16 像素
- 网格 = 4 x 4 单元格
- 直方图分箱 = 8个方向
- 从补丁中心开始的高斯加权
- 两步标准化:首先标准化使其总和为1,然后将值截断到0.2,再次标准化使其总和为1
描述符长度 = 4 x 4 x 8 = 128
兴趣点(斑点)Interest points (blobs) 在多个尺度上被检测到;描述符基于响应最大的尺度。
直方图是相对于补丁中的主要方向进行编码的。
小结
特征描述符 = 用于表示图像中的局部区域或兴趣点的代码 有许多手工制作的特征描述符,它们在以下方面各不相同:
- 编码方法
- 速度
- 描述符大小
- 特征检测方法
特征描述符的目标是不变性,以便可靠地在图像变换之间匹配点。