最佳方法:如何检测功能很少但成组的对象

时间:2019-05-11 05:58:46

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

我的问题与检测一群鸟飞非常相似。这些对象几乎没有特征,可以在图像中以不同角度定位。可以很随意地将对象放置在一个组中(而不是规则的网格),但是它们永远不会相交。我尝试了 YoloV3 :开始时,由于我有<30个训练图像,所以效果很好(过拟合,但至少它可以训练图像)。随着训练图像数量的增加,它停止工作,网络无法学习数据(拟合不足)。我认为主要问题是对象没有足够的CNN功能,即单独的对象太简单了。我想以某种方式利用他们总是成群结队的事实,即以某种方式考虑邻居。每组中它们的数量可能不同,至少3个,但大多数>10。它们的外观可能有所不同(就像翅膀位置不同的鸟一样),但是组中所有对象的大小大致相同。我是神经网络领域的新手,所以也许有更多经验的人可以为我指明正确的方向。

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

编辑:我在图像中还有许多其他对象(不仅仅是天空和鸟类),例如树木。叶子或叶子组会产生假阳性。它们可能具有不同的颜色(绿色,橙色,深绿色,黑色),因此很难对它们进行颜色过滤。

flock of birds trees

1 个答案:

答案 0 :(得分:4)

引用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;
}

我明白了:

My

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