识别实用的对象实例

这是一个牛津视觉几何小组计算机视觉实用,作者安德烈亚·维达尔迪和Andrew Zisserman(2018a版)。

盖

实例级识别的目标是匹配(识别)特定对象或场景。例如,识别特定的建筑,如巴黎圣母院,或识别特定的绘画,如梵高的《星夜》。尽管比例、摄影机视点、照明条件和部分遮挡发生了变化,但仍可以识别对象。一个重要的应用是图像检索——从感兴趣对象的图像(查询)开始,搜索图像数据集以获取(或检索)包含目标对象的图像。

本课程的目标是获得实现特定对象识别的方法的基本实践经验。它包括:(i)利用SIFT特征获得两幅图像之间的稀疏匹配;(ii)使用仿射共变检测器来覆盖视点的变化;(iii)将SIFT描述符矢量量化为可视单词,以实现大规模检索;构建并使用图像检索系统来识别物体。

入门

阅读并理解要求和安装说明。此实用程序的下载链接为:

安装完成后,打开并编辑脚本练习1.m在MATLAB编辑器中。该脚本包含与本文档第一部分相关的注释代码和本练习所有步骤的描述。您可以将此代码剪切并粘贴到MATLAB窗口中以运行它,并且在进行会话时需要对其进行修改。其他文件练习2.m,练习3.m、和练习4.m第二部分、第三部分和第四部分给出。

注释:学生包只包含运行实践所需的代码。GitHub上提供了完整的包,包括预处理数据的代码。

第一部分:匹配对象实例的稀疏特征

第一阶段A:SIFT特征检测器

SIFT功能具有检测器和描述符。我们将首先计算并可视化同一物体(建筑立面)的两幅图像的SIFT特征检测。加载图像,旋转并缩放图像,然后显示原始图像和变换后的图像对:

%加载图像im1=imread('data/oxbuild_lite/all_souls_00002.jpg');%让第二个图像是第一个图像的旋转和缩放版本im3=imresize(imrotate(im1,35,‘双线性’),0.7);%显示图像子区(1,2,1);图像sc(im1);轴相等;坚持;子区(1,2,2);图像sc(im3);轴相等;

SIFT帧是一个有方向的圆,由四个参数指定:中心$t_x$、$t_y$、刻度$s$和旋转$\theta$(以弧度表示),生成四个参数$(s、\theta、t_x、t_y)$的向量。现在计算并可视化SIFT特征检测(帧):

%计算每个SIFT特征[frames1,descrs1]=getFeatures(im1,'peakThreshold',0.01);[frames3,descrs3]=getFeatures(im3,'peakThreshold',0.01);子区(1,2,1);图像sc(im1);轴相等;坚持;vl_plotframe(帧1,‘线宽’,2);子区(1,2,2);图像(im3);轴相等;坚持;vl_plotframe(帧3,‘线宽’,2);

检查第二张图像及其旋转和缩放版本,并确信检测结果与相同的场景区域重叠(即使圆圈已移动其图像位置和更改半径)。使用MATLAB放大镜工具放大较小的图像区域很有帮助。这表明检测过程随着平移、旋转和各向同性尺度的变化而变化(是协变的)。这类变换称为相似或等价。

任务:可以通过更改峰值阈值选项。较大的值将选择与图像中较高对比度结构相对应的特征。现在尝试一下:再次运行相同的代码,但增加峰值阈值两三次。

现在用一对自然图像重复这个练习。首先加载第二个:

%加载第二个图像im2=imread('数据/oxbuild_lite/all_souls_000015.jpg');

并打印图像和特征框。您应该再次看到,许多检测重叠在同一场景区域。请注意,虽然这对自然视图具有重复性,但它比综合旋转的视图要好得多。

问题:注意图像中检测密度的变化。为什么它会改变?匹配会有问题吗?如何避免?

问题:有时,会多次检测到不同方向的特征。当方向指定不明确时,可能会发生这种情况。哪种图像结构会导致方向分配不明确?

阶段I.B:SIFT特征描述符和图像之间的匹配

接下来,我们将使用在每次检测中计算的描述符来匹配图像之间的检测。我们将从最简单的匹配方案(描述符的第一个最近邻)开始,然后添加更复杂的方法来消除任何不匹配。

问题:请注意,描述符的计算范围比检测范围大得多(以蓝色显示)(以绿色显示)。为什么?

