提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
最近需要使用到图像识别的功能,学习了一下YOLOv5,花了几天时间,遇到不少的坑,网上冲浪最后终于是完成了模型的训练,这里简单记录一下。
看网上的教程有很多是介绍5.0版本的,即YOLOv5 5.0,包括我自己最初也是下载的YOLOv5 5.0,只是后来训练过程中有很多问题,也一个一个的很解决,有些解决了,有些没有,然后网上看到一位大佬说5.0版本更新了很多次,前期有许多问题,后面好多了,建议使用6.1之后的版本。然后我果断放弃5.0版本了(主要是折腾怕了,搞了一整天了)。我建议出现各种问题现在正在寻找解决办法的网友也使用最新版本,我下载的是7.0的版本。点这里下载。
具体的环境安装这里不再赘述,其他博主已经讲了很多了,这里也没什么大的不太。
使用anaconda新建一个环境,打开anaconda prompt,输入:
conda create -n yolo python=3.9
创建一个叫yolo的环境,安装的python为3.9版本的,这个版本比较适合yolov5训练数据,原因就是,我也试过其他版本,就这个比较顺利[/苦笑ing/]。
进入到yolo的根目录下
cd [yolo文件夹目录]
激活yolo环境
conda activate yolo
就可以安装python库了,如下命令:
pip install -r requirements.txt
一定要定位到跟目录下运行,因为requirements.txt就在根目录下,根目录指yolov5项目下最开始的目录(强行解释ing)
如果安装太慢,可以使用清华镜像源
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
速度 呜 呼 起飞~
此外,有一点需要注意,据网友反映,以上方式安装某些库时,也会出现一些错误,默认是安装较新版本的,因为是’>='号嘛。
这边建议手动修改一下requirements.txt文件,或者自己pip安装对应的库,哪些库呢,一个是opencv-python,改为:opencv-python==4.5.1.48,修改为4.5.x的版本就行,不要太高了;还有一个是Pillow,改为Pillow==9.5。
训练模型最终需要的就是权重文件,YOLO官方提供了几个预训练权重模型,使用这个文件可以减少自己训练模型的最终训练时间。当然,不使用这个文件也行,直接运行训练,则代码会随机选择参数然后训练,这样的结果是如果运气不好,随机选择的参数太偏了,则极大的耗费训练时间,所以还是建议刚开始选中现有的预训练模型,这是官网 下载 ,选择yolov5s.pt下载即可,后面我们训练也使用yolov5s的模型训练,找对应的即可,唯一的问题是github网站上下载不稳定,建议连接手机热点下载,耐心等待。
yolov5文件夹下可以找到detect.py文件,打开查看parse_opt函数,第一个参数“–weights”,default=ROOT / ‘yolov5s.pt’,所以将在上一小节中下载的yolov5s.pt文件放置在与detect.py文件相同的路径下,确认无误之后运行detect.py,你可以在IDE中运行,也可以在终端中运行。
终端输入:
python detect.py
如果没有报错,则没问题,且在ROOT目录下会新建一个run文件夹,run/detect/exp路径下会出现两张检测好的图片,这是代码自带的两张图片,用于测试。
如果没有成功运行,检测自己环境的配置,学会查看报错代码。
根据自己的目标选择对应的数据集,对图片打好标签,使用labelimg工具,没有的先安装
pip install labelimg
labelimg
然后对图片打标签就是了,记得设置好保存文件夹路径哦~
最终的数据集目录结构为:
images文件夹中的图片的名称必须要与labels文件夹中的txt文件的名称一致,仅仅是文件后缀不同。如果是500张图片的话,建议train文件夹中放置400张,val文件夹下放置60张,test文件夹下放置40张,当然这只是我的建议,没有验证过的【笑脸ing】。
有些数据集是自带标签的,这个很不错,打标签的日子太煎熬【哭脸ing】。然后,可能有些标签文件格式是.xml的,这时就需要将其转化为txt文件了,具体操作可以看看这一篇文章将xml文件转yolov5训练数据txt标签文件,附带代码下载哦。
接下来就是train.py的时间咯~
与detect.py一样在根目录下,打开train.py 文件,主要修改几个参数。当然在修改参数前,先创建两个配置文件吧,data/VOC.yaml,复制这个文件,然后修改文件名VOC_mydataset1.yaml(名字啥的你喜欢就好,重点是文件里的内容),严格按照格式填写,如下图样式,只修改绿色部分代码。
path:这是数据集文件夹的绝对路径
train:相对路径,如images/train,如果你按照上面介绍的路径结构放置图片,则这下面三个内容可以不用修改,只需要写对path对应的路径
val:同上
test:同上,也可以不写,因为train.py运行时不涉及测试图片,只需要训练集train以及验证集val
names:列举所有的标签种类名
nc:标签种类的数量,如下图,我训练的数据集涉及20个对象,填20就是了
同上一小节,进入models文件夹,复制yolov5s.yaml文件,注意这儿因为我们使用的权重是yolov5s.pt,对应的都是“s”,如果你想使用yolov5x.yaml模型也行,那你需要的权重就应选用yolov5x.pt,复制之后粘贴更改名字,我的之间改为yolov5s_mydataset1.yaml,简单明了(赞~)。这个文件只需要修改nc的值,与上一节一个意思,我这改为20,保存退出。
修改以下参数:
“–weights”:权重文件路径,如图修改即可;
“–cfg”:模型配置文件,即刚才创建的models文件夹下的yolov5s_mydataset1.yaml
“–data”:数据集配置文件,刚才创建的data文件夹下的VOC_mydataset1.yaml
保存运行即可。
默认使用GPU训练数据,如果没有GPU就使用CPU,相信我,CPU的训练速度会让你大吃一惊的(煎熬啊~)
使用GPU需要安装torch库,不过相信能走到这里的都已经安装好了,就是cuda的版本可能会不同,版本不对可能出现一些莫名的错误,比如训练时loss下方的值一直显示为 nan,尝试如下操作可解决:
在132行,或者“Ctrl+F”查找“amp”,如上所示,注释掉amp = check_amp(model) # check AMP,然后改为amp=False 成功解决。
再讲一下训练过程。
可能需要使用到Arial.ttf字体文件,一般是自动下载,然后网速慢下载失败需要自己下载,然后可以放置在跟目录下,或者放置在它原放置路径也行,如图:
每一轮训练,有一些数值显示,如各种loss,这些loss是随着训练轮数增加而减少的,表示模型逐渐成型,还有平均精度值mAp50,P值,R值,如果这些数值为0,且一直都没变,比如下图有0、有nan值,则说明出现问题了,需要停止运行,检测代码,下图就是我在数天探索之中遇到的其中一个不大不小的问题而已(哭死,当时不知道,就让它训练了近一个小时,结果啥也没用),问题好像是版本不同造成的,按照上一小节的方法可以解决。
这是正常运行的截图:
忘记设置禁止休眠了,跑了7个小时……不过好在训练好了,300张图片,训练200轮,最后的检测结果不算很好,比较图片少,类别多嘛,训练轮数也不多,后来用了1000张图片训练,也是200轮,不过是在前一次训练好的权重文件的基础上进行训练的,加起来相当训练400轮了吧,不知道这样算对不对(哈哈哈),然后识别成功率的确提升了不少,如图:
当然,也有一些错误,比如这张,你说它是猫(cat)吗?[滑稽]
感谢各位的浏览,希望能提供给各位友友们帮助,解决一些问题,祝各位万事顺利[加油]!