YOLOv5训练自己的数据集实现视频的识别

写在前面

我本来是使用这个模型进行手写签名的定位,但是因为比赛的主办方原因,数据不允许公开,所以我使用动物世界的一段开头视屏来制作我的数据集。这整个模型跑通的过程中,我参考了很多不错的博客,写这篇博客的原因是记录一下我的所见所感。我的模型是在移动九天的平台上跑的。本文参考的博客如下:
YOLOv5训练自己的数据集(超详细完整版)
目标检测—教你利用yolov5训练自己的目标检测模型

写这篇文章的目的是为了能给大家一些建议,也是为了记录一下自己的成长。

1.环境

识别模型有很多,但是目前比较实用的是YOLOV5,是一个国外的公司做的,比较好用。这是github的链接

万事开头难,我认为一个模型只要环境搭好了,模型就成功了90%。但是好在YOLOv5所需要的各种库都是比较热门的,没有各种坑,(此文主要给大家增加信心)所以我觉得环境是很好配的。
这里还是先建议大家创建虚拟环境,我是在服务器上跑的就没有创建。创建虚拟环境的教程,然后激活自己的虚拟环境就可以了。这里就不得不说服务器是真香。
YOLOv5的项目里面已经写好我们需要的环境,在requirements.txt中,所以我们只需要将github的代码拉到本地,然后一条命令就可以安装好:

pip install -r requirements.txt

我在服务器上跑的给大家演示:
在这里插入图片描述
出现上面的东西就大致OK了

接下来可以直接运行train.py检验自己的环境有没有配好,我认为这一步是很重要的,当我看到模型可以跑通的时候,给了我极大的信心。
在这里插入图片描述
在这里插入图片描述
如果直接运行,使用的数据集是默认的coco128第一次需要从官网上下载,然后就可以使用了,如果出现了epoch如上图所示,就说明模型已经开始训练了,环境已经配好了。也就是说以后都不用为这个模型的环境担忧了,恭喜迈出了一大步。

如果告诉你缺少包,缺啥就pip install 啥就行了,一般不会报错。

在运行成功后就可以制作自己的数据集准备训练了。

2.制作自己的数据集

2.1 视频转图片

在这一小节,我们需要把视频进行逐帧处理,转化为图片,便于我们最终制作的数据集。这里我使用的是vedio_to_pictures这个代码,程序会放到下面的附录里面。程序的主要作用就是将图片逐帧处理成一张一张的图片,并保存到当前目录下的allimages文件夹下。
我视频的基本信息是:
在这里插入图片描述
我是使用QQ自带的录屏录制的b站上一段视频(或者是其他网站上的,具体记不清了),得到的帧率是19.58帧每秒,总时长是69秒。所以得到图片数大约是19.58*69=1351张,最终我使用图片处理得到的图片是1357张,如下,大致符合。
在这里插入图片描述

大家可以根据得到的图片挑选一些图片制作自己的数据集,因为我最终使用了45张图片来制作我自己的数据集,所以我是手动挑选的。大家可以写一个随机函数自动挑选。

2.2 标注图片制作标准数据集

这一节是将上面得到的45张图片进行标注,制作成YOLO能够训练的数据集的标准样式。

标准数据集的样子

首先看一下YOLO数据集的格式是物体的类别编号,x,y,w,h.
在这里插入图片描述
拿第一条数据来举例,比如:

0 0.21584984358706988 0.5041743970315399 0.11678832116788321 0.10296846011131726

第一个0是指此类对象的编码,这个当你标注完对象之后,就会自动的进行编号。后面的坐标分别表示目标的中心坐标和目标的宽和高,这里的宽和高是归一化之后的宽和高。

用labelImg标注自己的数据集

任何一款图像标注软件都是可以进行标注的,这里我选择的时候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文件,里面都是图片的名称,没有后缀。我这里有个不速之客,是我的代码存放的问题,一般不会有,我这里直接删除即可。

在这里插入图片描述

XML格式转yolo_txt格式

这里是运行text_to_yolo.py,然后就可以得到dataSet_path文件夹和labels文件夹,如下所示:

在这里插入图片描述
dataSet_path文件夹里面的三个txt分别存放的是你自己训练集、验证集、测试集的路径。

在这里插入图片描述
此时的label文件夹下的txt数据也是标准的YOLO模式,如下所示:

在这里插入图片描述
至此数据集制作完成,接下来准备训练啦。

建立自己的配置文件

在 yolov5 目录下的 data 文件夹下 新建一个 myvoc.yaml文件(可以自定义命名),用记事本打开。
内容是:
训练集以及验证集(train.txt和val.txt)的路径(可以改为相对路径
以及目标的类别数目和类别名称。
在这里插入图片描述

3.模型的训练

更改模型配置

选择一个模型,在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演示

模型到这里基本就结束了,遇到问题不要着急,机器是不会坏的,多尝试几次总是可以的。

4 相关问题

训练缓存

在训练的时候也会生成数据缓存,在你的hanzi_data/dataSet_path文件夹下面,如果后面需要再次训练,可能需要删除一下。(我不删也没事)
在这里插入图片描述

训练时间

我的数据是45张图片,使用了GPU,200个epochs大概训练了25分钟。

在这里插入图片描述

代码附录

vedio_to_pictures
split_train_val.py
text_to_yolo.py

猜你喜欢

转载自blog.csdn.net/weixin_53665577/article/details/129648364