#YOLOv5 实现目标检测训练自己的数据集
YOLOv5 实现目标检测(训练自己的数据集实现猫猫识别)
目前YOLOv5已经更新到v6.0版本了,本文适用于v3.0-v6.0间所有版本的各种配置,以及更新了YOLOv5的使用说明。需要注意的是v2.0之后版本的YOLOv5权重通用,但不兼容v1.0,因此不建议使用v1.0。
v6.0版本需要的Python版本>=3.7.0,PyTorch>= 1.7。v6.0版本新增yolov5 nano模型,其他模型结构也有修改,模型转换/导出友好,精度基本不变,速度相对于v5.0略有提升。
———————————————————————————————————
一、概要
2020年6月10日,Ultralytics在github上正式发布了YOLOv5。YOLO系列可以说是单机目标检测框架中的潮流前线了,YOLOv5并不是一个单独的模型,而是一个模型家族,包括了YOLOv5s(最小)、YOLOv5m、YOLOv5l、YOLOv5x(最大)。目前v6.0版本又新增一层YOLOv5n模型,代替YOLOv5s成为最小模型,在所有模型中速度更快但精度也更低。

由于YOLOv5是在PyTorch中实现的,它受益于成熟的PyTorch生态系统,支持更简单,部署更容易,相对于YOLOv4,YOLOv5具有以下优点:
速度更快。在YOLOv5 Colab notebook上,Tesla P100,我们看到每张图像的推理时间仅需0.007秒,这意味着每秒140帧(FPS),速度是YOLOv4的2倍还多。
精度更高。在Roboflow对血细胞计数和检测(BCCD)数据集的测试中,只训练了100个epochs就达到了大约0.895的平均精度(mAP)。诚然EfficientDet和YOLOv4的性能相当,但在准确率没有任何损失的情况下,看到如此全面的性能提升是非常罕见的。
体积更小。YOLOv5的权重文件是27兆字节。YOLOv4(采用Darknet架构)的权重文件是244兆。YOLOv5比YOLOv4小了近90%!这意味着YOLOv5可以更容易地部署到嵌入式设备上。
既然YOLOv5如此之棒,那我们就体验以下大神们的开源成果吧!
github地址:https://github.com/ultralytics/yolov5 [不到1M]
大神们还很贴心的把官方模型放到了网上,如果有梯子,可以下载下来直接测试一下,YOLOv5所有版本的源码和官方模型的下载地址:https://github.com/ultralytics/yolov5/tags。博主这边没梯子,不过也无关紧要啦,毕竟我们用YOLOv5是识别具体的某项东西,需要自己用数据集来训练模型,官方给的模型也不一定适合我们的业务场景。
至于YOLOv5的原理这里就不多讲了(其实是讲不清),感兴趣的可以自行搜索。话不多说,直接上干货!

二、环境配置
2.1 基本配置
首先将YOLOv5项目下载到本地,然后配置虚拟环境conda create -n yolov5 python==3.8(尽量一切操作都在虚拟环境中),在YOLOv5中尽量使用python3.7或python3.8。项目的测试平台为:
操作系统:windows10 IDE* :Pycharm* python版本:anaconda Pyhon3.8 pytorch版本:torch 1.10.0 cuda版本:11.3 显卡:RTX 3060
cuda和pytorch的安装这里不再阐述,国内的话建议下载下来torch和torchvision的whl再进行安装,防止网速不稳定出现安装错误。本文所用到的cuda和cudnn的具体版本如下所示。

如果安装的是GPU版本的pytorch,则不需要另外安装cuda,更不需要额外配置cudnn。pytorch的GPU版本自带cuda包,不需要和电脑环境变量里的cuda一致,只需要驱动能够兼容pytorch GPU版本的cuda包。需要特别注意的是,30系显卡不支持cuda10.0。 这里为了方便起见,我安装的是GPU版本的pytorch,pytorch所自带的cuda为11.3。

