检测小物体是计算机视觉中最具挑战性和重要的问题之一。在这篇文章中,我们将讨论通过迭代数百种小物体检测模型在Roboflow上开发的一些策略。
无人机在公共空中海上数据集中从上方看到的小物体
为了提高模型在小对象上的性能,我们建议以下技术入手:
- 提高图像拍摄分辨率
- 增加模型的输入分辨率
- 平铺图片
- 通过扩充生成更多数据
- 自动学习模型
- 过滤掉多余的类
为什么小物体问题很难?
小物体问题困扰着全世界的物体检测模型。查看最新模型YOLOv3,EfficientDet和YOLOv4的COCO评估结果:
检查AP_S,AP_M,AP_L的最新模型。小物件很难!例如,在EfficientDet中,小型对象的AP仅为12%,大型对象的AP为51%。那几乎是五倍的差异!那么,为什么很难检测小物体呢?一切都取决于模型。对象检测模型通过聚合卷积层中的像素来形成特征。
PP-YOLO中用于对象检测的特征聚合
并且:
YOLO中的损失函数
如果地面物体本来就不大,而在进行训练时还会变小。因此,小物体最有可能出现数据标记错误,甚至可能会省略其标识。从经验和理论上讲,小物体都很难检测。
提高图像拍摄分辨率
分辨率,分辨率,分辨率……全都与分辨率有关。
很小的物体在边界框内可能只包含几个像素,这意味着增加图像的分辨率以增加检测器可以从该边界框提取信息的丰富度,这非常重要。因此,如果可能我们建议捕获尽可能高分辨率的图像。
增加模型的输入分辨率
获得更高分辨率的图像后,就可以扩大模型的输入分辨率。警告:这将导致大型模型需要花费较长的训练时间,并且在开始部署时将较慢地推断出来。您可能需要进行实验以找出速度与性能之间的权衡。大家可以在我们的有关YOLOv4培训的教程中轻松更改输入分辨率,方法是更改配置文件中的图像大小。
代码语言:javascript复制[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
更改输入分辨率方法是更改训练命令中的图像大小参数:
代码语言:javascript复制!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
注意:大家只会看到达到最大训练数据分辨率的改进结果。
平铺图片
检测小图像的另一种很好的策略是将图像平铺作为预处理步骤。平铺可以有效地将检测器放大到小物体上,但可以保持所需的小输入分辨率,以便能够进行快速推理。
在Roboflow中平铺图像作为预处理步骤如果大家要在训练期间使用平铺,请务必记住,还需要在推理时平铺图像。
通过扩充生成更多数据
数据扩充会从基本数据集中生成新图像。这对于防止模型过度拟合训练集非常有用。对于小物体检测,一些特别有用的增强包括随机裁剪,随机旋转和镶嵌增强。
自动学习模型的锚定框
锚定框是模型学习预测的原型边界框。也就是说,锚框可以预先设置,有时对于训练数据而言不是最佳的。自定义调整这些参数以适合我们需要完成的任务,这是很好的。YOLOv5模型架构会根据小伙伴的自定义数据自动为您完成此操作。我们要做的就只是是开始训练。
代码语言:javascript复制Analyzing anchors... anchors/target = 4.66, Best Possible Recall
(BPR) = 0.9675. Attempting to generate improved anchors, please wait...
WARNING: Extremely small objects found. 35 of 1664 labels are
< 3 pixels in width or height. Running kmeans for 9 anchors on 1664
points... thr=0.25: 0.9477 best possible recall, 4.95 anchors past
thr n=9, img_size=416, metric_all=0.317/0.665-mean/best,
past_thr=0.465-mean: 18,24, 65,37, 35,68, 46,135, 152,54,
99,109, 66,218, 220,128, 169,228 Evolving anchors with Genetic
Algorithm: fitness = 0.6825: 100%|██████████| 1000/1000 [00:00<00:00,
1081.71it/s] thr=0.25: 0.9627 best possible recall, 5.32 anchors past
thr n=9, img_size=416, metric_all=0.338/0.688-mean/best,
past_thr=0.476-mean: 13,20, 41,32, 26,55, 46,72, 122,57, 86,102,
58,152, 161,120, 165,204
过滤掉多余的类
类管理是提高数据集质量的一项重要技术。如果有两个类明显重叠的类,则应从数据集中过滤一个。如果因为认为数据集中的小对象不值得检测,并希望将他们先去除。大家可以通过运行Roboflow Pro的高级数据集来快速识别所有这些小对象。可以通过Roboflow的管理工具来实现类遗漏和类重命名。