十来天没上来写东西了,在实践试错的过程中,有太多东西没来得及总结,忙着填BoW的坑,忙着投简历(工作碗里来)。尽管这样,还是抽了点空把这十来天自己在完善Bag of Words cpp实现(stable version 0.01)重排过程中做的一些东西总结一下,希望也能对后来者有些许帮助,好了进入正题。


一般在词袋模型中,为了提高检索的精度,你可以通过很多的trick来提高其精度(mAP),其中一个广泛使用的技巧就是对返回的图像进行重排,重排有很多种方法,比如对多特征在分数层(决策层)进行融合也是一种重排方式,不过这里要做的是通过剔除查询图像与候选图像错配点对的方式进行重排,剔除错配点一般采用的是RANSAC算法,关于RANSAC原理可以阅读RANSAC算法做直线拟合这篇文章,或者采用类RANSAC算法。作为初级阶段的实践,这里从两幅图像的匹配逐步深入。

代码下载:下面贴图的结果的代码都可以sift(asift)-match-with-ransac-cpp下载。

1NN匹配

“1NN匹配”(勿wiki,自创的一个词汇),讲起来比较顺口,而且从字面也应该可以猜测出点意思来,所以就这么写在这里了。所谓的“1NN”匹配,即是对于图像im1中的某个SIFT特征点point1,通过在im2图像上所有SIFT关键点查找到与point1最近的SIFT关键点,重复这个过程,即可得到图像im1中所有的特征点在im2中的匹配点(最近邻,1NN)。这种匹配方法,会出现很多的错配点,下面是采用1NN匹配的结果:从上图可以看到,1NN匹配的方法出现了很多的错配点,而这些错配点对无论是对图像检索中的重排,还是图像拼接等,都是不希望看到的,所以得进一步对其中的错配点对进行剔除,下面采用“1NN/2NN<0.8”的方法进行错配点对剔除。

1NN/2NN<0.8

"1NN/2NN<0.8",不要诧异你未见过这样一种说法,没错,自己瞎创的一种表述。对上面1NN方法理解了,这个水到渠成。所谓“1NN/2NN<0.8”,即对于图像im1中的某个SIFT特征点point1,通过在im2图像上所有SIFT关键点查找到与point1最近的SIFT关键点point21(记该关键点point21到point1的距离为dis1)和次近的关键点point22(记该关键点point22到point1的距离为dis2),如果dis1/dis2<0.8,则我们将其视为正确匹配的点对,否则则为错配的点对予以剔除。这种寻找匹配的方法,由Lowe在其Distinctive image features from scale-invariant keypoints中有说明,当然,0.8这个阈值是可以调整的,不过一般都采用0.8。下面是采用该方法进行匹配后的结果:可以看到,经过该方法匹配后,相比与“1NN”匹配方法,相比于“1NN”,这种方法进行匹配时有了很大的改善,不过正配点相比与1NN有部分损失。下面再探讨用RANSAC方法对这两种情况进行错配点剔除。

1NN+RANSAC

回到前面的“1NN”匹配的点对,我们再采用RANSAC方法对其进行错配点剔除,RANSAC方法的原理前面已有相关文章RANSAC算法做直线拟合,这里不再重复,相关的代码请看utils.cppfindInliers函数,调用的是OpenCV中的cv::findFundamentalMat函数计算其变换矩阵,下面是“1NN”经过RANSAC剔除错配点对的结果:可以看到,经过RANSAC后,“1NN”中的很多错配点对差不多剔除得比较好了,不过还有错配的点对没有剔除掉,图中用红色矩形框标出了未剔除的错配点对。我们在来看看对“1NN/2NN<0.8”进行RANSAC后会是怎样的结果呢?

1NN/2NN<0.8+RANSAC

在看匹配结果前,我们可以先做一个大概的预测,因为“1NN/2NN<0.8”得到的很多点就是正确匹配的点对,所以将其放入RANSAC中后,能够得到很好的拟合模型,所以其剔除错配点对效果也应该更好。为了验证这一预测,我们看一下“1NN/2NN<0.8+RANSAC”具体的效果,如下图所示:可以看到,已经完全没有错配点了,从这一点来说,其效果是非常好的。不过,从正配点对数目来看,“1NN+RANSAC”的结果更密集,也就是说“1NN+RANSAC”包含了更多的正配点对,“1NN/2NN<0.8+RANSAC”正配点对要稍微少些。在大多数情况下,我们会选择完全剔除了错配点对的模型。


上面分别介绍了两种匹配方法,分别是“1NN”和“1NN/2NN<0.8”匹配方法,以及对它们采用RANSAC剔除错配点对的方法。有时候,如果要求经过RANSAC匹配后保留更多的正配点对,这时候,我们可以采用Affine-SIFT,简称ASIFT,具体可以阅读ASIFT: An Algorithm for Fully Affine Invariant Comparison这篇文章,作者提供了ASIFT的C++代码和匹配算法,可以在ASIFT下载得到,我大概跑了一下里面的demo,相比与SIFT,ASIFT可以提取到很多的关键点,对旋转等变换具有更好的不变性,不过缺点也很明显,速度实在太慢,很难做到实时,所以要使用的话,一般应用在对实时性不做要求的场合。我那个代码里有OpenCV的实现,你也可以试一下其效果,该OpenCV代码实现来源于OPENCV ASIFT C++ IMPLEMENTATION,OpenCV自带其Python实现,使用比较方便,就是速度太慢,所以自己在图像检索在写的项目中,也不打算用它了。

