YOLOV5介绍
YOLOV5是目前最火热的目标检测算法之一。YOLOV5为一阶段检测算法因此它的速度非常之快。可以在复杂场景中达到60祯的实时检测频率。
接下来本文将详细的讲述如何使用YOLOV5去训练自己的数据集
一、下载YOLOv5开源代码
1 | $ git clone https://github.com/ultralytics/yolov5.git |
YOLOV5中使用了Tensorboard和Wandb来可视化训练,其中Wandb配置可以看这篇文章:
Wandb安装与配置
二、构建YOLO数据集
数据集地址:MaskDetecion
下载好数据集之后将数据集解压到YOLOV5项目文件夹下的DataSets目录下(需要先新建一个DataSets文件夹)
划分数据集
将数据集划分为训练集、验证集、测试集:
1 | # coding:utf-8 |
划分完成之后会生成以下文件:
每个txt中的内容为xml的文件名:
生成YOLO格式的label
转换xml为txt
1 | import xml.etree.ElementTree as ET |
运行结束后会生成label文件夹和划分后三个数据集的具体文件路径
label中是转换出来的yolo格式数据集,分别为:标签类别,x:中心点x值/图片宽度,y:中心点y值/图片高度,w:目标框的宽度/图片宽度,h:目标框的高度/图片高度。
详情可参考博客:YOLO数据集标注
而生成的三个txt相当于在之前划分的数据集上加上了路径,方便直接读取
新建一个数据集配置文件
在data文件夹下新建一个mask.yaml文件,用来写数据集的一些配置,后续代码中也是通过读取yaml来读取数据集
1 | #数据集的路径,推荐用绝对路径 |
至此,数据集制作就结束了。
三、修改训练文件
修改训练的一些参数(由于github上项目一直在更新,不同的版本的参数可能不同,比如我最新下载这个没有freeze这个冻结参数的选项了。但最重要的几个一直都有)
1 | parser = argparse.ArgumentParser() |
其中action=’store_true’的参数默认是不开启的,在shell只需要键入这个参数的名称,不需要加值就可以开启,这类一般是True或False的选项,如果想在编译器中使用这个参数,则可以加一个default=True
推荐参数:
1 | python train.py --weights yolov5s.pt --cfg yolov5s.yaml --data data/mask.yaml --epochs 500 --cache-images --image-weights --multi-scale --linear-lr |
四、训练中遇到的一些报错问题
编码报错
‘gbk’ codec can’t decode byte 0xaf in position 15: illegal multitype sequence
解决方案:在trian.py中这个位置的open中加上utf-8的编码,test.py中也有这个错误,可以一起加上,可能是个bug,不知道官方为什么还没改过来。
找不到数据集或标签
AssertionError: No trains in D:\yolov5\train_data\train.cache. Can not train without trains.
AssertionError: No labels in D:\yolov5\train_data\train.cache. Can not train without labels.
这个错误很常见,根本原因还是数据集配置有问题,首先检查你数据集的data.yaml里面所有路径是否正确,其次检查train.txt、test.txt里面的路径是否正确,如果这些都没问题的话那就改接下来这处地方:
在utils里面的datasets.py中搜索define找到这个函数,将这里的images改成和你datasets目录下存储图片的文件夹的名字一样,比如你存储图片的文件夹叫JPEGImages,那么这里也要改成JPEGImages
libiomp5md.dll错误
这个报错是由于anaconda下存在多个libiomp5md.dll文件导致的,有两种解决方法:
- 删除anaconda对应环境中Libary文件夹下libiomp5md.dll文件,再运行项目时会自动生成一个libiomp5md.dll文件
- 在train.py中加上这句话,允许多个lib文件同时运行
1
os.environ['KMP_DUPLICATE_LIB_OK']='TRUE'
libpng warning: iCCP
libpng warning: iCCP: known incorrect sRGB profile
这个错误可能是由于一些图片中存在错误格式,且anaconda的libpng版本过高导致的,解决的方法大致有两种: - 替换掉anaconda中的库,详情可以查看这篇文章并且他提供了一个不会报错的版本。
替换anaconda中的libpng库 - 将所有数据集中的图片重新编码一下,代码如下:
1 | import os |
五、测试
测试文件为test.py,大部分参数解释和train是一样的,其实train.py中的验证代码用的就是test.py中的内容,这里做测试的话只需要把–task这个参数改成test就行
六、训练、测试结果
在训练、测试结束后会生成很多文件,这里来大致解析一下这些文件分别是什么意思:
我的保存路径在train下面,exp就是第一轮训练的结果,其中weights文件夹下面是训练生成的权重文件,也可以说是模型,best.pt是表现最好的模型,last.pt是最后一轮生成的模型
比较重要的是result.png里面是模型整体训练的一个情况,从这里能看到绝大部分信息。
接下来是一些分类问题的评分指标:confusion_martix.png、F1_curve.png、P_curve.png、R_curve.png、PR_curve.png
两个参数文件:hyp.yaml/opt.yaml分别是模型的初始参数以及训练的初始超参数
三个events….为tensorboard的日志文件
train_batch\test_batch分别为训练和测试前三个batch的结果后缀为labels为标签,pred为预测的情况,可以从这里大致看出模型的一个实际效果。
七、检测
检测文件为detect.py,只需要提供你想要检测的内容,包括图片、视频、调用摄像头,这个参数为
–source,给一个路径或者0,0为调用摄像头
这是我实时检测的效果,可以说还不错
这次关于YOLOV5的训练步骤就结束了,如有错误请及时指正,后续还会继续更新一些相关的知识,感谢观看!
References
https://blog.csdn.net/xiaosangtongxue/article/details/124083959
https://zhuanlan.zhihu.com/p/549163975
https://blog.csdn.net/banyueju/article/details/91553248?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control
https://qichenxi.blog.csdn.net/article/details/124234388?spm=1001.2014.3001.5506
https://blog.csdn.net/qq_44785351/article/details/127465183?spm=1001.2014.3001.5502
https://blog.csdn.net/banyueju/article/details/91553248?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control