问题 OpenCV提高了已知对象检测性能


我正在开发一个项目,我可以在移动环境中“实时”检测场景中的已知图片(这意味着我正在使用智能手机相机捕捉帧并将帧大小调整为150x225)。图片本身可能相当复杂。现在,我正在平均1.2s处理每个帧(使用OpenCV)。我正在寻找改善处理时间和全球准确性的方法。我目前的实施工作如下:

  1. 捕捉帧
  2. 将其转换为灰度
  3. 检测关键点并使用ORB提取描述符
  4. 匹配描述符(2NN)(对象 - >场景)并使用比率测试对其进行过滤
  5. 匹配描述符(2NN)(场景 - >对象)并使用比率测试对其进行过滤
  6. 用4.和5非对称匹配去除。
  7. 计算匹配置信度(匹配关键点与总关键点的百分比)

我的方法可能不是正确的,但即使有很大的改进空间,结果仍然可以。我已经注意到SURF提取太慢了,我无法使用单应性(它可能与ORB有关)。欢迎所有建议!


4197
2017-07-15 20:43


起源

在您对此过程进行分析时,每个列出的步骤需要多长时间?每个列出的项目占1.2s的哪一部分? - Brad Larson♦
平均而言,灰度转换需要15ms,检测和提取阶段为300ms,其余(约900ms)用于匹配阶段。 - Cladouros
我自己一直在尝试相同的过程,只在GPU上完全完成。我已经完成了关键点检测(使用Harris角落,虽然我正在进行FAST角落实现),并且正在研究其余部分。我能够在iPhone 4上检测并提取大约60毫秒的640x480 RGB帧的关键点,尽管我认为我最近因性能失败而导致性能下降。我已经看到了一些我正在考虑应用的快速GPU绑定强力匹配器。到目前为止我的代码可以在这里找到: github.com/BradLarson/GPUImage - Brad Larson♦
干得好,我明确地会仔细研究它。 - Cladouros


答案:


性能始终是手机上的问题:)

你可以做一些事情。 OpenCV:C ++和C性能比较 解释了处理时间改进的通用方法。

以及您项目的一些细节:

  • 如果您捕获彩色图像并将其转换为灰度图像,则会浪费资源。 YUV是原生相机格式。它转换为RGB,这是昂贵的,然后转换为灰色,这也是昂贵的。所有这一切,而YUV(Y)中的第一个通道是灰度......所以,捕获YUV,并通过复制图像数据的第一部分提取第一个通道(Android上的YUV是平面的,这意味着第一个w * h像素属于Y通道)
  • ORB创建得很快。它是。但就在几周前,FREAK被添加到OpenCV中。这是一个新的描述符,其作者声称比ORB / SIFT / SURF /等更准确,更快。试一试.YOu可以在opencv> = 2.4.2中找到它(这是现在的当前)

编辑

布拉德拉森的问题很有启发性 - 如果匹配器停留900毫秒进行处理,那就是一个问题!查看Andrey Kamaev的这篇文章 OpenCV ORB功能检测器如何工作? 他解释了描述符和匹配器之间可能的组合。尝试基于FLANN的uchar匹配器。

而且,我想你会得到大量的检测 - 数百或数千 - 如果它需要那么多来匹配它们。尝试限制检测,或仅选择前n个最佳值。


7
2017-07-16 07:46



谢谢你的答案,YUV技巧很棒(它会比直接使用ARM NEON更快吗?)。我现在正在考虑FREAK。您对如何优化匹配阶段有任何想法吗? - Cladouros
从yuv中取出灰色只是一个记忆,所以它比其他任何东西都快。虽然我没有检查FREAK源代码,但他们说它可以由SIMD(NEON)加速。因此,请检查OpenCV代码。没有分析数据,我不能给你一般的建议。 - Sam
OpenFV与FREAK的整合速度很快,我在一个月前刚刚阅读了他们的会议预发布论文。我也正在尝试GPU加速的BRISK风格的特征提取和匹配,并且一直在考虑修改FREAK以便在GPU上使用。你只是抓住Y平面,这在iOS上使用YUV平面格式相机很容易 CVPixelBufferGetBaseAddressOfPlane(cameraFrame, 0)。 - Brad Larson♦
@BradLarson FREAK是由开发它的人承诺的。我非常感谢他们开放和愿意支持开源社区 - Sam
从YUV中提取Y通道效果很好,处理时间为15ms。然而,在这个特殊情况下,FREAK的结果比ORB慢(0,3s vs 1,5s)。我调整了ORB参数,并且能够处理更高分辨率的图像(352x288而不是150x225),并且每帧大约1.5s可以获得更好的结果。这比以前更多的处理时间,但匹配更好,因此需要处理的帧更少,对最终用户来说似乎更快。我无法找到有关基于FLANN的uchar匹配器的任何信息,你有关于它的一些链接吗? - Cladouros


你应该尝试FAST来检测场景中的对象,比SURF更快,你可以找到使用金字塔版FAST的文章。为了提高手机的性能,你可以优化循环,使用固定的算术等等。祝你好运。


3
2017-07-17 11:05