实时物体检测(筛选)

Real time object detection (sift)?

本文关键字:筛选 检测 实时      更新时间:2023-10-16

我正在调查此字段以实时获取对象检测。

视频示例:

  • http://www.youtube.com/watch?v=Bm5qUG-06V8
  • http://www.youtube.com/watch?v=aYd2kAN0Y20

但是他们如何提取筛选关键点并如此快速地匹配它们呢?
SIFT提取通常需要第二次

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

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

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

该代码是开源的(BSD许可证),您可以通过 http://www.openimaj.org 的链接获取它。如视频描述中所述,图像处理代码是纯 Java;唯一的本机代码是网络摄像头的精简界面。当前教程pdf文档中的第7个教程介绍了在OpenIMAJ中使用SIFT的过程。禁用双重大小可以通过执行以下操作来实现:

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

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

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

  • 您可以在CPU级别(例如OpenCV使用英特尔的TBB)或GPU级别(Google用于SIFT GPU的相关代码和文档)使用并行实现。

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

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

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

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