实时物体检测(筛选)
Real time object detection (sift)?
我正在调查此字段以实时获取对象检测。
视频示例:
- 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 秒时,他们丢失了对象,需要相当长的时间/尝试再次找到它。
- 使用CMake检测支持的C++标准
- 当套接字连接断开时检测C/C++Unix
- C/C++预处理器是否可以检测一些编译器选项
- WMI检测进程创建事件-c++
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 下面是我为检测链接列表中的循环而制作的代码
- 落砂模拟碰撞检测C++和SFML
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么C++编译器没有检测到正确声明的类?
- 检测win32服务创建和删除的最佳方法
- 正在LLVM中检测整数比较条件
- 如何在鼠标挂钩过程中检测拖动
- 位移操作和位掩码未检测到重复字符
- 检测 COFF 对象文件中C++内联符号
- qmake:检测目标位宽(32 位或 64 位)
- 增强精神解析器规则以检测语句中的特殊结尾
- 用于C++的静态二进制检测或二进制重写工具和框架
- Tensorflow对象检测在Python和C++(OpenCV)之间有不同的结果
- 剽窃检测-筛选指纹冲突
- 实时物体检测(筛选)