计算机视觉中兴趣点检测器和描述符的定性评估

信息处理 计算机视觉 算法 opencv 图片 软件实现
2022-01-28 01:44:43

我正在写关于兴趣点检测器和描述符的定性评估研究。我已经阅读了所有 Mikolajczyk 论文以及 Datta 等人的大部分调查。等等。现在我正在OpenCV中实现一个评估工具。我会采取图像。一种称为源图像,一种称为比较图像。

1.) 检测器:Mikolajczyk 使用可重复性标准、对应计数、匹配分数和其他指标来评估检测器的性能。我会使用可重复性和匹配区域的对应计数。

2.) 描述符:这里我将使用匹配区域上广泛使用的召回率和精度来描述描述符的性能。

到目前为止,我的问题是:这两个都是评估的好指标吗?

现在我正在尝试实现这是 OpenCV 并且需要有人来告诉我这是否可以做到。在这里,我使用 SURF-Detector 和 -Descriptor 来测试指标。Recall 和 Precision 还没有实现,但是有一个函数计算这个。

#include <opencv.hpp>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

int startSURF() {

    std::cout << "Starting " << std::endl;
    cv::Mat sourceImage = cv::imread("collection_1/DSCN5205.JPG",
            CV_LOAD_IMAGE_COLOR);
    cv::Mat comparisonImage = cv::imread("collection_1/DSCN5207.JPG",
            CV_LOAD_IMAGE_COLOR);

    if (!sourceImage.data) {
        std::cout << "Source-Image empty" << std::endl;
        return -1;
    } else if (!comparisonImage.data) {
        std::cout << "Comparison-Image empty" << std::endl;
        return -1;
    }

    //Detect keypoint with SURF
    int minHessian = 400;
    cv::Mat sourceMatchedImage, comparisonMatchedImage;
    std::vector<cv::KeyPoint> sourceKeypoints, comparisonKeypoints;

    cv::SurfFeatureDetector surfDetect(minHessian);
    surfDetect.detect(sourceImage, sourceKeypoints);
    surfDetect.detect(comparisonImage, comparisonKeypoints);

    //Calculate the SURF-Descriptor
    cv::SurfDescriptorExtractor surfExtractor;
    surfExtractor.compute(sourceImage, sourceKeypoints, sourceMatchedImage);
    surfExtractor.compute(comparisonImage, comparisonKeypoints,
            comparisonMatchedImage);

    //Flann-Matching   
    cv::FlannBasedMatcher flann;
    std::vector<cv::DMatch> matches;
    flann.match(sourceMatchedImage, comparisonMatchedImage, matches);

    //Repeatability and Correspondence-Counter    
    float repeatability;
    int corrCounter;
    cv::Mat h12;

    std::vector<cv::Point2f> srcK;
    std::vector<cv::Point2f> refK;

    for (int i = 0; i < matches.size(); i++) {
        srcK.push_back(sourceKeypoints[matches[i].queryIdx].pt);
        refK.push_back(comparisonKeypoints[matches[i].queryIdx].pt);
    }

    std::cout << "< Computing homography via RANSAC. Treshold-default is 3" << std::endl;
    h12 = cv::findHomography( srcK,refK, CV_RANSAC, 1 );

    cv::evaluateFeatureDetector(sourceImage, comparisonImage, h12,
            &sourceKeypoints, &comparisonKeypoints, repeatability, corrCounter);

    std::cout << "repeatability = " << repeatability << std::endl;
    std::cout << "correspCount = " << corrCounter << std::endl;
    std::cout << ">" << std::endl;

    std::cout << "Done. " << std::endl;
    return 0;    
}

我不确定这段代码是否有效,因为 SURF 对我的旋转近 45° 的测试图像的重复性很差(例如 0.00471577)。有人看到代码有问题吗?

有没有办法在没有 RANSAC 的情况下评估检测器?我没有找到一个尚未实现的方法。默认值 3 是一个好的阈值吗?我可以覆盖它,但问题是一个好的阈值只能由实验结果确定。但我需要为所有检测器设置一个强大的默认值。

我想我绝对需要单应性。但是我从来没有找到一种方法来为可重复性测量设置定位误差 ε。有没有办法设置ε?

很多问题。我希望我足够具体,但如果有问题请发表评论,我会尽力回答以便在这里获得帮助。祝你圣诞快乐!

[编辑] 附加读物:http ://www.robots.ox.ac.uk/~vgg/research/affine/

2个回答

实际上,阅读您的问题的次数越多,它的意义就越小。我在这里试图回答的实际上并不是你的问题,而是试图解决你推理中的问题。他们的评论太长了,他们可能会让你走上正确的道路。


让我们从检测器评估开始,并参考 Mikolajczyk 论文。

我会使用可重复性和匹配区域的对应计数。

我建议重新阅读 Mikolajczyk 论文。这种说法在论文的上下文中没有多大意义。

重复性对应计数被设计为在不涉及描述符的情况下进行评估,即不执行匹配

在计算可重复性和对应数时,Mikolajczyk会根据图像几何和特征几何(例如,仅图像中的特征位置和大小)提出可能的匹配。

这些相同的度量,但在实际匹配而不是几何估计上执行会产生不同的度量:匹配分数正确匹配的 nb

