• 图像检索(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)。设置一个阈值( heta),小于( heta)均认为是符合模型的内点。
    • 在迭代中,如果有(I_k > I_j,k > j),则进行Local Optimization的操作。
    • Local Optimization 有多种方法,常用的是 Inner RANSAC,也就是只从选择符合当前最好模型的内点进行下一次迭代的,并且设置的阈值为(Kcdot heta),在每次的迭代的时候减小阈值,直到阈值减小为( heta)

    更多关于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)个图像
      • 扩展查询
      • 最终的返回结果
  • 相关阅读:
    MFC project for a non-Unicode character set is deprecated
    关于Visual Studio 2013 编译 multi-byte character set MFC程序出现 MSB8031 错误的解决办法
    字符串比较自实现
    各种语言里获取当前模块的方法:ABAP,ABSL,C,nodejs
    SAP CRM product attachment的document template功能
    ABAP, UI5和webpack的处理入口
    ABAP, Maven, CF App和Webpack的build
    json格式的字符串序列化和反序列化的一些高级用法
    SAP ABAP Netweaver容器化, 不可能完成的任务吗?
    UI Component in CRM WebUI and Hybris
  • 原文地址:https://www.cnblogs.com/wangguchangqing/p/10131946.html
Copyright © 2020-2023  润新知