【问题标题】:Real time object detection (sift)?实时物体检测(筛选)?
【发布时间】:2023-04-04 19:35:01
【问题描述】:

我正在研究这个领域以实时获得物体检测。

视频示例:

但是他们怎么能如此快地提取筛选关键点并匹配它们呢?
SIFT提取一般需要一秒

【问题讨论】:

标签: java c++ image-processing opencv


【解决方案1】:

我是一名 OpenIMAJ 开发人员,负责制作第一个视频。

我们并没有做任何特别花哨的事情来使该视频中的匹配速度更快,并且对每一帧的整体进行 SIFT 检测和提取。事实上,视频在我们进行任何优化之前就已经制作好了;该演示的当前版本更加流畅。我们也有一个带有混合 KLT 跟踪器的版本,由于不必在每一帧上执行 SIFT,它的工作速度更快。

正如@Mario 所建议的,图像大小确实对提取速度有很大影响,因此处理较小的帧可以带来很大的好处。其次,在Lowe在SIFT论文中提出的高斯兴趣点定位差异的原始描述中,建议首先将输入图像的尺寸增加一倍以增加特征数量。通过不执行这种双倍调整,您还可以获得性能大幅提升,但要匹配的功能更少。

代码是开源的(BSD 许可),您可以通过http://www.openimaj.org 的链接获取它。如视频描述中所述,图像处理代码是纯 Java;唯一的本机代码是网络摄像头的精简接口。 current tutorial pdf document 中的第 7 号教程介绍了在 OpenIMAJ 中使用 SIFT 的过程。可以通过以下方式禁用双重大小:

DoGSIFTEngine engine = new DoGSIFTEngine();
engine.getOptions().setDoubleInitialImage(false);

【讨论】:

    【解决方案2】:

    SIFT 可以通过多种方式加速:

    • 如果你能负担得起近似值,那么你可以推导出一个称为 SURF 的关键点,它的速度要快得多(对大多数任务使用积分图像)

    • 您可以在 CPU 级别(例如 OpenCV 使用 Intel 的 TBB)或 GPU 级别(谷歌搜索 sift gpu 以获取相关代码和文档)使用并行实现。

    无论如何,这些在 Java 中都不可用(AFAIK),因此您必须使用 Java 包装器来打开 CV 或自己解决。

    【讨论】:

      【解决方案3】:

      一般和第一个想法:询问视频上传者。我们可以假设完成了什么或如何完成。了解您到目前为止所做的工作也可能会有所帮助(例如,您的视频分辨率、处理能力、图像准备等)。

      我没有专门使用过 SIFT,但在过去几年里我做了很多对象/运动跟踪,所以这更笼统。你可能已经尝试了一些点,我不知道。

      • 降低图像分辨率:从 640x480 到 320x240 会将数据减少到 25%。降低到 160x120 会再减少 25%(因此剩下 6.25% 的数据),而不会显着影响您的算法。
      • 以类似的方式,降低图像的颜色深度可能会很有用(不仅仅是 256 灰度,甚至可能更多;比如 64 色)。
      • 尝试其他方法以使特征更明显或更快找到,例如尝试在您的图像上运行边缘检测器。
      • 至少第二个视频提到了跟踪系统,因此您可以尝试猜测被跟踪对象应该在下一帧重新出现的区域(使用一些简单的 a/b 过滤器或任何坐标和可能的旋转),然后使用 SIFT仅在该子区域(增加了一些边距)上。如果您无法再次找到它,请仅分析整个图像。在第二个视频中大约 40 或 50 秒时,他们正在丢失对象,需要相当长的时间/尝试再次找到它。

      【讨论】:

      • 是的,我假设他们只对一小部分图像进行筛选,如果找不到,他们会在整个图像中搜索,从而减慢速度。但它仍然非常快
      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 2021-04-10
      相关资源
      最近更新 更多