这两对措施都是评估检测器的质量而开发的(但不是描述符的描述能力)。虽然前两个度量(可重复性和对应数)与描述符(例如匹配过程)完全分离,但这使得它们的可靠性有所降低。因此,其他两个度量(匹配分数和正确匹配的数量)使用相同的描述符(SIFT)进行所有检测器比较,因此结果更可靠,但在某种程度上取决于描述符的选择。


我会拍两张照片。一种称为源图像,一种称为比较图像。
(我冒昧更正了“两图”中的“到图” ,如有错误请指正)

好吧,我希望您的意思是您将使用它作为评估数据集的子程序。仅获得一对图像之间的比较分数并不是很具有描述性。

如果您试图在上下文之外仅解释一对的分数,则无法确定导致(好的和坏的)结果的原因,虽然它可能是以下任何和所有:

  • 场景类型
  • 图像之间的任何一种转换
  • 转换的一些组合
  • 较差的图像条件(例如照明、对比度、相机质量)

就是 Miolajczyk 拥有数据集的原因。每个数据集专用于单个图像转换或改变单个图像条件。每个数据集要么是“结构化的”,要么是“纹理的”(场景的不同“类型”)——并且包含一个主要的平面。

每个数据集中的参考图像都是高质量的正面图像。每个数据集的第二个是所需类型的小变化(并表示检测器如何对此类图像上的小变换做出反应)。数据集中的更多图像表示相同类型的更严重的变换,并用于检查检测器在这种变换下的不变性。

这样做的重点是,为了对探测器质量做出良好的估计,您需要检查该探测器在改变不同条件时表现出的趋势,一次一个条件


你说两个相关的事情:

有没有办法在没有 RANSAC 的情况下评估检测器?

进而:

我想我绝对需要单应性。但是我从来没有找到一种方法来为可重复性测量设置定位误差 ε。有没有办法设置ε?

让我们首先说是的,您肯定需要单应性来计算可重复性。请注意,当我说可重复性和对应计数依赖于图像几何时——这只能使用单应性来计算。

此外,即使我说“匹配分数是在实际匹配上执行的,而不是几何估计” ——原则上这是正确的,但 Mikolajczyk 仍然使用一些几何信息来获得更相关的结果。因此,是的,您需要单应性。

对于第二部分,是的,RANSAC 是估计(相同)平面的两个图像之间的单应性的最佳方法但是,也就是说,每次在一对图像之间执行检测器评估时,您不应该只直接使用 RANSAC 估计。

我的意思是,您应该为您计划在测试中使用的每个图像对预先计算同应性获得预先计算的单应性的两种方法是:

  • 自己预先计算它们。在这种情况下,您很可能会在此步骤中使用 RANSAC。(您在 Mikolajczyk 论文中对此有一些指导)
  • 查找具有预先计算的正确单应性的数据集

最后,我所有的部分答案都是对您计划做的事情的回应:

我已经阅读了所有 Mikolajczyk 论文(...)。现在我正在 OpenCV 中实现一个评估工具。

嗯......你为什么要重新发明轮子? Mikolajczyk 制作了一个测试框架,现在仍然可以在线获得。

该框架包括:

  • 提供单应性的数据集
  • 数据集的良好描述(例如每个数据集评估什么)
  • 完成 Mikolajczyk 的所有“脏工作”的二进制文件:Mikolajczyk 论文中提到的所有区域标准化、区域重新缩放和类似的事情。如果你读过这篇论文,你应该知道它们为什么重要。
  • 一个完全实现的函数MATLAB,它将计算任何整个数据集的可重复性分数对应的数量(并且通过最小的修改,还将计算匹配分数正确匹配的数量)。

除了只使用提供的MATLAB代码,为了不重新发明轮子,但如果你想避免MATLAB,你仍然可以:

  • 调整MATLAB代码以生成数字而不是图形输出,然后以您选择的语言进一步分析数字输出
  • 使用MATLAB提供的代码作为帮助和指南来制作您自己的测试环境(因为您想产生相同/相似的功能)

回顾一下,

到目前为止,我的问题是:这两个都是评估的好指标吗?

嗯,你是做研究的人。你应该可以告诉我们。

根据我自己的个人研究,我会说Mikolajczyk 框架评估特征检测器的好框架它于 2006 年发布,但您仍然可以看到最近使用此框架的论文。它已被社区接受为首选评估框架,并且大多数社区(如果不是全部)都使用原始代码

现在,请不要因此而生气,但如果您最终要问这个问题,在我看来,您似乎没有理解您读得很好的论文。我只评论了我的回答中的“检测器评估”部分,但我希望它能让你意识到你仍然需要付出更多的努力来理解你想要使用的框架。

我的建议是重新阅读检测器和描述符评估的框架文件。可能就您不了解的内容提出具体问题(我很乐意回答有关 Mikolajczyk 框架的任何新问题)。

现在,我知道我并没有过多地谈论“探测器评估”,但如果你愿意,我也可以做一些挖掘和提醒,并写一些关于它的东西。

“这两个都是很好的评估指标吗?”

这一切都取决于您想要评估什么,即您想要使用检测器/描述符做什么,以及您拥有什么样的图像(具有重复模式?非常相似但不同的对象?内部/外部?)。

如果您想要完全相同事物的 2 张图像之间的精确对应关系,那么这些都是很好的指标(这是 Mikolajczyk 用于测试的那种图像)。例如,这些对于图像拼接和 3D 重建很有用。