机器学习越来越多地进入我们的日常生活。虽然所有的现代检测模型都非常擅长于检测相对较大的物体,如人、汽车和树木,但另一方面,小物体仍然给它们带来一些麻烦。对于一个模型来说,从房间的另一边看到手机或从100米远的地方看到红绿灯是非常困难的。所以今天我们将讨论为什么大多数流行的目标检测模型都不擅长检测小物体,我们如何提高它们的性能,以及其他已知的解决这个问题的方法。 为了提高你的模型在小对象上的性能,我们推荐以下技术:
- FocalLoss
- 增加图像捕捉分辨率
- 增加模型的输入分辨率
- 分块你的图像
- 通过数据增强生成更多数据
- 自动学习模型锚框
- 过滤掉无关类
为什么小物体问题很难?
现代的目标检测算法都是基于卷积神经网络的。这是一种非常强大的方法,因为它可以创建一些低层次的图像抽象,如线、圈,然后“迭代地组合“到我们想要检测的对象中,但这也是为什么它们难以检测小对象的原因。 上面你可以看到一个通用图像分类神经网络的例子。我们最感兴趣的是隐藏层部分。如你所见,这个网络有一系列卷积的组合,然后是池化层。许多物体检测网络,如YOLO, SSD-Inception和Faster R-CNN也使用这些,而且数量相当多。将图像的分辨率从600×600降低到30×30。由于这个事实,他们在第一层提取的小对象特征(一开始就很少)“消失”在网络中间的某个地方,从来没有真正到达检测和分类步骤。
小目标问题困扰着世界范围内的目标检测模型。检查YOLOv3, EfficientDet和YOLOv4的COCO评估结果: 查看最好模型的
A
P
S
,
A
P
M
,
A
P
L
AP_S, AP_M, AP_L
APS?,APM?,APL?可以发现,小物体是很难被检测正确!例如,在EfficientDet中,小目标的mAP仅为12%,而大目标的AP为51%。这几乎是五倍的差异!
使用FocalLoss
如果你有很多类要检测,一个最简单的方法来提高检测小物体和很难检测的类是在训练神经网络的过程中使用FocalLoss。Focal Loss 就是一个解决分类问题中类别不平衡、分类难度差异的一个 loss。在论文本身提供的图表中很容易看到:
增加图像捕捉分辨率
非常小的物体可能只包含边界框内的几个像素,提高图像的分辨率可以增加检测器从这个小框形成更丰富的特征。 因此,我们建议尽可能地捕捉高分辨率的图像。
增加模型的输入分辨率
一旦你有了更高分辨率的图像,你就可以放大模型的输入分辨率。警告:这将导致一个大型模型需要更长的时间来训练,并且在开始部署时推理会更慢。您可能必须进行一些试验,以找出速度与性能之间的正确权衡。
[net]
batch=64
subdivisions=36
width={YOUR RESOLUTION WIDTH HERE}
height={YOUR RESOLUTION HEIGHT HERE}
channels=3
momentum=0.949
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue = .1
learning_rate=0.001
burn_in=1000
max_batches=6000
policy=steps
steps=4800.0,5400.0
scales=.1,.1
在我们的教程中,你也可以通过改变training命令中的图像大小参数,轻松地缩放你的输入分辨率:
python train.py --img {YOUR RESOLUTON SIZE HERE} --batch 16 --epochs 10 --data '../data.yaml' --cfg ./models/custom_yolov5s.yaml --weights '' --name yolov5s_results --cache
分块你的图像
另一个检测小图像的策略是将图像分块最为预处理步骤。分块策略有效地将检测器放大小对象,但允许您保持所需的小输入分辨率,以便能够运行快速推断。下面举一个例子: 虽然模型的FPS大幅下降,但它在检测方面给模型带来了非常好的准确性提升。如果您在训练期间使用了分块策略,那么要记住,您还需要在推理时使用分块策略。
通过增强生成更多数据
数据增强从基本数据集生成新的图像。这对于防止模型在训练集上过拟合非常有用。 一些特别有用的增强小目标检测方法包括随机裁剪,随机旋转和马赛克( mosaic)增强。
自动学习模型锚框
锚框是典型的边界框,你的模型可以据此进行预测。也就是说,锚框可以预先设置,有时对您的训练数据不是最优的。YOLOv5模型体系结构会根据您的自定义数据自动生成锚框。你要做的就是开始训练。
过滤掉无关类
类别管理是提高数据集质量的一项重要技术。如果有一个类与另一个类明显重叠,则应该从数据集中过滤这个类。也许,您认为数据集中的小对象不值得检测,所以您可能想要将其剔除掉。
总结
正确地检测小目标确实是一个挑战。在这篇文章中,我们讨论了一些改进小目标检测的策略,即:
- FocalLoss
- 增加图像捕捉分辨率
- 增加模型的输入分辨率
- 分块你的图像
- 通过数据增强生成更多数据
- 自动学习模型锚框
- 过滤掉无关类
参考目录
https://blog.roboflow.com/detect-small-objects/
|