sift特征匹配若干问题

最近学习了在kd-tree中使用Best Bin First Search的方法进行高效ANN求解的算法源码,发现程序中加入优先队列中的结点key值通常为负值,囧~原来程序中有一个很隐蔽的宏定义错误(utils.h) #define ABS(x)  ( (x<0) )? -x : x),乍看之下不容易发现错误,难过mayers推荐用内联函数代替通常的宏定义,宏定义是代码替换而非函数调用,内联函数稍有不同,它会把函数参数看做一个整体(更有整体上的语义)而宏定义只是按照指定的形式进行替换。 就是这个宏定义在 -x中缺少一个括号,这样当x是一个减法式子时真正的效果是直接在第一项前面加上了负号,自然是一个比较小的负值,但这与kd-tree搜索的当前维度距离最近意义大相径庭;实质效果相当于只是在kd-tree中正确搜索了每次划分的右半空间(完全错误,右半空间应该是完全错误的,因为左半都是负值,在优先队列中一直处于前面的项,会使得右半空间的叶子节点得不到搜索),左半空间并非安装距离意义搜索的..两个值越大越好而非越接近越好,因为这样能得到一个更小的负值。

 

        因此怀疑Bundler中带的keymatchful.exe可执行文件也是有问题的,因为没有源码可以查看,所以使用kermit中的数据进行验证,sift特征提取部分的结果完全相同,但是有没有修正这个宏定义bug,匹配结果要比其少,35   -》47|48,觉得匹配算法本身流程应该不会有什么区别,可能是筛选NN和 2nd NN的阈值取得不同,将其取更小的值会提高算法的鲁棒性(我这份源码和论文中都是0.49),因为好奇,这里得到的匹配结果要比bundle自带的可执行文件中要多,详细检验了每个匹配,发现修正前 修正后无匹配率相当,都比较高,kermit中有一部分红蓝相间的条格,是典型的重复纹理,修正后的无匹配几乎全部集中在这块区域,而修正前有一些区分度很大区域的无匹配, 只是在这个测试集整体的效果相当了,于是有些怀疑sift算法对重复纹理匹配的性能,我测试了一下对同一张图片提取的特征向量进行匹配,459个特征有439个正确匹配,明显说明限制200个叶子节点的贪心搜索是完全合理的,遗漏的20个节点还有一部分是因为存在特征与正确匹配很相近,区分度不明显为提高匹配算法的真阳率就直接剔除了(唯一的疑惑是会不会肉眼看到的误差很大,之间关联的问题是很接近的特征描述向量是不是在图像空间上相邻?对sift特征描述向量一直是比较感性,其中到底描述什么信息?似乎并非局部的色彩信息,因为重复纹理中的无匹配很多是在不同颜色的条带之间得到的匹配,这种错误甚至可以用简单的窗口求ncc值验证,说明特征向量与我们肉眼看到的感官信息并无太大关联,而是反映了像素值在函数空间中的一种分布信息,而这种信息在各种变换下能保持较好的稳定性)

 

      接下来的问题是,减小筛选阈值会不会很好的限制误匹配,结果是肯定的,阈值0.49->0.19,错误率从18/47->2/17,真阳率大大提高..变为0.09时为 0/8;

(这里修复bug前取0.19对应的结果为2/15,一般影响匹配的结果数,对真阳率影响相对较小,没有搜索到最相近的导致被阈值剔除掉了)

 

       最后对于未修正不过前的同一图片向量进行匹配(如果匹配率也很高的话那么BBF的贪心思想也就毫无意义的,一种没有太多规律可循的搜索都能达到很高的效率),不幸的是,测试结果确实如此,但是似乎我们忽略了一个很重要的事实,在kermit数据中特征向量数目比较小400+,都是按照默认搜索200个叶子节点,差不多搜索了一般的数据,就算是随机搜索效果也差不到哪里去..于是将200改成20测试了一把,结果也一样,最后改成2一样,真是傻到无语,两张完全相同的图片特征向量完全相同,第一个搜到的叶子节点就是沿着相同路径追随到的叶子节点,两个值完全相同,这里就失去了贪心中原最可能的路径的意义。

     换回不同的图片进行匹配,将200改成20,误匹配率为7/20 与9/20(只查看前面20个匹配,而不是只有20个匹配),还是能说明BBF的合理性

你可能感兴趣的:(sift特征匹配若干问题)