比较存储在mysql数据库中的SIFT功能

Dar*_*ara 17 c++ database algorithm computer-vision sift

我正在扩展用于分类图像的图像库,我想找到包含或包含在其他图像中的重复图像,变换图像和图像.
我已经测试了OpenCV的SIFT实现,它运行得很好,但对于多个图像来说速度相当慢.太快了我以为我可以提取功能并将它们保存在数据库中,因为很多其他与图像相关的元数据已经被保存在那里.

将新图像的功能与数据库中的功能进行比较的最快方法是什么?
通常比较是使用kd-trees,FLANN或我在SO上的另一个线程中找到的金字塔匹配内核来计算欧氏距离,但还没有看到太多.

由于我不知道有效地在数据库中保存和搜索kd树的方法,我目前只看到三个选项:
*让MySQL计算数据库中每个特征的欧氏距离,尽管我确定这将花费不合理的时间来拍摄多张照片.
*在开始时将整个数据集加载到内存中并构建kd-tree(s).这可能很快,但内存密集.此外,所有数据都需要从数据库传输.
*将生成的树保存到数据库中并加载所有树,这将是最快的方法,但也会产生大量流量,因为新图像必须重建kd树并将其发送到服务器.

我正在使用OpenCV的SIFT实现,但我并没有死定.如果有一个特征提取器更适合这个任务(并且大致同样强大),我很高兴,如果有人可以提出一个.

Dou*_*oug 14

所以几年前我基本上做了类似的事情. 几年前David Nister提出了你想要研究的算法,论文是:"用词汇树进行可扩展识别".它们几乎可以解决您的问题,可以扩展到数百万个图像.

这是摘要的链接,您可以通过googleing标题找到下载链接. http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=1641018

基本思想是构建一个具有分层k-means算法的树来对特征进行建模,然后利用该树中特征的稀疏分布来快速找到最近的邻居......或类似的东西,这已经过去几年了.我努力了.您可以在作者网页上找到powerpoint演示文稿:http://www.vis.uky.edu/~dnister/Publications/publications.html

其他几点说明:

  • 我不打扰金字塔匹配内核,它实际上更多的是改善对象识别而不是复制/变换图像检测.

  • 我不会在SQL数据库中存储任何此功能.根据您的应用程序,有时更有效地计算您的功能,因为它们的大小在密集计算时可能超过原始图像大小.词汇树中节点的特征或指针的直方图更有效.

  • SQL数据库不是为进行大规模浮点矢量计算而设计的. 您可以将数据存储在数据库中,但不要将其用作计算工具. 我用SQLite尝试了一次,结果非常糟糕.

  • 如果您决定实现这一点,请详细阅读本文并在实现时保留一份副本,因为有许多细微的细节对于使算法高效运行非常重要.