【问题标题】:Best approach: how to detect objects that have few features, but come in groups最佳方法:如何检测特征很少但成组出现的对象
【发布时间】:2019-09-28 22:56:48
【问题描述】:

我的问题与检测成群飞行的鸟非常相似。物体的特征很少,可以在图像中以不同的角度定位。对象可以偶尔定位在一个组中(不是常规网格),但它们永远不会相交。我尝试了 YoloV3:一开始,我有 过度拟合,但至少它适用于训练图像)。随着我增加训练图像的数量,它停止工作,网络无法学习数据(underfitting)。我认为主要问题是,对象没有足够的 CNN 功能,即单独的对象太简单了。我想以某种方式利用他们总是成群结队的事实,即以某种方式考虑邻居。分组中它们的数量可能不同,至少 3 个,但大多数 > 10 个。它们可能看起来不同(如翅膀位置不同的鸟),但一组中所有对象的大小大致相同。我是神经网络的新手,所以也许有更多经验的人可以为我指明正确的方向。

我尝试使用OpenCV中的模板匹配:我必须使用许多模板(>20),因为对象可能看起来完全不同(翅膀的不同位置);并且还需要多尺度匹配,这都需要很多执行时间。但更重要的是,在不同的设置下,模板匹配发现的对象要么太少,要么误报太多。所以我认为神经网络更适合这项任务。如果我错了,请纠正我。我想也许通过 Mask-RCNN 来掩盖“有用”区域是有意义的,然后以某种方式分离这些区域中的对象(因为我必须为用户单独标记它们) .这可行吗,或者我可以尝试其他一些方法吗?任何提示将不胜感激!

编辑:我在图像中还有许多其他对象(不仅仅是天空和鸟类),例如树木。并且叶子或叶子组给出误报。它们可能具有不同的颜色(绿色、橙色、深绿色、黑色),因此几乎不可能按颜色过滤它们。

【问题讨论】:

  • 您使用什么图像分辨率?请发布使用 YOLO 识别失败的图像。
  • 您好,首先非常感谢您的帮助!我没有尝试过 Yolo 的第一个版本,我使用的是 YoloV3。我的图像是 500x500 像素,我搜索的对象大约是 25-30 像素(25x25 ... 30x30)。所以这应该不是问题。正如我所说,在一个小型训练集上,网络运行得非常好:几乎所有对象都被正确找到,它们都很好地相互分离。但随着我添加更多的训练数据(比如翅膀不同位置的鸟),网络停止工作。
  • 不幸的是,我无法添加我的真实图像,因为它们是我客户的财产(绝密!)。抱歉 :( 但我编辑了我的问题(请参阅最后的“编辑”和一张新图片),这可能有助于理解问题。

标签: opencv image-processing neural-network conv-neural-network yolo


【解决方案1】:

引用YOLO introduction article:

2.4。 YOLO 的局限性

YOLO 对边界框预测施加了强大的空间约束,因为每个网格单元只能预测两个框并且只能有一个类别。这种空间约束限制了我们的模型可以预测的附近物体的数量。 我们的模型难以处理成群出现的小物体,例如鸟群。

自 YOLO 版本 1 以来,对小型和多尺度对象的识别有了很大改进,但我没有发现任何证据表明它在小型分组对象识别方面变得更好(如果我错了请纠正我) .

在大型高分辨率图像上识别非常小的物体会有问题,因为 YOLOv3 会将它们缩小到 416x416(如果使用YOLOv3 320,则为 320x320)分辨率。如果图像太大,您可以提供图像的 YOLOv3 区域。或者您可以为此类情况找到一些现有的解决方案。

this article 中,伙计们通过使用支持向量机将基于 CNN 的检测器与全卷积网络和基于超像素的语义分割相结合,以实现在大图像中检测小物体的高性能。他们声称可以实现很高的检测精度。


但是,如果您想要检测的对象与其环境之间的相对差异明显且易于计算,您通常可以使用更简单的方法,只涉及一点点算法图像处理。

您可以尝试通过鸟类和天空之间的高颜色对比度来检测羊群。通常鸟类在天空背景上显得更暗。您可能会发现 this 和这个 this OpenCV 关于图像阈值的文档对此很有帮助。

int main(){
    Mat src = imread("1.jpg");
    Mat gray;
    cvtColor(src, gray, CV_BGR2GRAY);
    Mat thresholded;
    threshold(gray, thresholded, 100, 255, CV_THRESH_BINARY_INV);
    imwrite("2.jpg", thresholded);
    return 0;
}

我知道了:

现在您可以使用findContours()SimpleBlobDetector 提取白色小鸟斑点(并将它们与模板进行匹配,或者在需要时进行额外的识别/分类)。

【讨论】:

  • 嗨!非常感谢您的帮助!我已经尝试过阈值,但我不知道 SimpleBlobDetector。我会尝试你的想法,但不幸的是我不能总是只依赖背景和物体之间的对比。在许多情况下,根据我的真实数据,对比度不如我的示例图像中的鸟类和天空那么好。虽然,结合其他方法,阈值可以帮助我,你是对的。关于 CNN 的文章对我来说也是新的,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多