问题:请注意,存在许多不匹配。检查一些不匹配,以了解为什么会出现错误。例如,照明的变化是一个问题吗?可以应用哪些附加约束来消除不匹配?

提示:您可以使用以下方法可视化匹配的子集:

数字;plotMatches(im1,im2,frames1,frames2,matches(:,3:200:结束));

阶段I.C:使用Lowe的第二近邻检验改进SIFT匹配

Lowe引入了第二近邻(2nd NN)测试来识别并删除不明确的匹配。其思想是通过第一个到第二个NN距离之比的阈值来识别不同的匹配。在MATLAB文件中,比率为nn阈值=1NN距离/2NN距离。

问题:检查一些剩余的不匹配,以了解它们发生的原因。如何移除它们?

阶段I.D:使用几何变换改进SIFT匹配

除了第二个NN测试外,我们还可以要求匹配之间的一致性以及图像之间的几何变换。目前,我们将寻找与相似性转换一致的匹配项

它包括按$θ$旋转、按s各向同性缩放(即在所有方向上都相同)和按向量$(tx,ty)$平移。此转换由四个参数$(s,\theta,t_x,t_y)$指定,并且可以从每个图像中SIFT检测之间的单个对应关系计算得出。

任务:找出如何从单个对应关系计算此转换。

提示:回想一下阶段I.A,SIFT特征帧是一个有方向的圆,并将一个映射到另一个上。

然后可以使用受RANSAC启发的算法找到与相似性一致的匹配,该算法由函数实现几何验证:

用于几何验证的RANSAC类算法

  1. 对于每个临时通信:
    1. 计算相似变换;
    2. 使用此变换将一幅图像中的所有SIFT检测映射到另一幅图像;
    3. 接受到映射检测的阈值距离内的匹配(内嵌);
    4. 统计接受的匹配项的数量;
    5. 可选地,将更精确的仿射变换或单应性拟合到接受的匹配,并测试重新验证匹配。
  2. 选择内嵌条数最多的变换。

在此算法之后,内嵌层与转换一致,并被保留,现在应该删除大多数不匹配。

任务:由生成的图形绘图匹配支持交互式可视化几何验证。尝试将鼠标悬停在图形上,并检查相应的图像点是否在两个图像中高亮显示。

跳到第2部分在快速通道上

任务:通过改变阈值距离(编辑几何验证并更改操作公差1,操作公差2、和操作公差3参数,其中最后两个阈值与仿射变换的可选迭代拟合或内嵌单应性有关)。注意内嵌的数量和不匹配的数量。

如果需要更多匹配,则可以单独使用几何变换,而无需进行第二个NN测试。事实上,由于第一个NN可能不是正确的匹配,因此可以通过包括第1个NN、第2个NN和第3个NN等为每个SIFT描述符生成潜在(假定)匹配列表。调查正确匹配的数量(和计算时间)是如何随着潜在匹配列表的扩展而增长的,并且使用几何变换来选择内点。为此目的:

任务:更改代码以在匹配列表中包含每个功能的第一个NN、第二个NN和第三个NN……最佳匹配。任务:运行几何验证,并使用此扩展列表检查已验证匹配的数量。

提示:您可以使用MATLAB的tic和toc函数来测量代码片段的执行时间。例如

抽搐;暂停(3);总有机碳

将暂停MATLAB三秒钟,并返回大约等于3的经过时间。请参见帮助抽搐了解详细信息。

第二部分:仿射共变检测器

到目前为止,图像之间视点的变化是一种相似性变换。现在,我们考虑更严重的视点更改-例如,在一个视图中,一个对象是前向平行的,而在另一个视图中将其转向远离摄影机,如下面的涂鸦墙图像所示:

aff1aff2(aff2)aff3(aff3)

在这种情况下,图像之间存在透视缩短(各向异性缩放)和透视失真(以及平面内旋转、平移和缩放)。一幅图像中的圆不能覆盖与另一幅图像中圆相同的场景区域,但椭圆可以覆盖。仿射共变检测器被设计用于发现此类区域。

在下文中,随着视点变得越来越极端,我们将使用相似性和仿射协变检测器来比较匹配的数量。检测器为SIFT(用于相似性)和SIFT+仿射自适应(用于仿射),而描述符在这两种情况下都是SIFT。

