【问题标题】:GPU based SIFT feature extractor for iOS?适用于 iOS 的基于 GPU 的 SIFT 特征提取器?
【发布时间】:2014-04-03 16:34:26
【问题描述】:

我一直在使用出色的 GPUImage 库,它实现了几个特征检测器:Harris、FAST、ShiTomas、Noble。然而,这些实现都没有帮助特征提取和匹配部分。它们只是输出一组检测到的角点。

我的理解(这是不稳定的)是下一步将检查每个检测到的角点并从中提取特征,这将产生描述符 - 即可以使用的 32 或 64 位数字索引靠近其他相似点的点。

通过阅读 [Computer Vision Algorithms and Applications, Szeliski] 的第 4.1 章,我了解到使用 BestBin 方法将有助于有效地找到要匹配的相邻特征等。但是,我实际上并不知道如何做到这一点,并且我正在寻找一些执行此操作的示例代码。

我发现这个项目 [https://github.com/Moodstocks/sift-gpu-iphone] 声称在 GPU 中实现尽可能多的特征提取。我还看到一些讨论表明它可能会生成错误的描述符。

在任何情况下,该代码都不会继续显示提取的特征如何与另一张图像进行最佳匹配。

我的用例是在图像中查找对象。

有没有人有任何代码可以做到这一点,或者至少有一个很好的实现来显示提取的特征是如何匹配的?我希望不必重写整套算法。

谢谢, 抢。

【问题讨论】:

标签: ios feature-detection gpuimage


【解决方案1】:

首先,您需要小心 SIFT 实施,因为the SIFT algorithm is patented 和这些专利的所有者需要支付使用许可费。因此,我有意避免将该算法用于任何事情。

找到在 GPU 上也能正常工作的良好特征检测和提取方法有点棘手。 GPUImage 中的 Harris、Shi-Tomasi 和 Noble 角点检测器都是相同基本操作的派生,可能不是识别特征的最快方法。

如您所知,我的 FAST 角检测器尚未运行。想法是使用基于本地二进制模式的查找纹理(为什么我首先构建该过滤器来测试这个概念),并让它返回是否是角点。这应该比 Harris 等角检测器快得多。我还需要完成我的直方图金字塔点提取器,这样特征提取就不会在 GPU 上以极慢的循环完成。

在 FAST 角点检测器中使用查找纹理的灵感来自 Jaco Cronje 的 this paper,他们称之为 BFROST。除了使用基于纹理的快速查找进行特征检测外,本文还建议使用二进制模式作为特征的快速描述符。不仅如此,还有更多内容,但总的来说,这就是他们的建议。

特征匹配是通过汉明距离完成的,但是虽然有快速的 CPU 端和 CUDA 指令来计算它,但 OpenGL ES 没有。那里可能需要一种不同的方法。同样,我没有一个很好的解决方案来找到 CPU 端以外的功能组之间的最佳匹配,但我还没有想到那么远。

在框架中包含它是我的主要目标(这是我构建它的原因之一),但我最近没有时间研究这个。以上至少是我对如何处理这个问题的想法,但我警告你,这并不容易实现。

【讨论】:

  • 是的,我也一直在关注您在 GPUImage 项目上的工作,同时也跟踪这些票,所以我确实找到了有关实施 FAST 的票。作为下一个(婴儿)步骤,我注意到当前的检测器没有提取特征。在我看来,他们需要将输出输入另一个过滤器,该过滤器创建描述符并为其编制索引。那时,我认为我可以在 CPU 中执行算法,因为我只处理数百个特征,而不是数千个特征。你觉得这样合理吗?
  • 你看过这个库吗? vuforia.com/platform。似乎还使用 OpenGL 检测图像中的对象。显然是免费的,不收费。
  • SIFT 专利已过期。
【解决方案2】:

对于对象识别/这些天(截至几周前)最好使用 tensorflow/卷积神经网络。 苹果最近添加了一些金属样本代码。 https://developer.apple.com/library/content/samplecode/MetalImageRecognition/Introduction/Intro.html#//apple_ref/doc/uid/TP40017385

要在图像中进行特征检测 - 我提请您注意开箱即用 - 使用 opencv 的 KAZE/AKAZE 算法。 http://www.robesafe.com/personal/pablo.alcantarilla/kaze.html

对于 ios,我将 Akaze 类与另一个拼接示例粘合在一起进行说明。

detector = cv::AKAZE::create();
detector->detect(mat, keypoints); // this will find the keypoints

cv::drawKeypoints(mat, keypoints, mat);

// this is the pseudo SIFT descriptor
.. [255] = {
pt = (x = 645.707153, y = 56.4605064)
size = 4.80000019
angle = 0
response = 0.00223364262
octave = 0
class_id = 0 }

https://github.com/johndpope/OpenCVSwiftStitch

【讨论】:

  • 啊,你是对的。我实际上正在研究一种混合了 FAST 的机器学习算法。从那里开始 - GPU 加速可能会通过 Core ML + 训练模型开箱即用。 github.com/johndpope/Bresenham-Line
猜你喜欢
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 2013-07-28
  • 2016-10-16
  • 1970-01-01
  • 2017-09-27
相关资源
最近更新 更多