GMS: Grid-based Motion Statistics for Fast, Ultra-robust Feature Correspondence

Abstract

Incorporating smoothness constraints into feature matching is known to enable ultra-robust matching. However, such formulations are both complex and slow, making them unsuitable for video applications. This paper proposes GMS (Grid-based Motion Statistics), a simple means of encapsulating motion smoothness as the statistical likelihood of a certain number of matches in a region. GMS enables translation of high match numbers into high match quality. This provides a real-time, ultra-robust correspondence system. Evaluation on videos, with low textures, blurs and wide-baselines show GMS consistently out-performs other real-time matchers and can achieve parity with more sophisticated, much slower techniques.

Publication

JiaWang Bian, Wen-Yan Lin, Yasuyuki Matsushita, Sai-Kit Yeung, Tan Dat Nguyen, Ming-Ming Cheng, GMS: Grid-based Motion Statistics for Fast, Ultra-robust Feature Correspondence, Conference on Computer Vision and Pattern Recognition (CVPR), 2017 [PDF][Project Page][Bib][C++][Youtube]

Core idea: Motion Statistics

Observation: True correspondences normally appear certain consistency in term of the motion while false correspondences do not. Hence, we predict that a true match may have many more supporting matches in its surrounding area than a false match.

 

Partionability: Assign the motion statistical value as a score for each feature correspondence, we discover that there exists very different numerical distribution between true and false correspondences in terms of such value.

 

 

Grid Framework

Grid Pattern: For fast computation, we assign the matches in the same cell with shared motion statistical value, rather than calculating motion statistics for each correspondence. With multi-cell generalization, our method also contains global information to some extent.

Rotation & Scale: The grid pattern can be rotated in 8 directions and also could be fitted with a large range of scale change by varying the size of the grid.

 

Sample Results

Wide Baseline: Qualitative wide-baseline matching results on Strecha Dense MVS datasets.

Repetitive Structure: Experiment results of our method on ZuBuD dataset.

Quantitative Evaluation

Matching Performance: Evaluation on the standard VGG and StrechaMVS datasets and the large-scale real-world TUM SLAM sequences.

Pose Estimation

Pose Estimation: Evaluation on all the datasets with the known camera poses. The success ratio and computation time are both evaluated.

Paper Errata

 

Youtube Video Demo

 

 

 

17397total visits,39visits today

