YOLOv5小目标检测训练出现obj/box列NaN、mAP始终为0如何解决?
YOLOv5训练小目标(划痕)出现NaN损失、mAP为0排查方案
1 数据集与标注问题排查
- 检查标注文件合法性:打开训练集对应的txt标注文件,确认所有标注坐标都是0~1之间的归一化数值,不存在负值、大于1的数值,也没有标注框宽高为0的情况。划痕属于宽高比极大的极小目标,Roboflow导出时可能出现标注被预处理截断、识别为无效框过滤的问题。
- 核对
data.yaml配置:确认nc字段的数值和你实际标注的类别数量完全一致,路径字段不要包含中文、空格、特殊字符,train、val指向的是图片存放路径,而非标注文件路径。
2 小目标适配参数调整
- 重新生成锚框:YOLOv5默认锚框适配COCO常规尺寸目标,和划痕这类极小目标匹配度极低,会导致定位损失计算溢出出现NaN。可运行自带工具生成适配你数据集的锚框:
python utils/autoanchor.py --data 你的data.yaml路径 --img 训练输入分辨率 - 提升输入分辨率:小目标检测建议把训练输入分辨率调整到1280及以上,不要用默认的640,避免划痕目标在输入图中仅占数个像素,无法提取有效特征。
3 训练超参调整
- 降低初始学习率:默认初始学习率0.01对小目标数据集来说普遍偏高,容易导致参数更新震荡、损失溢出为NaN,可在训练命令中添加
--lr0 0.001降低学习率后重试。 - 调整数据增强策略:Roboflow的随机裁剪、大幅缩放增强容易把极小的划痕目标裁掉或缩到不可见,导致训练时传入无标注负样本,损失计算异常。可先关闭所有复杂增强,仅保留基础翻转、缩放,确认训练能正常跑通后再逐步添加增强策略。
- 调整batch size:batch size过小会导致批归一化层计算异常,建议batch size至少设为8,显存不足的话可换用更小的模型(如yolov5s)或适当降低输入分辨率。
快速验证方法
取10张左右标注确认无误的图片拆分训练、验证集,跑3-5轮短训练。如果损失正常下降、mAP有数值,说明问题出在全量数据集或全局参数配置;如果仍出现NaN,可检查你使用的YOLOv5代码是否为官方原版,有没有自行修改过损失计算相关的逻辑。
内容的提问来源于stack exchange,提问作者Data science folk
相关产品推荐
相关产品推荐

