OpenCv / C – 从具有大型数据库的图片中轻松查找相似之处

前端之家收集整理的这篇文章主要介绍了OpenCv / C – 从具有大型数据库的图片中轻松查找相似之处前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从查询数据库中的图片(约2000)进行比较.

在本网站发帖之前,我阅读了很多关于在大型数据库中匹配图片方法文章,并阅读了stackOverflow上的很多帖子.

关于论文,有一些有趣的东西,但技术性很强,很难理解算法. (我刚开始专注于这个领域)

帖子(最有趣的):

Simple and fast method to compare images for similarity;

Nearest neighbors in high-dimensional data?;

How to understand Locality Sensitive Hashing?;

@L_502_3@;

C++/SIFT/SQL – If there a way to compare efficiently a SIFT descriptor of an image with a SIFT descriptor in a SQL database?

论文:

具有大型词汇表和快速空间匹配的对象检索,

图像相似性搜索紧凑数据结构,

LSH,

近重复图像检测min-Hash和tf-idf加权

词汇树

聚合本地描述符

但我仍然困惑.

我做的第一件事就是实施BoW.我训练了Bag of Words(使用ORB作为探测器和描述符,并使用了VLAD功能)和5级,以测试其效率.经过长时间的培训,我推出了它.它运行良好,准确率为94%.那很不错.

但是我有一个问题:

>我不想做分类.在我的数据库中,我将有大约2000张不同的图片.我只是想找到我的查询数据库之间的最佳匹配.
因此,如果我有2000张不同的图片,如果我合乎逻辑我必须考虑这些2000张图片作为2000年的不同类,显然这是不可能的……

首先,你同意我的意见吗?这显然是做我想做的最好的方法吗?
也许还有另一种方法可以使用BoW来查找数据库中的相似之处?

我做的第二件事是“更简单”.
我计算查询的描述符.然后我在我的所有数据库上做了一个循环,我计算了每个图片的描述符,然后在向量中添加了每个描述符.

std::vector<cv::Mat> all_descriptors_database;
for (i → 2000):
    cv::Mat request=cv::imread(img);
    computeKeypoints(request);
    computeDescriptors(request);
    all_descriptors_database.pushback(descriptors_of_request)@H_502_48@ 
 

最后,我有一个大向量,其中包含所有数据库的所有描述符. (所有关键点都一样)

然后,这就是我感到困惑的地方.
开始时,我想计算循环内部的匹配,也就是说,对于数据库中的每个图像,计算其描述符并与查询匹配.但是花了很多时间.

因此,在阅读了大量关于如何在大数据库中找到相似之处的论文后,我发现LSH算法似乎适合于那种搜索.

因此我想使用这种方法.
所以在我的循环中我做了类似的事情:

//Create Flann LSH index
cv::flann::Index flannIndex(all_descriptors_database.at(i),cv::flann::LshIndexParams(12,20,2),cvflann::FLANN_DIST_HAMMING);
        cv::Mat results,dists;
        int k=2; // find the 2 nearest neighbors
        // search (nearest neighbor)
        flannIndex.knnSearch(query_descriptors,results,dists,k,cv::flann::SearchParams() );@H_502_48@ 
 

不过我有一些问题:

>我花了5秒多的时间来循环我的所有数据库(2000),而我认为它需要少于1秒(在论文中,他们有大型数据库不像我,LSH更有效).我做错什么了吗 ?
>我在互联网上找到了一些实现LSH的库,如http://lshkit.sourceforge.net/http://www.mit.edu/~andoni/LSH/.那么这些库和我使用OpenCV编写的四行代码之间的区别是什么?因为我检查了库和像我这样的初学者,尝试使用它是如此困难.我有点困惑.

第三件事:

我想为每张图片做一个每个描述符的指纹(为了计算与数据库的汉明距离),但似乎不可能这样做. OpenCV / SURF How to generate a image hash / fingerprint / signature out of the descriptors?

所以从3天开始,我就完成了这项任务.我不知道我是不是错了.
也许我错过了什么.

我希望你能够清楚明白.感谢阅读

解决方法

你的问题有点大.不过,我会给你一些提示.

> Bag of Words可以工作但分类是不必要的. BoW管道通常包括

>关键点检测 – ORB
>关键点描述(特征提取) – ORB
>量化 – VLAD(渔民编码可能会更好,但在你的情况下,普通的旧kmeans可能就足够了)
>分类 – 你可能会跳过这个阶段

您可以将每个图像的量化结果(例如VLAD编码)视为其指纹.计算指纹之间的距离将产生相似性度量.仍然你必须做一个1对所有匹配,当你的数据库变得足够大时,这将是非常昂贵的.
>我没有明白你的观点.
>我建议阅读G. Hinton关于用深度自动编码器和卷积神经网络降低维数的论文(例如this one).他吹嘘LSH.至于工具,我建议你看看BVLC的Caffe,一个很棒的神经网络库.

猜你在找的C&C++相关文章