接着进入虚拟环境,使用pip安装必要模块(建议换成国内的源后进行安装):
代码语言:javascript
复制
2.2 pycocotools安装
本项目需要pycocotools模块,COCO是一个大型的图像数据集,用于目标检测、分割、人的关键点检测、素材分割和标题生成,在python中用COCO数据集需要安装pycocotools。但是在windows环境下无法直接通过pip安装pycocotools,安装方法如下: 先安装Visual C++ 2015 build tools:Microsoft Visual C++ Build Tools 2015,安装好后,在Terminal中执行下面命令:
代码语言:javascript
复制
执行后即可安装完毕。
2.3 apex安装(v3.1之后的版本不再需要安装apex)
apex是一款基于 PyTorch 的混合精度训练加速神器,单纯的inference实际上不需要apex模块,如果还要训练自己的数据集,就需要安装这个模块,安装方法如下: 在github上把apex项目下载或者git到本地,链接为:https://github.com/NVIDIA/apex。 ~~ 在terminal中激活pytorch的环境,并且进入到apex的文件夹下,在terminal中执行:~~
代码语言:javascript
复制
执行之后即安装完毕。~~ 具体安装教程可以参考该博文:[一文详解Apex的安装和使用教程(一款基于 PyTorch 的混合精度训练加速神器)_使用apex加速训练-博客]( "一文详解Apex的安装和使用教程(一款基于 PyTorch 的混合精度训练加速神器)_使用apex加速训练-博客")
执行后可以执行pip list命令查看当前环境下的所有模块,如果看到环境中有刚才安装的的模块,则环境已经配置完毕!
三、YOLOv5 实现训练
3.1 准备工作
首先从github上下载下来YOLOv5,楼主这里改名为yolov5-6.0-cat,因为是识别小猫猫的。然后在data目录下新建Annotations, images, ImageSets, labels 四个文件夹。 其中images存放的是原始的图片数据集,Annotations存放的是标记后生成的xml文件,labels存放的是保存标记内容的txt文件,ImageSets存放的是训练数据集和测试数据集的分类情况。
代码语言:javascript
复制

3.2 标记数据集
工欲善其事必先利其器,没有合适的训练数据集去训练模型,哪怕YOLOv5这个目标识别框架再优秀那也只是个花架子啊。所以第一步我们要去准备我们的训练数据集,楼主这里要识别的是家里的两只活泼可爱黏人乖巧听话的小猫猫,所以准备了五六十张猫猫的照片。制作数据集时,通常使用labelImg标注工具,具体用法这里不多做阐述,大家可以自行搜索,labelImg的GitHub为:https://github.com/tzutalin/labelImg。 这里楼主用了另一种感觉也好用的标记工具:精灵标记助手。使用起来那是相当的顺手啊,不仅操作简单上手快,还可以保存之前标注的数据集,方便后续对数据集标注内容的修改,还支持文本标注,视频标注,而且还免费,真的算是业界良心了。
下载地址:http://www.jinglingbiaozhu.com/
精灵标记助手标记界面如图所示:

数据集标记好后,将原始图片数据集放到images文件夹中,如图所示。

将精灵标记助手所生成的xml文件全部放入到Annotations文件夹中,如图所示。

3.3 构建数据集
在yolov5-6.0-cat的根目录下新建一个文件makeTxt.py,代码如下:
代码语言:javascript
复制
接着再新建另一个文件voc_label.py,切记,classes=[……] 中填入的一定要是自己在数据集中所标注的类别名称,标记了几个类别就填写几个类别名,填写错误的话会造成读取不出xml文件里的标注信息。代码如下:
代码语言:javascript
复制
分别makeTxt.py和voc_label.py。
makeTxt.py主要是将数据集分类成训练数据集和测试数据集,默认train,val,test按照8:1:1的比例进行随机分类,后ImagesSets文件夹中会出现四个文件,主要是生成的训练数据集和测试数据集的图片名称,如下图。同时data目录下也会出现这四个文件,内容是训练数据集和测试数据集的图片路径。

