## YOLO
以下所述仅针对yolo...
### 炼丹技巧
#### 早停
粗略估算,每个类别2000次迭代,总迭代次数不低于4000次。
具体来说:
- 多次迭代仍不能降低平均损失值(avg loss)时 停止训练
- 早停后,从多个权重文件中选取表现最好的,这样或许可以避免过拟合。然后评估权重文件,选取mAP最大的或IoU最大的作为最终权重。
#### 提高精度策略
- **在.cfg文件中设置random=1,它会通过对不同分辨率的图片进行训练以提高精度**
> 这点相当重要,以至于我不得不再强调一次。
最近在其他人的复现版本中进行训练时,忘了开多尺度训练(他人复现版本**或不提供多尺度训练,或并不默认开启且文档中并未特别指明该命令(#`O′)**,导致效果相当相当差。。。这会才恍然大悟找到原因。。。悔死我了。。。
**举例来说**:
当我以608的size训练时,在同一个数据集(此数据集图片偏小大概在300x300的大小左右,而我训练时又忘记开多尺度预测,因此很难友好地检测出来,误差相当大)进行测试时
<pre class="EnlighterJSRAW" data-enlighter-language="null">>>> python detect.py --img-size 608 # 65张图片只有39张被正确识别
>>> python detect.py --img-size 416 # 65张图片中有59张被正确识别
</pre>
**总之 多尺度训练相当重要**
**血泪教训啊 求求读者多注意下吧555**
- 使用高分辨率的图像输入。在.cfg文件中设置height和width值。但是你无需重头训练,只需使用回416x416分辨率的权重数据就好了。
- 检查数据集标注是否正确符合规范
- 检查训练数据集数据量是否过少
- 迭代次数推荐不低于2000 * classes
- 如果图片里有很多数量的目标物体,那么在.cfg文件中最后的[yolo]层或[region]层中添加参数max=200,这也可以设定成更高的值。
- 如果目标物体很小(缩放成416x416尺寸后小于16x16),那么将第720行设置为layers = -1, 11,将第717行设置为stride=4
- **如果想要模型具有尺度的鲁棒性,则必须训练样本中包含多尺度的照片。这是因为YOLO不具有尺度变化的适应性。[大概是我犯的第二个失误]**
- 通过聚类算法获得anchorbox大小
YOLO炼丹经验