任务:打开并检查脚本练习2.m在MATLAB编辑器中。运行脚本。

请注意,随着视点变得更加极端,验证的匹配数中的行为。请注意,匹配还可以识别图像的共同区域。

问题:平面诱导的图像之间的变换是平面单应性。检测只是仿射协变(不像平面单应性那样普遍)。那么,如何根据这些检测结果计算描述符呢?

注:有许多其他检测器变体可用于此任务。这些可以通过getFeatures.m的方法选项激活(另请参阅帮助vl视频集).

第三部分:走向大规模检索

在大规模检索中,目标是将查询图像与大型图像数据库(例如WWW或Wikipedia)相匹配。匹配的质量是通过查询和数据库图像之间经过几何验证的特征对应的数量来衡量的。虽然第一部分和第二部分中讨论的技术足以做到这一点,但实际上它们需要太多内存来存储所有数据库图像中所有检测的SIFT描述符。我们探讨了接下来的两个关键思想:一是减少内存占用和预计算描述符匹配;另一个是加快图像检索。

任务:打开并编辑脚本练习3.m在MATLAB编辑器中进行剪切和粘贴,以完成以下步骤。

阶段III.A:加速描述符与视觉单词的匹配

与第一部分和第二部分中的直接匹配特征描述符不同,描述符通常首先通过聚类技术(如K-means)映射到离散符号,也称为视觉单词。分配给同一视觉单词的描述符被认为是匹配的。下图中的每一行显示了映射到同一视觉单词的图像补丁,因此无法通过表示进行区分。

话

然后,匹配两组特征描述符(来自两幅图像)简化为查找两组符号的交集。

任务:

问题:

跳到阶段III.B快车道上

通常,多个特征引用映射到同一个视觉单词。在这种情况下matchWords(匹配词)只生成一个可能的匹配项。

任务:

阶段III.B:使用倒排索引进行搜索

虽然与视觉单词匹配比直接比较特征描述符要快得多,但直接基于几何验证匹配的数量对图像进行评分仍然需要拟合几何模型,这是一个相对较慢的操作。我们将使用近似值并计算两幅图像之间共享的视觉单词数,而不是以这种方式对数据库中的所有图像进行评分。

为此,我们计算查询图像和每个数据库图像中视觉单词的直方图。然后,可以从两个直方图的交集计算出共同的视觉单词数。

直方图交集可以看作是两个直方图之间的相似性度量。在实践中,这一措施可以通过以下几种方式加以完善:

使用反向文件索引可以非常有效地计算直方图相似性。在这个练习中,使用MATLAB内置的稀疏矩阵引擎可以非常有效地计算标准化直方图之间的内积。

现在,我们将此检索方法应用于使用牛津5k建筑图像集660个图像子集中的查询图像进行搜索。

任务:在最热门的结果中,您统计了多少错误匹配的图像?问题:为什么上面的图片得分为1?

阶段III.C:几何重建

基于直方图的检索结果很好,但远非完美。给出上一步中排名靠前的图像的简短列表,我们现在将根据几何验证步骤后的内嵌匹配数对其进行重新扫描。

问题:为什么现在的最高分数远大于1?问题:几何验证后检索结果是否有所改善?

阶段III.D:全系统

现在尝试使用整个系统检索与未查看的查询图像的匹配项。

查询

第四部分:大规模检索

在快速通道上跳过并结束

下面的图片都是绘画的细节。实践的最后一部分的目标是识别它们来自的绘画。为此,我们从维基百科中选择了1734幅绘画图像。

油漆1油漆2油漆3

要确定详细信息,您可以:

  1. 运用你的艺术知识
  2. 搜索1734张维基百科图片,直到找到匹配项
  3. 建立识别系统并自动匹配细节

我们在这里遵循路线(3)。查看并运行练习4.m这使用了第三部分中描述的技术,为1734幅维基百科图像构建索引,以便快速搜索。使用代码找出这些细节来自哪些绘画。

请注意,虽然索引存储在本地,但匹配的图像是从Wikipedia下载并显示的。点击图片,进入维基百科上的那幅画页面(从而识别它)。

任务:使用该代码在维基百科上直观搜索梵高从互联网上下载的更多绘画作品。

注:该代码支持URL代替文件名。

注意代码输出。

问题:

这就完成了这项实践。

致谢

电子逆向通信帕斯卡2

历史