YOLO炼丹经验

YOLO

以下所述仅针对yolo...

炼丹技巧

早停

粗略估算,每个类别2000次迭代,总迭代次数不低于4000次。
具体来说:

  • 多次迭代仍不能降低平均损失值(avg loss)时 停止训练
  • 早停后,从多个权重文件中选取表现最好的,这样或许可以避免过拟合。然后评估权重文件,选取mAP最大的或IoU最大的作为最终权重。

提高精度策略

  • 在.cfg文件中设置random=1,它会通过对不同分辨率的图片进行训练以提高精度

这点相当重要,以至于我不得不再强调一次。
最近在其他人的复现版本中进行训练时,忘了开多尺度训练(他人复现版本或不提供多尺度训练,或并不默认开启且文档中并未特别指明该命令(#`O′),导致效果相当相当差。。。这会才恍然大悟找到原因。。。悔死我了。。。

举例来说
当我以608的size训练时,在同一个数据集(此数据集图片偏小大概在300x300的大小左右,而我训练时又忘记开多尺度预测,因此很难友好地检测出来,误差相当大)进行测试时

>>> python detect.py --img-size 608 # 65张图片只有39张被正确识别
>>> python detect.py --img-size 416 # 65张图片中有59张被正确识别

总之 多尺度训练相当重要
血泪教训啊 求求读者多注意下吧555

  • 使用高分辨率的图像输入。在.cfg文件中设置height和width值。但是你无需重头训练,只需使用回416x416分辨率的权重数据就好了。
  • 检查数据集标注是否正确符合规范
  • 检查训练数据集数据量是否过少
  • 迭代次数推荐不低于2000 * classes
  • 如果图片里有很多数量的目标物体,那么在.cfg文件中最后的[yolo]层或[region]层中添加参数max=200,这也可以设定成更高的值。
  • 如果目标物体很小(缩放成416x416尺寸后小于16x16),那么将第720行设置为layers = -1, 11,将第717行设置为stride=4
  • 如果想要模型具有尺度的鲁棒性,则必须训练样本中包含多尺度的照片。这是因为YOLO不具有尺度变化的适应性。[大概是我犯的第二个失误]
  • 通过聚类算法获得anchorbox大小