voc_label.py主要是将图片数据集标注后的xml文件中的标注信息读取出来并写入txt文件,后在labels文件夹中出现所有图片数据集的标注信息,如下图:

到此,本次训练所需的数据集已经全部准备好了。
3.4 文件修改
3.4.1 数据集方面的yaml文件修改
首先在data目录下,新建一份yaml文件,命名为cat.yaml,并仿照data文件夹下原有的coco.yaml的内容格式对cat.yaml进行配置。其中path,train,val,test分别为数据集的路径, nc为数据集的类别数,我这里只分了两类,names为类别的名称。这几个参数均按照自己的实际需求来修改。cat.yaml的代码如下:
代码语言:javascript
复制
3.4.2 网络参数方面的yaml文件修改
接着在models目录下的yolov5l.yaml文件进行修改,这里取决于你使用了哪个模型就去修改对于的文件,该项目中使用的是yolov5l模型(选用何种模型需根据项目的具体需求和GPU资源配置来定,大模型肯定更精确但是检测速度也更慢更占显存,小模型精度欠佳但是速度具有优势也更省显存 )。需要修改的代码如下:
代码语言:javascript
复制
3.4.3 train.py中的一些参数修改
最后,在根目录中对train.py中的一些参数进行修改,主要参数解释如下。我们平时训练的话,主要用到的只有这几个参数而已:–weights,–cfg,–data,–epochs,–batch-size,–img-size,–project。
代码语言:javascript
复制
3.5 训练模型
全部配置好后,直接执行train.py文件开始训练,这时候就到了考验显卡的时候,可以耐心的等上一两个小时,千万别手痒玩什么3A大作,否则电脑爆炸还得重新训练。 当程序界面出现如下所示并后续不报错的情况下,说明开始训练。
代码语言:javascript
复制
代码语言:javascript
复制
在训练中,也可以随时查看每一轮次训练的结果,可利用tensorboard可视化训练过程,训练开始时会在runs/train/exp文件夹中产生一个“events.out.tfevents.1608924773.JWX.5276.0”文件,利用tensorboard打开即可查看训练日志。首先我们通过cmd进去该YOLOv5所在的项目文件夹,然后激活所用的虚拟环境,输入如下命令行:
代码语言:javascript
复制
命令行输入信息的整体显示如下所示。如果这一步导致训练中断并报出cv::OutOfMemoryError的错误,则是因为内存不足导致,需更换轻量的模型或提高硬件设备。
代码语言:javascript
复制
到这一步后,我们就可打开 http://localhost:6006/ 网页查看每一轮次训练的结果,如图所示。我这里由于数据过少(只有62张)的原因,所有模型训练的很不精准。如果是用于正常工作的情况下,所需的数据集则要有成千上万张图片。



如果不更改训练结果所产生的路径的话,训练好后会在runs/train/exp文件夹得到如下文件,其中,我们训练好的权重为weights文件夹中的best.pt和last.pt文件,顾名思义,best.pt是训练300轮后所得到的最好的权重,last.pt是最后一轮训练所得到的权重。

训练好后可以选用验证集进行测试,测试文件为val.py。这里要明确的是,推理是直接检测图片,而测试是需要图片有相应的真实标签的,相当于检测图片后再把推理标签和真实标签做mAP计算。其实在train.py中的’–noval’已经设定好最终一次epoch完成后会自动进行测试,因此可以直接观察训练完成后文件夹内的结果文件和图片。
四、YOLOv5 实现检测
有了训练好的权重后,就可以就行目标检测测试了。直接在根目录的detect.py中进行调试,主要参数解释如下。我们平时用的话,主要用到的有这几个参数:–weights,–source,–img-size,–conf-thres,–project。
代码语言:javascript
复制
修改好参数后,直接执行detect.py文件,如果不更改检测结果所产生的路径的话,检测完成后会在runs/detect/exp文件夹得到检测后的视频。下面是输出视频的截图,可能是小猫的特征不是很明显,尤其是侧脸的识别效果并不是很好,训练数据集如果量大一点应该会有更好的效果。
