图像检索(7):取得更好的检索结果
在前面实现的检索中,根据图像编码后向量(VLAD)的相似性,从图像库中检索出,与查询图像VLAD向量最相似的图像。由于实际场景图像的复杂性,仅仅利用VLAD向量的相似并不能取得很好的精度,通常先利用VLAD向量从图像库中快速的检索出最相似的\(K\)幅图像,然后再进一步筛选。
在实际场景中进行图像检索,通常会遇到以下问题:
尺度,视角,光照以及部分遮挡,本文将介绍几种常见的优化方法,尽可能在这些复杂条件的影响下,检索出最相似的图像。
- 空间重排
- 几何验证
- 扩展查询
空间重排
主要是为了排除查询图像中背景部分的干扰,找到包含查询目标的区域。这里使用的方法通常可以使用目标检测方法中的第一步:区域建议方法(Proposal Region),尽可能的将图像中的不同区域分割出来。
-
滑动窗口法,穷举法。简单的使用使用不同尺寸和不同长宽比的窗口滑过窗口,每个窗口区域作为一个单独的查询。窗口的比例和尺寸比较难以确定,如果产生的窗口过多,会影响查询的速度。这也是最初目标检测中使用的方法,不推荐使用。
-
Selective Search 选择性搜索,将区域的颜色,纹理,尺寸以及交叠相似度组合到一起,以此为标准将图像划分为多个子区域。OpenCV中有该方法的实现,但是比较耗时。
-
EdgeBoxes 也是一种区域建议方法,首先利用结构化的方法检测出边缘,并利用非极大值抑制对边缘进行筛选;然后基于某种策略将似乎在一条直线上的边缘点集合成若干个edge group,并计算edge group之间的相似度,越是在同一直线上的edge group,其相似度越高。再通过edge group来确定轮廓数,实现策略为给每个edge group计算一个权值,将权值为1的edge group归为proposal内轮廓上的一部分,将权值为 0 的edge group归为proposal外或proposal框重叠的一部分,由此便提取得到proposal,并对proposal进行评分,选取得分最高的proposal作为最后的检测输出。 该方法效果上比Selective Search差点,但是速度上比较快。
-
可以使用目标检测中的Regional Proposal Net网络提取图像的各个区域。
使用上述的方法,将查询图像分成不同的子区域,将每个子区域作为一个查询,进行检索。这种方法虽然能在很大的程度上提高检索的精度,但是最好的方法还是能够确定检索的区域。 例如:假如是手机拍摄的查询,可以和扫描二维类似,将查询的目标放在固定的窗口中,这样可以大大的提高检索的精度。
空间验证 Spatial Verification
基于词袋模型(BoW)的图像检索,是将图像表示为视觉词汇的向量(视觉词汇,visual word通过图像的局部特征聚类得到)。在进行图像相似检索时,实际是检索具有相同视觉词汇的图像,由于视觉词汇是通过局部特征聚类得到的,丢失了图像的空间特征,仅仅使用视觉词汇来判断图像的相似性,会产生下面的问题:
有可能两图像中提取到的visual word比较相似,而两图像空间信息却不相同,如下图:
左边的是两幅图像下的正确匹配,右边的则是提取到的Visual World比较相似,却不是相似的图像。
空间验证 Spatial Verification就用来过滤掉上面的,仅仅是视觉词汇比较相似,但是空间信息却不具备相似性的检索结果。上面检索,过滤掉错误的匹配后结果:
空间验证的方法
使用BoW,两幅图像的匹配,通常是Visual Word的匹配,相匹配的特征点是通过视觉词汇取得的,例如:查询图像\(q\)的某个特征\(q_1\)映射到视觉词汇\(vw_1\)上,而检索出来的图像\(p\)的某个特征\(p_1\)也映射到\(vw_1\)上,这样就认为特征点\(p_1\)和\(q_1\)是匹配的。显然,这样的匹配方法会有很多的错误的匹配,空间验证就是为了过滤掉这种错误的匹配。
空间验证,简单来说就是对两幅图像的特征点进行匹配,并且过滤掉错误的匹配点。 就到了图像的经典问题了,图像特征的匹配及优化。
图像特征点的匹配和优化,常用的有以下方法:
- 交叉过滤,如果第一幅图像的一个特征点和第二幅图像的一个特征点相匹配,则进行一个相反的检查,即将第二幅图像上的特征点与第一幅图像上相应特征点进行匹配,如果匹配成功,则认为这对匹配是正确的。
- 比率测试,对每个匹配返回两个最近邻描述符,仅当第一个匹配与第二个匹配之间的距离足够小时,才认为这是一个匹配
- 基于对极约束的RANSAC方法,通过求两图像的基础矩阵或者单应矩阵,来剔除错误的匹配。
上述的几种特征匹配优化方法,可以参看之前的文章 OpenCV2:特征匹配及其优化
上述的几种方法中,基于RANSAC的方法做匹配优化的效果应该是最好的,但是RANSAC是一种迭代算法在性能上不占优势的。毕竟做图像检索的并发量是很高的。假如每次对\(K = 20,50,100\)甚至更多张图像进行空间验证的话,对特征点的匹配和剔除就提出了很高的性能要求。
Chum在论文Total Recall: Automatic Query Expansion with a Generative Feature Model for Object Retrieval
提出使用Locally Optimized RANSAC(LO-RANSAC)的方法,其原理也比较简单。
- 从数据集中随机的选择能够估计出模型参数的最小个数的数据集\(S_m\)
- 估计模型参数(匹配,两图像的单应矩阵)
- 计算符合估计模型的内点个数\(I_k\)。设置一个阈值\(\theta\),小于\(\theta\)均认为是符合模型的内点。
- 在迭代中,如果有\(I_k > I_j,k > j\),则进行Local Optimization的操作。
- Local Optimization 有多种方法,常用的是 Inner RANSAC,也就是只从选择符合当前最好模型的内点进行下一次迭代的,并且设置的阈值为\(K\cdot \theta\),在每次的迭代的时候减小阈值,直到阈值减小为\(\theta\)。
更多关于LO-RANSAC的内容,可以参考论文
可以在 LO-RANSAC codes 找到其实现。
进行空间验证,基本能解决图像因为Sacle,Viewpoint或者Oculusion引起的目标的变化。 但是对于一些弱光照引起的变化,空间验证则无能为力了。这就要应用到扩展查询。
扩展查询 Query Expansion
对于弱光照引起的变化,如
最右边的图,由于光照比较弱,即使利用了空间验证,仍然难以检索出来,可以使用扩展查询。
扩展查询的方法有很多,简单有效的就是均值扩展查询(Average Query Expansion,AQE)
- 初始检索,选择Top N。 距离为准
- 空间验证,选择Top K。匹配点的个数为准
- 将空间验证后的Top K个的图像编码的做均值,作为新的查询。
总结
BoW的图像检索基本完成了,做个总结。
基于局部特征的图像检索,分为两个部分: 训练和检索
-
训练
- 提取图像库中所有图像的局部特征(SIFT)
- 对提取图像的所有特征进行聚类,得到\(K\)个聚类中心,也就是视觉词汇表Vocabulary,每个聚类中心是一个Visual word.
- 将每个图像表示为VLAD向量,所有图像的VLAD向量的集合,就是用于检索的特征库。
-
检索
- 区域建议 Proposal region,从检索图像中分割中检索目标坐在的区域\(R\)。
- 从检索的特征库中,找出和\(R\)最相似的Top\(K\)个图像
- 进行空间验证,选择和\(R\)匹配最好的Top \(N\)个图像
- 扩展查询
- 最终的返回结果