- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想通过查询与数据库中的图片(大约 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 ;
论文:
具有大词汇量和快速空间匹配的对象检索,
使用紧凑数据结构的图像相似性搜索,
二甲双胍,
近乎重复的图像检测 min-Hash 和 tf-idf 加权
词汇树
聚合局部描述符
但我还是很困惑。
我做的第一件事 是实现 BoW。我用 5 类训练词袋(使用 ORB 作为检测器和描述符,并使用 VLAD 特征)以测试其效率。经过长时间的训练,我启动了它。它运行良好,准确率为 94%。这很好。
但是我有一个问题:
首先,您同意我的看法吗?这显然不是做我想做的事情的最佳方法?也许还有另一种方法可以使用 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 天以来,我无法完成该任务。我不知道我是否走错了路。也许我错过了什么。
我希望这对您来说已经足够清楚了。感谢阅读
最佳答案
你的问题有点大。不过,我会给你一些提示。
Bag of Words 可以工作,但分类是不必要的。 BoW 管道通常包括:
您可以将每个图像的量化结果(例如 VLAD 编码)视为其指纹。计算指纹之间的距离将产生相似性度量。您仍然必须进行 1 对所有匹配,当您的数据库足够大时,这将非常昂贵。
我没听懂你的意思。
我建议阅读 G. Hinton 关于使用深度自动编码器和卷积神经网络进行降维的论文(例如 this one)。他吹嘘自己打败了 LSH。至于工具,我建议您查看 BVLC 的 Caffe。 ,一个很棒的神经网络库。
关于c++ - OpenCv/C++ - 轻松从具有大数据库的图片中找到相似之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25183104/
我尝试将resteasy与自定义对象一起使用,当我创建jar文件时,它与intellij IDE一起工作正常,但失败并出现以下异常 org.jboss.resteasy.core.NoMessageB
我正在寻找一种在easy-close选项为TRUE时基于Shiny模态关闭触发事件的方法(因此,在模态外部单击将其关闭)。由于没有链接到模式的ID,因此我似乎无法捕获此事件。我尝试在“观察”事件中包装
假设我有一些定义如下的类: class Security { Boolean AuthenticateUser(String username, String password); B
正如标题所说,Coq 可以用作模型检查器吗?我可以将模型检查与 Coq 证明混合使用吗?这是常态吗?谷歌谈论“微积分”,有没有人有这方面的经验或类似的经验?是否建议以这种方式使用 Coq,或者我应该寻
是否有一种方法(设置或快捷方式)可以显示输出超过 500 行的查询的总行数 - 即,无需修改首选项中的“结果集页面大小”值?我本质上是在寻找 select count(*) from () t 的输出
我想这样做: System.out.println("안녕하세요!"); 但是当我尝试在 Eclipse 中进行编译时,出现“某些字符无法使用 MacRoman 字符编码进行编码”弹出式错误消息。我正
如果我有一个用这样的字符串初始化的框架 setter CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(at
所以这里没有什么新内容,我只是想得到一些澄清,但似乎在其他帖子中找不到任何澄清。 我正在安静地创建一个新资源,例如: /books (POST) 有一个 body : { title: 'The
我有很多预处理器宏定义,如下所示: #define FOO 1 #define BAR 2 #define BAZ 3 在实际应用中,每个定义对应一个解释器虚拟机中的一条指令。宏的编号也不是连续的,以
使用 SpriteKit 开发 iOS 游戏。我的背景由 map block 组成(本质上是无限 map ,程序生成)。 我们的系统旨在管理 map 的“ block ”,我们只加载玩家附近的 blo
我需要在 Ruby 中拆分一个具有以下格式的字符串: [{a:1,b:2,c:3,d:4},{a:5,b:6,c:7,d:8},{a:9,b:10,c:11,d:12},{a:13,b:14,c:1
Linq 有一个名为 Take() 的便捷运算符方法,可以返回任何实现 IEnumerable 的元素中给定数量的元素。 jQuery 中是否有类似的东西可以处理数组? 或者,换个方式问:如何在 Ja
每当我使用以下代码在文档中插入图像时, var cursor = DocumentApp.getActiveDocument().getCursor(); var image = cursor
今天看到这样一段代码: if ( not defined($reply_address) or not defined($from_name) or not defined(
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
刚刚了解 mercurial 的 --style和 --template可用于 hg log 的选项和 hg tip我发现它们非常有帮助,但我不知道把我的“样式文件”放在哪里 我有一个“样式文件”,它
是否有一些应用程序可以自动 bundle (并缩小)包含 require('file.js') 调用的 JS 项目?这样它们就会合并并生成一个文件。 具体来说,我正在谈论when.js ,一个带有大量
如何(轻松)获取 Sublime Text 3 中的当前文件路径 我不经常使用 ST 控制台(我只使用它一次来安装包管理器),但我认为这可能是一个好方法: 像某种pwd命令一样获取当前文件路径。 但这
嗨,我正在使用resteasy api,我需要使用Map作为QueryParam。我可以使用列表作为 QueryParam,但是当我尝试传递 Map 时,我收到下面提到的错误。 这是我的服务代码 @G
假设我有一个 C++ 代码(请参阅下面的简单示例)。我想让期刊审稿人轻松安装/运行 所以我认为最简单的方法是将其变形为简化的类 R 包的 tar.gz 文件,以便裁判可以安装它通过简单地调用 inst
我是一名优秀的程序员,十分优秀!