我目前正在扩展一个用于对图像进行分类的图像库,我想查找重复的图像、转换后的图像以及包含其他图像或包含在其他图像中的图像。
我已经测试了 OpenCV 的 SIFT 实现,它工作得很好,但对于多个图像来说会相当慢。太快了,我想我可以提取特征并将它们保存在数据库中,因为许多其他与图像相关的元数据已经保存在那里。
将新图像的特征与数据库中的特征进行比较的最快方法是什么?
通常比较是使用 kd 树、FLANN 或使用金字塔匹配内核 http://userweb.cs.utexas.edu/~grauman/research/projects/pmk/pmk_projectpage.htm我在 SO 的另一个线程中找到了它,但还没有深入研究。
由于我不知道如何有效地在数据库中保存和搜索 kd 树,因此我目前只看到三个选项:
* 让 MySQL 计算到数据库中每个特征的欧氏距离,尽管我确信对于多个图像来说这将花费不合理的时间。
* 首先将整个数据集加载到内存中并构建 kd 树。这可能会很快,但非常占用内存。另外,所有数据都需要从数据库传输。
* 将生成的树保存到数据库中并加载所有树,这将是最快的方法,但也会产生大量流量,因为新图像必须重建 kd 树并将其发送到服务器。
我正在使用 OpenCV 的 SIFT 实现,但我并不死心塌地。如果有一个更适合此任务的特征提取器(并且大致同样强大),我很高兴有人能推荐一个。
所以几年前我基本上做了一些与此非常相似的事情。您想要研究的算法是几年前由 David Nister 提出的,论文是:“Scalable Recognition with a Vocabulary Tree”。他们几乎对您的问题有一个精确的解决方案,可以扩展到数百万张图像。
这是摘要的链接,您可以通过谷歌搜索标题找到下载链接。http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=1641018 http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=1641018
基本思想是使用分层 k 均值算法构建一棵树来对特征进行建模,然后利用该树中特征的稀疏分布来快速找到最近的邻居......或者类似的东西,已经有几年了我努力了。您可以在作者的网页上找到 Powerpoint 演示文稿:http://www.vis.uky.edu/~dnister/Publications/publications.html http://www.vis.uky.edu/~dnister/Publications/publications.html
其他一些注意事项:
我不会为金字塔匹配内核而烦恼,它实际上更多的是为了提高对象识别而不是重复/转换图像检测。
我不会将任何此类功能存储在 SQL 数据库中。根据您的应用程序有时动态计算特征更有效,因为在密集计算时它们的大小可能超过原始图像大小。特征的直方图或指向词汇树中节点的指针要高效得多。
SQL 数据库并不是为进行大规模浮点向量计算而设计的。您可以将内容存储在数据库中,但不要将其用作计算工具。我用 SQLite 尝试过一次,结果非常糟糕。
如果您决定实现这一点,请详细阅读该论文并在实现时随身携带一份副本,因为有许多小细节对于使算法有效工作非常重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)