gpt4 book ai didi

c++ - OpenCv/C++ - 轻松从具有大数据库的图片中找到相似之处

转载 作者:可可西里 更新时间:2023-11-01 06:38:44 25 4
gpt4 key购买 nike

我想通过查询与数据库中的图片(大约 2000 张)进行比较。

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

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

帖子(最有趣):

Simple and fast method to compare images for similarity ;

Nearest neighbors in high-dimensional data? ;

How to understand Locality Sensitive Hashing? ;

Image fingerprint to compare similarity of many images ;

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

论文:

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

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

二甲双胍,

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

词汇树

聚合局部描述符

但我还是很困惑

我做的第一件事 是实现 BoW。我用 5 类训练词袋(使用 ORB 作为检测器和描述符,并使用 VLAD 特征)以测试其效率。经过长时间的训练,我启动了它。它运行良好,准确率为 94%。这很好。

但是我有一个问题:

  • 我不想做分类。在我的数据库中,我将有大约 2000 张不同的图片。我只想找到我的查询和数据库之间的最佳匹配。所以如果我有 2000 张不同的图片,如果我是合乎逻辑的,我必须将这 2000 张图片视为 2000 个不同的类别,显然这是不可能的......

首先,您同意我的看法吗?这显然不是做我想做的事情的最佳方法?也许还有另一种方法可以使用 BoW 来查找数据库中的相似性?

第二件事我做的是“更简单”。我计算查询的描述符。然后我对我的所有数据库进行了循环,我计算了每张图片的描述符,然后将每个描述符添加到一个 vector 中。

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)

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

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

所以在阅读了很多关于如何在大型数据库中找到相似性的论文后,我发现了 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() );

但是我有一些问题:

  • 循环我的所有数据库 (2000) 需要超过 5 秒,而我认为它会花费更少的 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 天以来,我无法完成该任务。我不知道我是否走错了路。也许我错过了什么。

我希望这对您来说已经足够清楚了。感谢阅读

最佳答案

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

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

    • 关键点检测 - ORB
    • 关键点描述(特征提取)-ORB
    • 量化 - VLAD(fisher 编码可能更好,但普通的旧 kmeans 可能就足够了)
    • 分类——你可能可以跳过这个阶段

    您可以将每个图像的量化结果(例如 VLAD 编码)视为其指纹。计算指纹之间的距离将产生相似性度量。您仍然必须进行 1 对所有匹配,当您的数据库足够大时,这将非常昂贵。

  2. 我没听懂你的意思。

  3. 我建议阅读 G. Hinton 关于使用深度自动编码器和卷积神经网络进行降维的论文(例如 this one)。他吹嘘自己打败了 LSH。至于工具,我建议您查看 BVLC 的 Caffe。 ,一个很棒的神经网络库。

关于c++ - OpenCv/C++ - 轻松从具有大数据库的图片中找到相似之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25183104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com