35 thoughts on “GMS: Grid-based Motion Statistics for Fast, Ultra-robust Feature Correspondence

  • May 8, 2017 at 4:34 pm
    Permalink

    你好,论文中的假设2和公式2一直没有理解,你能再稍微深入的解释一下吗?非常感谢!

    Reply
    • May 10, 2017 at 3:30 pm
      Permalink

      公式2说的是。如果一个匹配是错误的,那么它就有可能匹配到右边图像中任何一个特征点,因此它到达的区域是随机的。当然落在b区域中的可能性就是m/M.这里小m是b区域中特征点的个数,M是总共特征点的个数。

      Reply
      • May 19, 2017 at 10:44 am
        Permalink

        您的这篇文章外网打不开呢。另外,CVPR2017 给与会者发了论文集么?

        Reply
        • May 19, 2017 at 12:53 pm
          Permalink

          不清楚你为什么打不开,你可以发email给我,然后我给你发过去pdf.
          什么论文集?应该没有

          Reply
          • May 19, 2017 at 6:53 pm
            Permalink

            文章已经获得了,拜读大作ing。我在网上没找到CVPR2017的accepted paper list,找到的只有accepted paper id list,想看看里面专业相关的论文。因为有的会议会给与会者发一个U盘里面会有accepted paper合集,所以就问问CVPR是否也有^_^

  • May 23, 2017 at 10:39 am
    Permalink

    老师,您好!对于您论文中的哦你公式(3)不是太理解。如果已知a,b指向同一个区域,那么这个点匹配正确的概率不是变得大一些吗?为什么这两者是独立的?

    Reply
    • May 23, 2017 at 1:38 pm
      Permalink

      我们是首先假设所有匹配之间是相互独立的,然后才有了后面的分析。

      Reply
  • May 23, 2017 at 9:02 pm
    Permalink

    您好,老师!
    拜读了您的论文和代码,简单有效啊。
    但对文中公式(14)的阈值近似不太理解,麻烦您解释指导下,非常感谢!

    Reply
    • May 23, 2017 at 9:51 pm
      Permalink

      非常抱歉,公式(14)上面一行有一处笔误。应该是 sf 而不是 sqrt(sf). 阈值这一块请参考代码,我之后会更正一下。

      Reply
      • May 24, 2017 at 10:03 am
        Permalink

        老师,
        您好!
        本人比较愚钝,还是不太理解sf近似等于sqrt(ni),还得麻烦您解释深入些,十分感谢啊!

        Reply
        • May 24, 2017 at 10:56 am
          Permalink

          sf在公式(8)中。 我们把pf(1-pf)当成一个常数提出去,所以Sf正比于sqrt(ni)。

          Reply
  • May 25, 2017 at 9:45 pm
    Permalink

    请问,你的这个gms算法可用于3d点云的特征提取和匹配吗?

    Reply
    • May 25, 2017 at 9:55 pm
      Permalink

      可以的。之前做过相应实验。

      Reply
  • June 2, 2017 at 11:13 pm
    Permalink

    Hi, thanks for your contribution, seems very cool.
    I read your code, you extract orb and match them by using brute force, then use your method to reject outliers.
    What I want to know is, in the video, how do you match the SIFT feature and reject outlier or not?

    Reply
    • June 4, 2017 at 12:24 pm
      Permalink

      It’s 2nn ratio test(0.66 as many previous works exploit), as the proposed method is an alternative to that.

      Reply
  • June 5, 2017 at 11:51 am
    Permalink

    你好~ 在我的机器上,没有跑出实时的效果,请问有可能是什么原因?
    我的机器情况如下:
    OS: Ubuntu 14.04 LTS
    CPU: Intel® Core™ i7-6700K CPU @ 4.00GHz × 8
    GPU: GeForce GTX 1080/PCIe/SSE2
    OpenCV Version: 3.2.0
    Cmake Verion: 3.4.1

    实验设置:
    输入图片: 480×720,
    跑一百次平均时间(不包括划线的时间):
    CPU 时间: 1.39s
    GPU 时间:0.21s

    多谢了~

    Reply
    • June 5, 2017 at 12:36 pm
      Permalink

      首先你要确保是RELEASE而不是DEBUG.
      另外,real time是指在视频序列上,而不是两张图片之间。(就算是两张图片也用不了这么久,2*30ms(ORB on cpu)+25(NN on GPU)+1 < 100ms)。你要确保你的opencv和cuda架构问题。 如何在视频上实时运行? 1. 视频上每次只需要计算一张图片的特征。所以ORB 30ms. 2. NN 匹配25ms可以与ORB并行。前后图片的并行。所以每一帧来的时候总时间是max(30,25) = 30ms。 3. 加上GMS的1ms总共31ms。大于30fps.

      Reply
      • June 5, 2017 at 2:39 pm
        Permalink

        多谢回复~
        我在我这边跑的时间,ORB 和NN的时间是对的,在GMS这里还有点疑问,
        gms_matcher gms(kp1,img1.size(), kp2,img2.size(), matches_all); [1]
        这一行代码的的时间为0.0003s,

        num_inliers = gms.GetInlierMask(vbInliers, false, true); [2]
        这行代码的时间为:0.1026s

        这样结果是合理的吗?

        Reply
        • June 5, 2017 at 3:03 pm
          Permalink

          你把第二个true改成false.时间还是有问题,我也查一下。

          Reply
          • June 5, 2017 at 3:45 pm
            Permalink

            要达到您网上视频里的效果,GetInlierMask的第二,第三,两个参数,都要是false吗? 输入是多大呢?

          • June 5, 2017 at 4:16 pm
            Permalink

            都是false.然后用1w个点。

      • June 6, 2017 at 5:05 pm
        Permalink

        更新,这个时间是在cmake -DCMAKE_BUILD_TYPE=Debug 的模式下测的, GetInlierMask函数的第三参数为true的情况下测的时间。
        改为 cmake -DCMAKE_BUILD_TYPE=Release ,同时GetInlierMask函数的第三参数也设为false之后,GMS的时间可以在1ms以内。

        Reply
  • June 15, 2017 at 10:37 am
    Permalink

    边老师,您好。昨晚听了您的报告,深受震撼,您的算法效果很好。小白我才刚刚接触这个部分,今天运行了您的代码,可是总是有错误,还望您指导一下,谢谢。 这里不能上传图片,我把错误信息写在下面。
    =========================分割线===============

    MEX 配置为使用 ‘Microsoft Visual C++ 2013 Professional (C)’ 以进行 C 语言编译。
    警告: MATLAB C 和 Fortran API 已更改,现可支持
    包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,
    您需要更新代码以利用
    新的 API。您可以在以下网址找到相关详细信息:
    http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。

    要选择不同的语言,请从以下选项中选择一种命令:
    mex -setup C++
    mex -setup FORTRAN
    错误使用 mex
    文件扩展名 ” 未知。
    出错 Compile (line 19)
    mex (‘MexGMS.cpp’, ‘D:/OutPutResult/GMS/include/’, IPath, LPath, lib1,
    lib2, lib3, lib4);
    出错 demo (line 4)
    Compile;

    ===================结束线======================
    我怀疑是mex()里的第二次参数路径有问题,可是自己试了几次,还是不对,不知道怎么改了。

    Reply
    • June 15, 2017 at 11:19 am
      Permalink

      注意 ‘-I../include/’。
      在你的path前要写上’-I’,中间不要加空格。如:‘-ID:/OutPutResult/GMS/include/’.

      Reply
  • June 15, 2017 at 4:23 pm
    Permalink

    这个是在我mac上跑的结果,特征点10k,参数没有改动:
    ORB took: 123.09ms
    BF took: 2613.63ms
    GMS took: 12.702 ms
    Get total 616 matches.
    Totally took: 2749.64ms
    可以看出的是BFmatch消耗了绝大部分的时间,而且比sift的时间要长很多;而且surf对于这两张狗狗好像是不match的

    Reply
    • June 15, 2017 at 10:37 pm
      Permalink

      匹配时间需要统计多次匹配取平均,细节参照之前的回复。

      Reply
  • June 20, 2017 at 4:45 pm
    Permalink

    老师,您好。最近在拜读您的论文,对于假设3不是很理解,您能稍微解释一下这个假设吗?谢谢。

    Reply
    • June 21, 2017 at 10:15 am
      Permalink

      就是说motion smoothness通常不是只存在于很小一个区域,他相连的区域也可能是连续的。

      Reply
  • July 4, 2017 at 3:06 pm
    Permalink

    边老师,你好
    我第一次用mex这个命令 不太熟悉 这个是说我缺少那几个库吗?
    =======================================================================================================
    >> Compile
    MEX 配置为使用 ‘MinGW64 Compiler (C)’ 以进行 C 语言编译。
    警告: MATLAB C 和 Fortran API 已更改,现可支持
    包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,
    您需要更新代码以利用
    新的 API。您可以在以下网址找到相关详细信息:
    http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。

    要选择不同的语言,请从以下选项中选择一种命令:
    mex -setup C++
    mex -setup FORTRAN
    错误使用 mex
    MEX 找不到使用 -l 选项指定的库 ‘opencv_core320’。
    MEX 查找具有以下名称之一的文件:
    libopencv_core320.lib
    opencv_core320.lib
    请使用 -L 选项指定此库的路径。

    出错 Compile (line 19)
    mex (‘MexGMS.cpp’, ‘-I../include/’, IPath, LPath, lib1, lib2, lib3, lib4);

    Reply
    • July 4, 2017 at 11:06 pm
      Permalink

      手动编译的话需要这几个库。如果是直接下载的opencv。只要链接opencv_world这一个库就行了

      Reply
  • July 6, 2017 at 10:39 am
    Permalink

    老师您好,我运行程序到orb->detectAndCompute()时就会报错,提示:
    Windows已在test.exe中触发一个断点。
    其原因可能是堆被损坏,这说明test.exe中或它所加载的任何DLL中有Bug。
    原因也可能是用户在test.exe具有焦点时按下了F12。
    希望老师能帮助解决一下,谢谢您~

    Reply
    • July 6, 2017 at 10:27 pm
      Permalink

      你要么重新安装一下opencv试试。这是opencv的内部函数。

      Reply
  • July 10, 2017 at 2:49 pm
    Permalink

    边老师,请问该算法对纹理很少场景匹配效果如何呢?

    Reply
    • July 11, 2017 at 8:21 am
      Permalink

      比之前的算法好很多。Video(TUM)里的那个柜子就是很严重的缺少纹理。SIFT只能匹配到很少,GMS能匹配得很稳。

      Reply

Leave a Reply

Your email address will not be published.