【问题标题】:which algorithm to choose for object detection?选择哪种算法进行对象检测?
【发布时间】:2014-01-11 10:53:48
【问题描述】:

我有兴趣更精确地检测单个物体,即灭火器没有类间可变性(所有灭火器看起来都一样)。然而,该应用程序应该是实时的,即机器人正在探索环境,每当它看到感兴趣的对象时,它应该能够检测到它并给出它的像素坐标。

我的问题是哪种算法适合这项任务?
1.这是一个分类问题吗?我们应该使用特征(筛选/冲浪等)+弓+svm吗?
2. 其他一些解决方案(还不知道)。

我们将不胜感激任何类型的输入。 谢谢。
(PS 忍耐一下,我是计算机视觉和堆栈溢出的新手)

更新1:

高度不同,所有都安装在墙上,但高度不同。我尝试了 SIFT 特征和弓,但在测试部分提取弓描述符很昂贵。此外,我不知道如何在图像被分类为阳性后定位图像内的对象(像素坐标)。

更新 2:

我终于使用了 sift + bow + svm 并且能够对对象进行分类。但是使用这种技术,我只能得到关于对象是否存在于场景中的输出? 我如何检测对象,即获取对象的边界框或中心。实现这些结果的上述方法的兼容方法是什么。 谢谢大家。

【问题讨论】:

  • 如果对象中有足够的结构/纹理,筛选/冲浪和对象不同视图的数据库可以完成这项工作。 svm 训练的 HoG 描述符是最近在科学中广泛使用的另一种技术。
  • 这在很大程度上取决于您的数据,例如颜色将是一个很大的帮助。仅当您的传感器具有立体视觉时,3D 功能才有效。如果所有灭火器都在同一水平面上,则可以使用高度信息。其他功能取决于您的灭火器的外观。可以发一些你的机器人拍摄的灭火器的照片吗?
  • @HugoRune 请查看更新。
  • @Micka 这些技术是否被证明足够强大,适合实时系统?例如,我对 5 到 7 fps 感兴趣。
  • @user3126137 稳健性很大程度上取决于特征提取的稳健性和可提取特征的数量。如果您能够在实时范围内计算 SIFT/SURF 特征和描述符,那么大部分工作就完成了。由于您只考虑一种对象,我猜一个可能包含 100 张图像的数据库就足够了。比较特征的时间取决于特征的数量。我建议只要尝试 SIFT/SURF 如果可行,您可以尝试提高速度。识别成功后在图像中找到位置就是从匹配的特征对应中计算单应性

标签: opencv computer-vision object-detection


【解决方案1】:

我建议使用颜色作为主要功能来寻找,并且只根据需要尝试其他功能。灭火器红色非常有特色,在办公环境的其他地方不应该经常出现。然后只能在正确颜色的区域中执行其他计算成本更高的测试。

这是一个很好的tutorial for color detection,它还解释了如何为您想要的颜色找到合适的阈值。

我会建议以下方法:

  • 使用中值滤波器对图像进行去噪
  • 将图像转换为 HSV 格式(色相、饱和度、值)
  • 使用 InRange() 选择接近特定红色阴影的像素
    现在您有了一个仅包含红色像素的二值图像。
  • 用 CountNonZero() 计算红色像素的数量
    • 如果这个数字太小,中止
  • 通过形态开/关去除二值图像中的噪声
  • 使用 findContours 或 CvBlob 库查找图片中所有斑点的轮廓
  • 检查是否存在正确宽度、正确高度和正确宽度/高度比的 blob
    由于您的灭火器是垂直圆柱体,因此宽度/高度比从各个角度都是恒定的。宽度和高度当然会随着与相机的距离而有所不同。
    • 如果宽高不匹配,中止
  • 重复这些步骤,找到灭火器底部的黑色部分,
    • 如果在红色区域下方没有具有正确宽度/高度的黑色区域,则中止
  • (也许还对金属顶部和黄色矩形重复这些步骤)

这些测试都应该非常快。如果它们太慢,您可以降低输入图像的分辨率。

根据您的环境,这可能已经是一个足够强大的测试。如果没有,您可以继续进行筛选/冲浪特征匹配,但只能在具有正确颜色的斑点周围的小区域内进行。您也不必为每一帧都这样做,每第 n 帧应该足以进行确认。

【讨论】:

  • 因为你的灭火器是垂直的圆柱体,所以宽度/高度比从各个角度都是恒定的只有当你假设机器人是如何相对于灭火器。总体而言,您的方法需要对环境进行大量假设,并且不会非常稳健。
  • @HannesOvrén 我假设机器人沿着地板水平移动,并保持其相机与地板大致对齐,并且灭火器垂直悬挂在墙壁上人类可以到达的高度。我认为这是一个非常合理的假设,认为您可以通过测试最小边界矩形的比率来提高误差范围。总的来说,我不同意您的结论,即在这种情况下基于颜色的识别不会很可靠,但也许您可能想指定其他假设或建议更合适的方法?
  • 我同意你对运动的假设是好的。只是你仍然可以得到透视失真,例如你离灭火器很近。仅基于颜色意味着您对照明条件做出假设,并且不会出现具有该颜色的其他对象。此外,灭火器不仅是红色的,而且有相当多的文本,这意味着以稳健的方式进行阈值处理并获得实心斑点可能很困难。我没有更好的答案,因为我有点脱离了我的舒适区。我只是想对您的回答发表一些看法:)
  • 嗯,我觉得大部分漏报的问题都可以通过选择误差范围足够大的参数来解决。例如,虽然宽度/高度比可以随透视而变化,但宽度不应大于高度;颜色相似。获得一个坚实的斑点可能需要一些形态学的开放。这样肯定会有误报的机会(其他尺寸大致正确的红色物体,底部为黑色),但可以通过进一步的测试(如 SIFT limited 到该区域)将其移除,因此性能应该不太担心。
  • 这种方法对我来说有点太临时了,但我同意它可能可以完成。猜猜我们必须同意不同意,直到有人尝试实施;)
【解决方案2】:

这是一个老问题.. 但仍然想给我的建议,使用 YOLO 算法来解决这个问题。 YOLO 非常适合这种情况。

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2019-06-09
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多