yolo训练总结
上一年总结的旧文章,也许对新接触yolo
的有点帮助.
数据生成
via网页标注的数据需要经过一系列转换,才能适配yolo的训练,主要步骤包括如下:
- 根据标注json生成 每一张图片的标注label: xxx.txt
xxx.txt格式(数值都是除以图片实际宽高保存的):
类名 box矩形中心x坐标 box矩形中心y坐标 box矩形宽 box矩形高
- 同时会将图片压缩成1536,保存到image 文件夹中
- 最后会把train 以及 val 要训练的图片路径分别保存起来,以让模型读取.
分享:
多线程以及jupyter进度条的集合
yolo环境搭建
这一步没有耗费多少时间,根据官网一步一步走就没问题
darknet官网
训练命令行:
- 进入darknet目录
- 运行命令:
./darknet detector train ../_question/question.data ../_question/question1280TR.cfg -i 1
-i 1 :
指定gpu:1.[吐槽:为什么是 i 的简写]
训练过程中的遇到的问题
想要不出意外,不踩坑:
- 数据集符合要求是一个方面
- 另外一方面就是cfg的配置
训练过程中的log数据解读:
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.000000, .5R: -nan, .75R: -nan, count: 0 |
Region 23 Avg IOU: 0.860543, Class: 0.999887, Obj: 0.962618, No Obj: 0.000232, .5R: 1.000000, .75R: 0.950000, count: 20 |
11670(当前迭代batch次数): 0.225856(总体loss), 0.287980 avg(平均loss), 0.000100 rate(当前的学习率,在cfg中定义), 11.322880 seconds(当前batch耗费时间), 1867200 images(参与训练的图片总数) |
1. Region 16, Region 23
:(存疑)
- 不同尺度(16,23)卷积层上预测到的不同大小的框的参数
- 16 卷积层为最大的预测尺度, 使用较大的 mask, 但是可以预测出较小的物体; 都nan,或为0,说明在 16 卷积层中什么物体都检测不出来.
- 23 卷积层为最小的预测尺度, 使用较小的 mask, 可以预测出较大的物体.
2. Avg IOU: 0.860543
:
- IOU- [标注的box面积] 和 [训练检测出的box面积] 重合率.
- 具体算法如下:
3. Class: 0.999887
:
box分类的正确率
4. Obj: 0.962618, No Obj: 0.000232
:
- Obj: 越接近 1 越好
- No Obj: 期望该值越来越小, 但不为零
- 具体什么含义还是不太清楚
参考资料:
https://blog.csdn.net/gzj2013/article/details/82285511
https://blog.csdn.net/fendoubasaonian/article/details/78981636
https://blog.csdn.net/ll_master/article/details/81392013
https://timebutt.github.io/static/understanding-yolov2-training-output/
问题记录
问题1 模型无法预测效果
现象:
检测模型效果时, kernel have died
解决:
backup路径写错
因为是C
写的,在notebook上没有输出具体的错误log,导致在这个问题上卡了比较久,最终在jupyter.log中定位到问题原因.
问题2 训练一会儿 就中断
解决:
排查了不少时间,发现是xxx.data
中设置的backup 路径
没有创建,导致backup保存失败,进而训练中断
问题3 无法进行训练
现象1:
训练无法开始. 也没有什么报错信息
解决:
训练类别增加后,需要更改4个参数
- xxx.data 中
classes
需要改变 - xxx.names 中需要添加对应类别名称
- xxx.cfg 中 [yolo]层中的
classes
需要与类别对应 - xxx.cfg 中 [yolo]层的上一层[convolutional]的
filters
需要更改:filters=(classes + 5)* mask的数量. 参考链接
现象2:
训练无法开始. 报错信息:
./darknet: error while loading shared libraries: libcudart.so.10.0: cannot open shared object file: No such file or directory
解决:
因为cuda 路径 darknet 没有检测到,输入临时路径命令:
export LD_LIBRARY_PATH=/usr/local/cuda/lib64 && sudo ldconfig
然后再执行训练命令即可
nohup ./darknet detector train ../xxxx/xxxx.data ../xxxxx/xxxx1280TR_1.cfg -i 0 >> 1280TR_0625_train1.txt &
现象3:
训练无法开始. 报错信息:
8Cannot load image "/mobileHDD/xxxx/images/xxx_ (7416).jpg"
STB Reason: unknown image type images
解决:
图片压缩尺寸存在问题,需要重新生成图片.
问题4 模型检出物体效果极差
现象:
- loss 在1.9 左右
- thresh = 0.5,无题号检出.
- 只有thresh 调到0.01,才有部分物体能检测出来,并且有非常多错误的box,box 非常小
推测1:
根据[现象2],推测有可能是cfg
中anchors
大小不正确,采用kmeans
聚类分析 anchors
大小.
因为新一批数据含有非常多得用户真实数据,而用户真实数据的题号大小波动范围非常大,原来的anchors
不适合了.
推测2:
图片尺寸没有归一导致.
不知道怎么解决的了,有可能是两个问题同时出现,导致了这个现象.到晚上9点才解决.左侧脑袋疼...用脑过度,硬怼把这个问题解决了....
- 重新生成数据,不是使用原图尺寸,而是使用1280px
- anchors增加到21个
目前来看都正常了.....
问题5: 部分物体检测比较好,部分非常差
现象:
- loss:
其它训练log:
[某类物体检测] 在用户图片中非常容易漏掉,对应[log]中
obj
较低 而在其它数据中效果较好,有些连一个都没有检测到.[另外一类检测] 基本没有效果
某类物体漏检非常严重
2~4点 都是 thresh= 0.1
的情况下
非常反常!按理来说,loss下降到0.5左右,效果应该是比较好的,但是却明显比之前的效果差
推测:
脏数据太多,一共发现近200张含脏数据的图片.(图片颠倒,漏标,错标,二值化),去除掉这部分后再训练看看 是否会好很多.
推测否定:
剔除脏数据后,训练结果中 现象仍然存在,但题号检测率高了不少.
- loss = 0.6
- 但obj 在0.3-0.6之间.仍然非常低,正常值应该在0.8以上.
- 在跑结果时发现一个现象:某类物体面积大一点,检测率非常低,而小面积的物体基本比较正常
因此,推测是anchors 设置不合理导致的,anchors设置太小导致
参数理解:
mask
- 为了达到在不同[yolo]层使用不同大小的anchors的目的,使用mask作为anchors的下标[index]
大概意思就是在浅层的[yolo]中使用较大的 anchors,粗略的把检测目标框选到,在深一层中,使用较小的anchors 更为精细地框选到检测目标.
- 作者原话:
每一层我们都得知道所有的boxes大小.但是只会使用一部分的boxes去
- mask 与上一层[convolutional] 的filters 是关联的. 只有当 filters = (classes +5)* [mask数量]的时候训练才能进行,否则会报错:输出层和输入层的数量不对应
darknet: ./src/parser.c:315: parse_yolo: Assertion `l.outputs == params.inputs' failed
参数解读: https://blog.csdn.net/phinoo/article/details/83022101
我的滴滴云专属AI大师码:3388,
购买滴滴云GPU等AI产品输入大师码享9折优惠。
点击 www.didiyun.com前往滴滴云官网购买
本篇文章由一文多发平台ArtiPub自动发布