yolo3 入手必看[巨详细]

2020-06-12  本文已影响0人  绮怀先生

yolo训练总结

上一年总结的旧文章,也许对新接触yolo的有点帮助.

数据生成

via网页标注的数据需要经过一系列转换,才能适配yolo的训练,主要步骤包括如下:

  1. 根据标注json生成 每一张图片的标注label: xxx.txt
xxx.txt格式(数值都是除以图片实际宽高保存的):
类名 box矩形中心x坐标 box矩形中心y坐标 box矩形宽 box矩形高

image
  1. 同时会将图片压缩成1536,保存到image 文件夹中

image

  1. 最后会把train 以及 val 要训练的图片路径分别保存起来,以让模型读取.

image

分享:
多线程以及jupyter进度条的集合

image

yolo环境搭建

这一步没有耗费多少时间,根据官网一步一步走就没问题
darknet官网

训练命令行:

  1. 进入darknet目录
  2. 运行命令:
    ./darknet detector train ../_question/question.data ../_question/question1280TR.cfg -i 1

-i 1 :指定gpu:1.[吐槽:为什么是 i 的简写]

image

训练过程中的遇到的问题

想要不出意外,不踩坑:

  1. 数据集符合要求是一个方面
  2. 另外一方面就是cfg的配置

训练过程中的log数据解读:

image
<p align="left">Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.000000, .5R: -nan, .75R: -nan, count: 0</p>
<p align="left">Region 23 Avg IOU: 0.860543, Class: 0.999887, Obj: 0.962618, No Obj: 0.000232, .5R: 1.000000, .75R: 0.950000, count: 20</p>
<p align="left">11670(当前迭代batch次数): 0.225856(总体loss), 0.287980 avg(平均loss), 0.000100 rate(当前的学习率,在cfg中定义), 11.322880 seconds(当前batch耗费时间), 1867200 images(参与训练的图片总数)</p>

1. Region 16, Region 23:(存疑)

2. Avg IOU: 0.860543:

image

3. Class: 0.999887:

box分类的正确率

4. Obj: 0.962618, No Obj: 0.000232:

参考资料:

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

image

解决:

backup路径写错
因为是C写的,在notebook上没有输出具体的错误log,导致在这个问题上卡了比较久,最终在jupyter.log中定位到问题原因.

image

问题2 训练一会儿 就中断

解决:

排查了不少时间,发现是xxx.data 中设置的backup 路径没有创建,导致backup保存失败,进而训练中断

问题3 无法进行训练

现象1:

训练无法开始. 也没有什么报错信息

解决:

训练类别增加后,需要更改4个参数

  1. xxx.data 中 classes 需要改变
  2. xxx.names 中需要添加对应类别名称
  3. xxx.cfg 中 [yolo]层中的classes需要与类别对应
  4. 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 模型检出物体效果极差

现象:

  1. loss 在1.9 左右
  2. thresh = 0.5,无题号检出.
  3. 只有thresh 调到0.01,才有部分物体能检测出来,并且有非常多错误的box,box 非常小

推测1:

根据[现象2],推测有可能是cfganchors大小不正确,采用kmeans 聚类分析 anchors 大小.
因为新一批数据含有非常多得用户真实数据,而用户真实数据的题号大小波动范围非常大,原来的anchors不适合了.

推测2:

图片尺寸没有归一导致.

不知道怎么解决的了,有可能是两个问题同时出现,导致了这个现象.到晚上9点才解决.左侧脑袋疼...用脑过度,硬怼把这个问题解决了....

  1. 重新生成数据,不是使用原图尺寸,而是使用1280px
  2. anchors增加到21个

目前来看都正常了.....

问题5: 部分物体检测比较好,部分非常差

现象:

  1. loss:
image

其它训练log:

image
  1. [某类物体检测] 在用户图片中非常容易漏掉,对应[log]中obj较低 而在其它数据中效果较好,有些连一个都没有检测到.

  2. [另外一类检测] 基本没有效果

  3. 某类物体漏检非常严重

2~4点 都是 thresh= 0.1的情况下
非常反常!按理来说,loss下降到0.5左右,效果应该是比较好的,但是却明显比之前的效果差

推测:

脏数据太多,一共发现近200张含脏数据的图片.(图片颠倒,漏标,错标,二值化),去除掉这部分后再训练看看 是否会好很多.

推测否定:

剔除脏数据后,训练结果中 现象仍然存在,但题号检测率高了不少.

  1. loss = 0.6
image
  1. 但obj 在0.3-0.6之间.仍然非常低,正常值应该在0.8以上.
image
  1. 在跑结果时发现一个现象:某类物体面积大一点,检测率非常低,而小面积的物体基本比较正常

因此,推测是anchors 设置不合理导致的,anchors设置太小导致

参数理解:

mask

  1. 为了达到在不同[yolo]层使用不同大小的anchors的目的,使用mask作为anchors的下标[index]
    大概意思就是在浅层的[yolo]中使用较大的 anchors,粗略的把检测目标框选到,在深一层中,使用较小的anchors 更为精细地框选到检测目标.
image
  1. 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自动发布

上一篇下一篇

猜你喜欢

热点阅读