【YOLOv5】初体验
1、 Yolov5简介
Yolov5官方代码中,给出的目标检测网络中一共有4个版本,分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x四个模型。
Yolov5的结构和Yolov4很相似,但也有一些不同。
上图即Yolov5的网络结构图,可以看出,还是分为输入端、Backbone、Neck、Prediction四个部分。
大家可能对Yolov3比较熟悉,因此大白列举它和Yolov3的一些主要的不同点,并和Yolov4进行比较。
**(1)输入端:**Mosaic数据增强、自适应锚框计算、自适应图片缩放
**(2)Backbone:**Focus结构,CSP结构
**(3)Neck:**FPN+PAN结构
**(4)Prediction:**GIOU_Loss
Yolov5作者也是在COCO数据集上进行的测试,COCO数据集的小目标占比,因此最终的四种网络结构,性能上来说各有千秋。Yolov5s网络最小,速度最少,AP精度也最低。但如果检测的以大目标为主,追求速度,倒也是个不错的选择。其他的三种网络,在此基础上,不断加深加宽网络,AP精度也不断提升,但速度的消耗也在不断增加。
总结:在目标检测领域,速度比YOLO快的,精度基本没有YOLO高。精度比YOLO高的,速度基本没有YOLO快。
2、环境依赖
本人环境声明:
主机:极链AI云GPU服务器,GPU为TITAN Xp 24。配置如下。
系统:ubuntu 18.04
开发工具:vscode+ssh
step1、克隆项目
YOLOv5源码托管在github上:
git clone https://github.com/ultralytics/yolov5.git
step2、安装必要的环境
- 下载[Anaconda],执行安装指令:
bash /your_dir/Anaconda3-2021.05-Linux-x86_64.sh
如若不更改安装路径,一直回车或者输入yes即可完成安装
接下来创建YOLOv5的虚拟环境,以便于隔离不同Python版本之间的影响:
conda create --name YOLOv5 python=3.8#创建虚拟环境
conda activate YOLOv5#激活虚拟环境
-
安装Pytorch,在官网可以找到安装指令,选择Stable(1.9.0)版本,Linux操作系统,Conda开发环境,Python开发语言,CUDA 11.1。便能得到安装指令:
conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c nvidia
- 安装其他必备环境,YOLOv5其他必备环境都写在代码包里面,有个requirements.txt文件,其中包括了一些基本的必备环境。只需执行如下指令即可安装。
pip install -U -r requirements.txt
3 、设置样本数据和标签
此次样本数据来自某电厂的仪器仪表数据,主要是识别照片中的仪器仪表位置。
首先,通过一个简单的脚本rename.py为这些照片进行重命名:
#rename.py
#coding:UTF-8
import os
folder_path = "/样本数据的路径/"
file_list = os.listdir(folder_path)
os.chdir(folder_path)
n=0
for old_name in file_list:
new_name = "image" + str(n) +".JPG"
os.rename(old_name, new_name)
n=n+1
可以得到如下结果:
接下来,为样本数据设置标签(labels)。这里使用的labelImg工具。可以直接使pip安装
pip isntall labelImg#安装labelImg
labelImg
是一款是用于制作数据集时,对数据集进行标注的工具,labelImg是深度学习最常用的标注工具之一。
注意:labels文件夹应和images文件在同一路径下。且labels文件夹下应有一个名为classes.txt文件,里面写着分类类别。
运行方法为在命令行工具(Windows下可以是CMD 、Powershell等),指定image路径和分类标签路径。
label /image路径/ /label标签保存路径/classs.txt
之后会弹出labelImg的UI页面:将数据格式设置为YOLO才能生成txt格式的标签,按W快速选择目标区域,按A/D为上一张/下一张。
标记完所有图片后会得到如图所示的文件结构:
至此,样本数据就准备完毕。
4、正式训练模型
在YOLOv5项目的./models
文件夹下选择一个需要训练的模型,这里我们选择yolov5s.yaml,最小的一个模型进行训练,参考官方README中的table,了解不同模型的大小和推断速度。如果你选定了一个模型,那么需要修改模型对应的yaml
文件
# parameters
nc: 3 # number of classes <------------> 设置为自己数据集的类别个数
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# anchors
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Focus, [64, 3]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 9, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 1, SPP, [1024, [5, 9, 13]]],
[-1, 3, C3, [1024, False]], # 9
]
# YOLOv5 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
参考官方的数据集格式,需要通过一个yaml文件指定数据集的来源。故而新建一个data.yaml文件放在data文件下,容如下:
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: /root/yolov51/mydata/images/ # 训练数据集
val: /root/yolov51/mydata/images/ # 测试数据集
# number of classes
nc: 3
# class names
names: [ 'Pointer-instrument','Digital-display-instrument','Indicator-light' ]
做好以上准备工作后,就可以开始训练,YOLOv5的训练文件为:train.py。在阅读源码后,发现至少需要指定如下参数才能正常训练:
# Train yolov5x on score for 300 epochs
python train.py --img-size 640 --epochs 300 --data ./data/mydata.yaml --cfg ./models/yolov5s.yaml --weights ./yolov5s.pt
--img-size
:输入图片的大小--epochs
:训练步长--data
:数据集配置文件--cfg
:模型配置文件--weights
:权重配置文件
开始训练后会出现如下结果,则表示训练正常:
训练之后生成的结果会通过tensorboard
在浏览器中打开,权重文件会保存在./runs/train/expN/weights/中,里面会有best.pt和last.pt两个文件。
可以看到随训练生成的分析统计:
比如,三类仪表的个数和在图片中的位置统计如下:
最后:对于验证数据集测试效果如下:
5、检测仪表位置
YOLOv5中提供了detect.py脚本,可以检测单张图片,多张图片,以及视频。
单张图片测试命令:
python detect.py --source inference/image0.jpg --weights ./runs/train/expN/weights/best.pt
预测结构会保存在./runs/detect/中
这里以一段视频为例:
python detect.py --source /YourMP4dir/test.mp4 --weights ./runs/train/expN/weights/best.pt
结果如下:
#或者:<video width:60% height:auto controls>
#或者:<video width:60% height:auto controls>