最核心的技巧:数据集足够大且标记良好,就可以在不更改模型或训练设置的情况下获得良好的结果
但是,获得大量标记良好的数据集是有很高成本的,当数据集达不到上述要求时,可以遵循下面的技巧。
第一:先使用默认设置获得一个基准性能(baseline performance),找出需要改进的地方。借助wandb/tensorboard等工具,查看:train losses, val losses, mAP,PR curve, confusion matrix, training mosaics, test results,并对比数据集的统计信息,例如,labels.jpg。

第二:了解一些好数据集的量化指标:
- Images per class. ≥ 1500 images per class
- Instances per class ≥ 10000 instances (labeled objects) per class
- 图像多样性:必须能代表模型部署的环境。例如:来自一天中不同时间、不同季节、不同天气、不同照明、不同角度、不同来源(在线抓取、本地收集、不同相机)等的图像。
- 标签准确性:标签必须紧紧地包围每个对象,对象与其边界框之间不应存在空间。任何对象都不应缺少标签
- 标签一致性:必须标记所有图像中所有类的所有实例。不能一部分标记,一部分不标记
-
背景图像:背景图像是没有添加到数据集以减少误报 (FP) 的对象的图像。我们建议使用大约 0-10% 的背景图片来帮助减少 FP(COCO 有 1000 张背景图片供参考,占总数的 1%)。背景图像不需要标签
COCO/PASCAL VOC和ImageNet都是公认的优秀的数据集,可以对照上述标准评判。
Microsoft COCO: Common Objects in Context
上图来源: Microsoft COCO: Common Objects in Context
第三:在中小型数据集上,最好从预训练权重(Pretrained weights)开始训练;在大型数据集上,例如:COCO, Objects365, OIv6,可以无需预训练权重,从头开始训练模型。
第四:熟悉一些常用的超参数: - Epochs,从300开始,若没有过拟合,则可以增加训练轮数,例如,600,1200...
- 图像尺寸(Image Size),COCO数据集的原生分辨率是 640。训练时的图像尺寸越大,小物体越受益。推理计算时采用的图像尺寸要与训练时保持一致。
-
Batch Size,只要不报CUDA out of memory错误,越大越好。Batch Size较小会导致batchnorm的结果较差,应尽量避免
超参数的一个范例: https://github.com/ultralytics/yolov5/blob/master/data/hyps/hyp.scratch-low.yaml
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Hyperparameters for low-augmentation COCO training from scratch
# python train.py --batch 64 --cfg yolov5n6.yaml --weights '' --data coco.yaml --img 640 --epochs 300 --linear
# See tutorials for hyperparameter evolution https://github.com/ultralytics/yolov5#tutorials
lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.01 # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937 # SGD momentum/Adam beta1
weight_decay: 0.0005 # optimizer weight decay 5e-4
warmup_epochs: 3.0 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr
box: 0.05 # box loss gain
cls: 0.5 # cls loss gain
cls_pw: 1.0 # cls BCELoss positive_weight
obj: 1.0 # obj loss gain (scale with pixels)
obj_pw: 1.0 # obj BCELoss positive_weight
iou_t: 0.20 # IoU training threshold
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3 # anchors per output layer (0 to ignore)
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.5 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
mosaic: 1.0 # image mosaic (probability)
mixup: 0.0 # image mixup (probability)
copy_paste: 0.0 # segment copy-paste (probability)
从工具的角度,最重要的是:建立端到端的深度学习模型训练/评估框架
参考资料:A Recipe for Training Neural Networks
网友评论