对于怎么将上面介绍的这些匹配方法应用到图像检索重排中,后面会再做整理介绍,今天就到这里了,明天阿里笔试,亚历山大。

from: http://yongyuan.name/blog/SIFT(ASIFT)-Matching-with-RANSAC.html

SIFT(ASIFT) Matching with RANSAC相关推荐

  1. 【OpenCV-图像处理】用sift特征点算法和ransac算法进行多幅图像的拼接

    最近我玩samsung手机的时候发现很多有拍照功能的软件里面都嵌着对多幅图像进行拼接成一幅图像的功能. 玩着玩着有了灵感...这也是好事,因为最近搞了毕设,毕设内容要涉及到sift特征提取和ransa ...

  2. RobHess的SIFT代码解析之RANSAC

    平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码:SIFT+KD ...

  3. OpenCV 4.5发布!更强的SIFT,OCR,RANSAC算法,新增目标跟踪网络SiamRPN++

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 OpenCV 4.5版本发布了! 详情:https://github.com/opencv/openc ...

  4. 利用SIFt特征点和RANSAC方法进行物体识别(利用openCV和vs2010实现)

    最近在学习物体识别方面的东西.在特征点的提取领域,SIFT特征点是非常经典的一个特征点提取算法.RANSAC算法,是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法. ...

  5. 【OPENCV】图像拼接(python)-基于SIFT特征点和RANSAC方法

    简单的图像拼接为将两幅图像简单的拼接在一起,不考虑图像内容,仅仅是图像几何空间的转移与合成. 复杂的图像拼接也叫作基于特征匹配的图像拼接,考虑图像内容,拼接时消去两幅图像相同的部分,实现拼接合成全景图 ...

  6. 图像检索(CBIR)三剑客之BoF、VLAD、FV

    开始整理这两三年自己在image retrieval的一些资料,方便来年的毕业设计.下面是一份图像检索实验的清单,包含的都是自己实验的结果,随时保持在github上的image-retrieval同步 ...

  7. (三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接

    目录 一.sift特征检测概述 1.1特征点 1.2sift特征检测 二.sift特征提取与匹配 2.1特征提取并展示 2.2对两张图片进行特征匹配计算 2.3给定一张图片,输出与其匹配最多的三张图片 ...

  8. Learning-based feature matching and pose estimation

    基于深度学习的特征匹配与位姿估计 1. Learning-based feature matching(基于深度学习的特征匹配(可直接应用于SFM.SLAM.视觉定位)) 1.1. Motivatio ...

  9. Reproducible Research in Computational Science

    Reproducible Research in Computational Science from: http://www.csee.wvu.edu/~xinl/source.html " ...

最新文章

  1. swift iOS8 XIB 问题 ViewController.init() xib
  2. 我的网盘(云存储)功能需求,免费网盘需求,争取早日和百度网盘说拜拜
  3. RL之DQN:基于TF训练DQN模型玩“打砖块”游戏
  4. Freemarker介绍
  5. TCP发送接口(如send(),write()等)的返回值与成功发送到接收端的数据量无直接关系
  6. Windows 10系统永久关闭Windows Defender Antivirus防病毒程序方法
  7. 深入浅出InfoPath——让管理员来部署InfoPath表单
  8. mysql+php+模板+条目_PHP.MVC的模板标签系统(四)
  9. HBase的Row Key设计
  10. ALAsset 循环获取图片(Assets Library Framework)
  11. bzoj 2428: [HAOI2006]均分数据
  12. c语言11章谭浩强,谭浩强 C语言 第11章 结构体.ppt
  13. VolTE注册流程0001 融合HLR HSS
  14. 无人驾驶技术——无损卡尔曼滤波(UKF)
  15. ICLR2020 || 106篇深度强化学习顶会论文汇总
  16. 无法与域“xxxx.com”的Active Directory域控制器(AD DC)连接 之DNS故障
  17. 计算机打印共享应该怎么设置,打印机共享设置,告诉你打印机共享怎么设置
  18. XP下超级终端的使用
  19. ES学习笔记(二):集群配置与启动 --mac环境
  20. 我们的老照片 CSDN郑州俱乐部活动纪念

热门文章

  1. 北京迎“豪宅元年”:四环房价将迈入8万元时代
  2. 并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍
  3. SSM-Spring+SpringMVC+MyBatis整合案例从0到1
  4. Python 中文编码
  5. AS主题+配置备份+Logcat颜色配置
  6. docker 配置加速器
  7. python3 设置默认编码_Python3的字符编码乱码问题解决思路
  8. 动手实现Kotlin协程同步切换线程,以及Kotlin协程是如何实现线程切换的
  9. 大众EA211djs和css的区别,宣传上却说捷达VS5用的发动机是EA211,但这款车的参数配置栏发动机型号写的却是DJS,谁能为我解惑吗?(只有斯柯达的柯米克的发动机型号写得才是EA211)...
  10. linux pip已经安装,提示/usr/bin/pip: No such file or directory