YOLOv5使用简介
官方教程链接
https://docs.ultralytics.com/yolov5/
算法简介
Ultralytics版本的YOLOv5以高速和高精度的目标检测能力而闻名。它基于PyTorch构建,功能齐全,用户友好,适用于各种计算机视觉项目。主要功能包括实时推理,支持多种训练技巧,如测试时增强(TTA)和模型集成,以及与TFLite,ONNX,CoreML和TensorRT等导出格式的兼容性。
YOLOv5在实时目标检测方面具有上级速度和准确性。YOLOv5一次性处理整个图像,与RCNN等基于候选区域的方法相比速度要快得多,后者涉及多个通道。此外,YOLOv5与各种导出格式和大量文档的无缝集成(便于魔改)使其成为初学者和专业人士的绝佳选择。
模型结构
YOLOv5的架构由三个主要部分组成:
-
Backbone(主干):网络主体。YOLOv5,主干是使用
New CSP-Darknet53
结构设计的,这是对以前版本中使用的Darknet架构的修改。 -
Neck:这部分连接主干和头部。YOLOv5中使用
SPPF
和New CSP-PAN
结构。 -
Head:这部分负责生成最终输出。YOLOv5使用YOLOv3 Head
数据增强
Mosaic:将四个训练图像合并为一个,鼓励模型更好地处理对象缩放和平移。
Copy-Paste:从图像中复制随机补丁并将其粘贴到另一个随机选择的图像上,有效地生成新的训练样本。
MixUp:通过对两个图像及其相关标签进行线性组合来创建合成图像。
Albumentations:图像增强库。
HSV Augmentation:随机更改图像的色调,饱和度和值。
Random Horizontal Flip:随机水平翻转。
训练策略
YOLOv 5应用了几种复杂的训练策略来提高模型的性能,包括:
-
Multiscale Training(多尺度训练):在训练过程中,输入图像在原始大小的0.5到1.5倍范围内随机重新缩放。
-
AutoAnchor(自动锚):此策略优化先前的锚框,以匹配自定义数据中的地面实况框的统计特征。
-
Warmup and Cosine LR Scheduler(热身和余弦退火):一种调整学习率以增强模型性能的方法。
-
Exponential Moving Average (EMA)(指数移动平均):一种使用过去步骤的参数平均值来稳定训练过程并减少泛化误差的策略。
-
Mixed Precision Training(混合精度训练):一种以半精度格式执行操作的方法,减少内存使用并提高计算速度。
-
Hyperparameter Evolution(超参数进化):一种自动调整超参数以实现最佳性能的策略。
计算损失
YOLOv5中的损失计算为三个单独损失组成部分的组合:
- **Classes Loss (BCE Loss)**类别损失(BCE损失):二进制交叉熵损失,衡量分类任务的错误。
- **Objectness Loss (BCE Loss)**对象损失(BCE损失):另一个二进制交叉熵损失,计算检测对象是否存在于特定网格单元中的错误。
- **Location Loss (CIoU Loss)**位置损失(CIoU损失):完全IoU损失,测量在网格单元内定位对象的错误。
整体损失函数公式如下:
L
o
s
s
=
λ
1
L
c
l
s
+
λ
2
L
o
b
j
+
λ
3
L
l
o
c
Loss=λ_1L_{cls}+λ_2L_{obj}+λ_3L_{loc}
Loss=λ1Lcls+λ2Lobj+λ3Lloc
平衡损失
三个预测层(P3、P4、P5)的对象性损失被不同地加权。配重分别为[4.0, 1.0, 0.4]。这种方法确保了不同尺度下的预测对总损失的贡献适当。
L
o
b
j
=
4.0
∗
L
c
l
s
s
m
a
l
l
+
1.0
∗
L
o
b
j
m
e
d
i
u
m
+
0.4
∗
L
o
b
j
l
a
r
g
e
L_{obj}=4.0*L^{small}_{cls}+1.0*L^{medium}_{obj}+0.4*L^{large}_{obj}
Lobj=4.0∗Lclssmall+1.0∗Lobjmedium+0.4∗Lobjlarge
制作数据集
模型将通过数据集进行学习。使用真实环境下的图像进行训练是至关重要的。理想情况下,需要从相同配置(相机,角度,照明等)收集各种背景的图像构成数据集,以便项目部署,图像一般在一千张以上,具体以实际需求为准。相机采集的原始图像的分辨率过高可能会导致训练时间过长,可选择将原始图像缩放至640×480像素的分辨率。
创建数据集
COCO 128是一个示例性的小型数据集,由COCOtrain 2017中的前128张图像组成,用于训练和验证我们的训练模型。创建COCO128格式的数据集文件夹并将其放在 YOLOV5 文件夹所在的同级路径中,结构如下图所示(分为训练集和验证集,再下级分为图像和标签):
data/coco128.yaml路径下的数据集配置文件coco128.yaml如下所示,数据集根目录path和到train/val/test(可选)图像目录的相对路径(或具有图像路径的*.txt 文件),以及类字典[names]:
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco128 # dataset root dir
train: Train/images # train images (relative to 'path') 128 images
val: Test/images # val images (relative to 'path') 128 images
test: # test images (optional)
# Classes (80 COCO classes)
names:
0: person
1: bicycle
2: car
# ...
77: teddy bear
78: hair drier
79: toothbrush
path:数据集根目录,train:训练集路径,val:验证集路径,names:换成自己定义的类别的序号和名称。
创建标签
这里以LabelImg为例,首先安装标注工具LabelImg
pip install labelimg
安装完成后输入:
labelImg
出现标注界面如下:
打开 Open Dir 选择存放图像数据的路径,打开Change Save Dir 选择对应的标签路径(默认存放在图像路径下),数据集格式改为YOLO点击左上角的view勾选自动保存和展示标签,按 W 创建一个新的标注框,通过鼠标拖动、调整大小和位置等方式,精确地绘制,完成之后按 D 键进入下一张图片。
使用标注工具标记图像后,标签导出为.txt文件,每张图像对应一个同名的.txt 文件(如果图像中没有对象,则不需要)。.txt 文件规格如下:
①每个对象一行;
②每一行都是class x_center y_center width height的数据格式;
③检测框坐标x y w h(目标的坐标值 x、y,检测框的宽 w 和高 h)的数据范围在0-1间。如果检测框是以像素为单位,将x_center 和 width 除以图像宽度,将y_center 和 height 除以图像高度;
④类编号从索引0开始。
示例图片的标签文件如下:
该标签文件表示图像中标注有2个人(所属类别定义为 0)和一根领带(所属类别定义为 27)。标注完成后将所有数据(图像和标签同名,一一对应)按 8:2 的比例划分为训练集和验证集(测试集可为空),放入前面创建的文件夹中,构建数据集完毕。
训练模型
按网络结构的深度大小分成 s、m、l、x 四个版本,一般嵌入式设备使用YOLOv5s或者n模型以满足模型部署的帧率要求。 YOLOv5开源工程全面且简洁,在移动式设备上也更容易部署,能够实现实时检测并输出结果。
通过指定数据集、批量大小、图像大小以及预训练的–weights yolov5s.pt(一般数据量不大时推荐使用),或随机初始化的–weights ‘’ --cfg yolov5s.yaml(表示重新训练)训练 YOLOv5s 模型。预训练权重可以从最新的YOLOv5 版本中自动下载。
python train.py --img 640 --epochs 150 --batchsize 64 --data coco128.yaml --weights yolov5s.pt --cfg yolov5s.yaml
可选参数如下:
img:输入图片宽高。
epochs:训练过程中整个数据集被迭代的次数。
batchsize:每次权重更新输入的图片数量,梯度下降使用的最小批次数。
data:存储训练、测试数据的文件。
cfg:存储模型结构的配置文件。
data:存储训练、测试数据的文件。
weights:模型的预训练权重。
所有训练结果都保存在runs/train/路径下,并带有递增的序号,即重复训练后会出现runs/train/exp2,runs/train/exp3等。
模型评估
存放训练结果的exp目录内包含训练和验证统计数据、标签和包括精确召回(PR)曲线和混淆矩阵在内的度量和图表,结果文件 results.csv 在每个 epoch 后更新。
训练完成后会绘制为如下图所示的 results.png 文件:
训练结果图上分别表现了三个计算损失以及两种mAP 在迭代过程的变化。
定位损失box_loss:预测框与标定框之间的误差(CIoU),越小定位得越准;
置信度损失obj_loss:计算网络的置信度,越小判定为目标的能力越准;
分类损失cls_loss:计算锚框与对应的标定分类是否正确,越小分类得越准;
mAP@0.5:表示阈值大于0.5的平均mAP;
mAP@0.5:0.95:表示在不同 IoU 阈值(从 0.5 到 0.95,步长 0.05,即0.5、 0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均 mAP。
导出模型
使用如下命令将训练完毕的模型权重.pt 文件导出为.onnx 文件以获得推理加速。:
python export.py --weights yolov5s.pt --include onnx
导出模型文件的使用方式和原权重文件相同,将其用于推理测试:
python detect.py --weights yolov5s.onnx