YOLOV3训练模型
YOLOv3 pytorch训练代码
将代码地址 中的代码下载下来
数据预处理
- 找数据集或者爬虫找需要中相应类的图片
- 使用labelImg 进行对图片标注 分类(快捷键w 创建矩形 d 上一张图片 a下一张图片)
- 对图片和对应的xml文件分类。 分为 训练集 测试集 验证集 。
A. 训练集用来训练模型 ;验证集 要调参 调整一些参数;测试集是拿来测试模型的,根据模型的反馈值和实际值来得出模型的效果)
B. 中文参考博客中博主写了一个makeText代码,需要将所有的图片放到data/images,xml文件放到data/Annotations 文件夹中
C. 代码中按照比例将原图片分为训练集和不训练,其中不训练的又分为验证集和测试集。按照比例(0.9 0.9)和随机实现,分别把文件名字写入到 data/ImageSets文件夹下 trainval.txt’没有参与训练的数据集
test.txt测试集 train.txt 训练集 val.txt 验证集
- 将数据转换为Darknet格式
A. 每个图像的 标签文件必须通过简单地更换可定位/images/.jpg与/labels/.txt在其路径名。保存在data/labels 文件夹中
B. 每个图像一个文件。每个对象是一行。每行都是classs x_center y_center weidth height
框坐标要严格按照标准化的xywh格式 (0到1)。类是从classes的索引。
C. 中文参考博客中也已经有了相应的代码 其中需要把 classes中改为相应的xml中的标签
修改配置文件
- 在data文件夹下新建rbc.names 写入类别
- 在data文件夹下新建 rbc.data 配置训练的数据
添加下面这些内容
> classes=1
train=data/train.txt
valid=data/test.txt
names=data/rbc.names
backup=backup/
eval=coco
其中的classes改成相应的类数
3. 对cfg文件进行修改
cfg文件夹下有四类cfg文件
其中 yolov3.cfg 效果最好 yolov3-spp.cfg 次之 yolov3-tiny.cfg 效果一般
对需要使用的cfg文件打开
搜索[yolo] 把出来的结果(每个都要改)下面的classes改为相应的类数
并且把[yolo]上面挨着的[convolutional] 下面的filters改为 3×(classes+5)的值
(每个框预测3个 有5个值 xywh truth)
net 下面的batch 是一次送进去的图片数 数量大会导致显卡不够 数量小精度会不够好
4. train.py为特定任务更新超参数,例如LR,LR调度程序,优化程序,扩充设置,multi_scale设置等。可以不改
训练模型
把数据预处理 和 修改相应配置文件后就可以进行训练代码了
使用命令
python train.py –data-cfg data/rbc.data –cfg cfg/yolov3-tiny.cfg –epochs 10
其中的epochs是迭代次数 训练好的模型会保存最好的那个 best.pt 在weights文件夹中
如果出现
shape ‘[128, 64, 3, 3]’ is invalid for input of size 59726
很有可能就是配置文件cfg文件没有改好
训练结果可视化
训练的结果保存在了 results.txt 文件中
project文件夹中utils代码中可以对results.txt文件进行解析并展示
在终端调用命令
python -c ‘from project.utils import *;plot_results() ‘
就可以调用utils代码中的plot_results()函数 将结果保存在项目文件夹下
测试
预测的图片要放到 data/samples 输出结果会放到 Output文件夹中
测试命令
python detect.py –data-cfg data/rbc.data –cfg cfg/yolov3-tiny.cfg –weights weights/best.pt
里面的很多参数可以进行修改
对视频进行检测识别
python detect.py –images ~/torch_code/yolov3-master/chendulingvideo2.mp4 –weights weights/best.pt
但是不是会显示出来的识别 逐帧识别 把结果保存到Output文件夹中(之前代码中的yolov3.weights 放到那里也可以使用 )
如果需要使用GPU训练 配好cuda 显卡驱动会自动cpu转为gpu
代码中指定使用的显卡
train.py中
在 if torch.cuda.device_count() > 1: 下面这句代码添加个参数
model = torch.nn.parallel.DistributedDataParallel(model,device_ids=[0,1,2])
(指的是使用三块显卡)
在 if name ==’main‘:下面
加上 os.senviron[“CUDA_VISIBLE_DEVICES”]=’5,6,7’
(指的是使用显卡中的索引为 5 6 7 的显卡)
ImageNet
知乎参考 https://zhuanlan.zhihu.com/p/42696535
csdn一个博客提供了下载地址 https://blog.csdn.net/xunan003/article/details/82905396
ImageNet官网 http://www.image-net.org/profile
注册学校电子邮箱账户方法 http://ic.zzuli.edu.cn/2019/0423/c8913a196221/page.htm
学校邮箱登录地址 http://kys.zzuli.edu.cn/cas/login?service=http%3A%2F%2Fcampus.zzuli.edu.cn%2Fportal-pc%2Flogin%2FpcLogin
使用第二个代码
参考代码 github
是在一个模型的基础上再次训练 这样可以提高效果
在config文件夹中 执行脚本文件 bash create_custom_model.sh
会根据类数修改yolov3.config 本质上跟上面代码是一样的 同时创建出yolov3-custom.config
修改custom.data 添加一些信息 (例如)
进入data文件夹 里面的custom 里面是训练放置的图片和label (txt格式) 修改classes.names 添加类名
需要创建train.txt valid.txt 训练集和验证集需要的图片路径
输入命令进行训练 python train.py –epochs 50 –model_def config/yolov3-custom.cfg –data_config config/custom.data
可以根据参数进行修改
目前还没解决的问题 每次迭代loss的保存 以及目前跑只使用一块显卡 这个不知道怎么改代码 需要再学习
效果比第一个要好的多。