赞
踩
我本来是使用这个模型进行手写签名的定位,但是因为比赛的主办方原因,数据不允许公开,所以我使用动物世界的一段开头视屏来制作我的数据集。这整个模型跑通的过程中,我参考了很多不错的博客,写这篇博客的原因是记录一下我的所见所感。我的模型是在移动九天的平台上跑的。本文参考的博客如下:
YOLOv5训练自己的数据集(超详细完整版)
目标检测—教你利用yolov5训练自己的目标检测模型
写这篇文章的目的是为了能给大家一些建议,也是为了记录一下自己的成长。
识别模型有很多,但是目前比较实用的是YOLOV5,是一个国外的公司做的,比较好用。这是github的链接
万事开头难,我认为一个模型只要环境搭好了,模型就成功了90%。但是好在YOLOv5所需要的各种库都是比较热门的,没有各种坑,(此文主要给大家增加信心)所以我觉得环境是很好配的。
这里还是先建议大家创建虚拟环境,我是在服务器上跑的就没有创建。创建虚拟环境的教程,然后激活自己的虚拟环境就可以了。这里就不得不说服务器是真香。
YOLOv5的项目里面已经写好我们需要的环境,在requirements.txt中,所以我们只需要将github的代码拉到本地,然后一条命令就可以安装好:
pip install -r requirements.txt
我在服务器上跑的给大家演示:
出现上面的东西就大致OK了
接下来可以直接运行train.py检验自己的环境有没有配好,我认为这一步是很重要的,当我看到模型可以跑通的时候,给了我极大的信心。
如果直接运行,使用的数据集是默认的coco128第一次需要从官网上下载,然后就可以使用了,如果出现了epoch如上图所示,就说明模型已经开始训练了,环境已经配好了。也就是说以后都不用为这个模型的环境担忧了,恭喜迈出了一大步。
如果告诉你缺少包,缺啥就pip install 啥就行了,一般不会报错。
在运行成功后就可以制作自己的数据集准备训练了。
在这一小节,我们需要把视频进行逐帧处理,转化为图片,便于我们最终制作的数据集。这里我使用的是vedio_to_pictures
这个代码,程序会放到下面的附录里面。程序的主要作用就是将图片逐帧处理成一张一张的图片,并保存到当前目录下的allimages文件夹下。
我视频的基本信息是:
我是使用QQ自带的录屏录制的b站上一段视频(或者是其他网站上的,具体记不清了),得到的帧率是19.58帧每秒,总时长是69秒。所以得到图片数大约是19.58*69=1351张,最终我使用图片处理得到的图片是1357张,如下,大致符合。
大家可以根据得到的图片挑选一些图片制作自己的数据集,因为我最终使用了45张图片来制作我自己的数据集,所以我是手动挑选的。大家可以写一个随机函数自动挑选。
这一节是将上面得到的45张图片进行标注,制作成YOLO能够训练的数据集的标准样式。
首先看一下YOLO数据集的格式是物体的类别编号,x,y,w,h.
拿第一条数据来举例,比如:
0 0.21584984358706988 0.5041743970315399 0.11678832116788321 0.10296846011131726
第一个0是指此类对象的编码,这个当你标注完对象之后,就会自动的进行编号。后面的坐标分别表示目标的中心坐标和目标的宽和高,这里的宽和高是归一化之后的宽和高。
任何一款图像标注软件都是可以进行标注的,这里我选择的时候LabelImg(以上附有安装教程).标注的格式我这里选择的是voc格式(下图左边所示),后期会用代码将voc格式转化成YOLO格式,没有直接选择YOLO格式的原因是,我的labelImgYOLO格式标出来不是标准的,可能是我安装的版本太老的原因,也有同学是直接使用YOLO格式标注的,大家也可以进行尝试。
这里标注的时候有一些小技巧,比如提前更改要标注的类别、自动保存,一些快捷键,w键可以快速起框,d键切换下一张等等,记得要设置保存的文件夹。大家可以搜一下。
标注完成之后,voc得到的是xml文件。我这里是这样的
在这里进行一个格式的转化。
首先在YOLOv5文件夹下面新建一个data文件夹,我这里命名是hanzi_data:
然后在hanzi_data文件夹下面分别创建images文件夹(名字不可以更改)和Annotations文件夹,一个存放你要训练的图片,也就是我们标注的图片,一个存放我们的xml文件。 如下所示:
接下来进行划分训练集、测试集合验证集。这里是运行代码split_train_val.py
得到的,后面会给出连接,如果你的文件夹有改动,代码相应的修改
如果运行结果的文件夹没有修改的话,运行完成之后就会出现一个新的文件夹ImageSets。这里我们运行结果如下:
打开文件夹里面有个main文件夹,然后里面有test、train、trainval和val四个txt文件,里面都是图片的名称,没有后缀。我这里有个不速之客,是我的代码存放的问题,一般不会有,我这里直接删除即可。
这里是运行text_to_yolo.py
,然后就可以得到dataSet_path文件夹和labels文件夹,如下所示:
dataSet_path文件夹里面的三个txt分别存放的是你自己训练集、验证集、测试集的路径。
此时的label文件夹下的txt数据也是标准的YOLO模式,如下所示:
至此数据集制作完成,接下来准备训练啦。
在 yolov5 目录下的 data 文件夹下 新建一个 myvoc.yaml文件(可以自定义命名),用记事本打开。
内容是:
训练集以及验证集(train.txt和val.txt)的路径(可以改为相对路径)
以及目标的类别数目和类别名称。
选择一个模型,在yolov5目录下的model文件夹下是模型的配置文件,有n、s、m、l、x版本,模型依次复杂,权重依次增多,训练的时间的也依次增加。
这里我选择的是yolov5s,然后进行更改,如下所示:
python train.py --weights weights/yolov5s.pt --cfg models/yolov5s.yaml --data data/myvoc.yaml --epoch 200 --batch-size 8
–weights 自己权重的路径,看自己的yolov5s.pt所在的位置,你也许需要更改。
–cfg 模型配置的路径,也就是上一步更改的那个模型配置。
–data 是制作自己的数据集的时候建立自己配置文件的路径。
–epoch 训练的轮数
–batch-size 一次训练喂进去的照片数量,电脑配置不好就改小一点。
在训练的过程中会打印训练结果存储的位置,一般保存在runs/train/下最新的exp文件夹里面
我的训练好的模型存放在了runs/train/exp22下面
除此之外训练的exp下面还有你训练过程的图片:
里面还有一些其他的训练过程的图片:
R_curve 召回率Recall和置信度confidence之间的关系。
PR_curve PR曲线中的P代表的是Precision(精准率),R代表的是Recall(召回率),其代表的是精准率与召回率的关系.一般情况下,将recall设置为横坐标,precision设置为纵坐标。PR曲线下围成的面积即AP,所有类别AP平均值即map。AP值是衡量目标检测模型分类器性能优劣的重要评估指标,AP值越大则分类器性能越好,越小则分类器性能越差。
P_curve 精确率Precision和置信度confidence的关系图.
F1_curve 数学定义为 F1分数,又称为平衡F分数,它被定义为正确率和召回率的调和平均数.
confusion_matrix 指的是混淆矩阵.
模型检测的代码如下:
python detect.py --weights runs/train/exp/weights/best.pt --source ../data/video/animal.mp4
–weights 权重存放的位置
–source 你要检测的东西。支持图片,文件夹,视频和摄像头
这里我测试的是test_data下面的Animal.mp4
可以看到在跑视频的时候,他是一帧一帧的图像处理的,这就体现出他快的特性。
最后会保存到runs/detect/exp里面,如下所示
最终我的结果如下所示:
YOLO演示
模型到这里基本就结束了,遇到问题不要着急,机器是不会坏的,多尝试几次总是可以的。
在训练的时候也会生成数据缓存,在你的hanzi_data/dataSet_path文件夹下面,如果后面需要再次训练,可能需要删除一下。(我不删也没事)
我的数据是45张图片,使用了GPU,200个epochs大概训练了25分钟。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。