基于梯度方向的模板匹配加速

参考链接:
知乎:没趣啊大神
作者:没趣啊
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码见:
meiqua/shape_based_matching

2020.05.27:

梯度响应图——针对无纹理目标的检测(论文翻译)

2020.05.05:

之前看issue里希望实现fusion来加速的朋友还蛮多的,于是最近参考Halide的思想简单实现了个tile-based fusion,整个有差不多6倍的加速。

参考链接:

  • fusion implementation(shape_based_matching/issues/77)

代码见:

  • shape_based_matching/tree/fusion_by_hand

2019.05.03:

目前大部分时间都耗在opencv求边缘方向上了,100万像素需要60ms。研究了下opencv的filter,里面用到的加速技术有separable filter,SIMD,没有多线程,也没有kernel fusion(blur sobel phase大部分操作都能fuse起来),所以理论上估计还能加速一个数量级,也许之后有时间会写下。

说到这里想起了之前看15418 Parallel Computing , DSL 一章里介绍的halide,深入了解了下,确实非常厉害,就算不用它参考一下思路也很有帮助:

  • halide加速(youtube视频)

2019.4.26

halcon在youtube上的介绍视频:

  • introduction(youtube视频)
  • tune params(youtube视频)
  • 直观理解适用范围(youtube视频)

2018.11.23:

halcon是真的厉害,自己慢慢踩2/3D匹配的坑总结出来的心得,今天发现早就在halcon手册里有了:
基于梯度方向的模板匹配加速_第1张图片

  • 上图翻译
  • match solution guide
  • halcon Documentation

近刚好在写稳定匹配形状的算法。之前自己写了个聚类提边缘+边缘链提直线+直线组合的算法,后来发现图像里形状不完全对应理论形状的时候还是不行。

然后我想到这种需求一些机器视觉商业库肯定专门研究过,看了看halcon工程师写的机器视觉算法与应用里shape-based matching的原理,结果发现跟我之前研究过的linemod一模一样。shape-based matching给我最大的启发是只用梯度方向,也就是说不管你用什么花样的算法,当你开始提边缘时你就输了。这是因为边缘和梯度方向虽然都不易被干扰,但一个边缘只有有无边缘1bit的信息量,一旦提多了很难找出想要的形状;而梯度方向信息量会多很多,多提一些再筛选能同时保证召回率(recall)跟准确率(precision),可以说是相当靠谱的。

linemod正是这样,简单来说就是选几十个点的梯度方向拿去在图像中进行方向的模板匹配,经过一系列奇巧淫技加速,最终100万像素处理图像耗时60ms,匹配360个模版才7ms。由于只用到了梯度方向,稳定性有保障;再加上速度这么快,各个角度尺度的模版都能直接上了。

linemod在opencv里有源码,不过有一个最大的限制是特征点最多63个,因为用了8位SSE。我改了改源码,现在最多能到8192个,常规大小的形状应该都够了。最后在我的项目里测试结果还不错,不过因为保密的需要不能贴图,这里贴几个处理题主图像的吧:

测试图像,padding成1024长宽
基于梯度方向的模板匹配加速_第2张图片
匹配上的模版的128个点,可以看到linemod选点选的很均匀,很合理。当然,训练模版的图像最好选个没什么噪声的或自己画个理想的,要不然容易把一些噪声选进去。
基于梯度方向的模板匹配加速_第3张图片
最后匹配结果是转了20度。这个例子看不出来linemod,或者说shape based matching的强大功能。你可以找点其他的例子测试下。

代码见:

  • meiqua/shape_based_matching
    基于梯度方向的模板匹配加速_第4张图片
    最近要移植到arm的嵌入板子上,原来的SIMD 限定成SSE只能x86,改了改后现在也支持arm neon了。

最近3d的cuda icp写的差不多了,移植到2D做shape based matching的refine,最后效果果然不错。

  • icp2D branch, 0.1-0.5 degree(shape_based_matching/tree/icp2D)
  • icp2D + subpixel edge, < 0.1 degree(shape_based_matching/tree/subpixel)

你可能感兴趣的:(#,识别算法(软件))