简要介绍yolov5的原理,以及yoloX的提升。

YOLOv5

YOLO系列的核心思想就是把目标检测转变为一个回归问题,利用整张图片作为网络的输入,通过神经网络,得到边界框的位置及其所属的类别。

组成

Backbone

负责从输入图像中提取有用的特征。在较早的层中提取低层次的特征(如边缘和纹理),在较深层中提取高层次的特征(如物体和语义信息)。

Neck

聚集并细化骨干网提取的特征,通常侧重于加强不同尺度的空间和语义信息。

根据特征进行预测,最后非极大值抑制(NMS),过滤掉重叠的预测,只保留置信度最高的检测。

基本工作原理

  1. 数据预处理
    Mosaic数据增强:按照随机缩放、随机裁剪和随机排布的方式对四幅图像进行拼接。
    自适应图像缩放:统一缩放到一个标准尺寸
  2. 网络结构
  • Focus:特殊的下采样模块
  • CSP:CSP1_X应用于backbone主干网络部分,backbone是较深的网络,增加残差结构可以增加层与层之间反向传播的梯度值,避免因为层数加深而带来的梯度消失。CSP2_X相对于CSP1_X来说,将Resunit换成了2 * X个CBS,主要应用在Neck网络 (网络没那么深)。
  • FPN-PAN(Neck):FPN层自顶向下传达强语义特征,而PAN是自底向上传达定位特征.FPN特征金字塔利用浅层特征将简单目标区分开,利用深层特征将复杂目标区分开。PAN自下而上传达定位特征
  • SPP:金字塔池化,可将任意大小的特征图转换成固定大小的特征向量。
  1. 预测模块
  • GIOU:当预测框和GT框不相交时,即IOU=0,此时无法反映两个框之间的距离,损失函数不可导。当两个预测框交集大小相同时,两个IOU也相同。
  • NMS:如果物体很大,而网格又很小,一个物体可能会被多个网格识别。选择预测类别置信度高的里留下,其余预测都删除。把置信度最高网格的预测框作为极大预测框,计算极大预测框和其他几个网格预测框的IOU,如果超过一个阈值,例如0.5,则认为这两个网格实际上预测的是同一个物体,就把其中置信度比较小的删除。

YOLOX的改进

检测头解耦

将分类(Cls)、回归(Reg)和置信度(Obj)分支分离,通过独立的卷积层处理每个任务。而YOLOv5使用耦合检测头,三者共享同一卷积层。解耦设计能加速模型收敛并提升检测精度,例如在YOLOX中AP(平均精度)提升约1.1%

无锚框(Anchor-Free)

直接预测边界框的偏移量和尺寸(类似FCOS方法)。这不仅简化了模型设计,还减少了对锚框超参数的依赖,提升了泛化能力。

训练策略

YOLOX引入SimOTA(简化版最优传输分配),通过全局优化匹配正负样本,替代了YOLOv5基于IoU阈值的静态分配。SimOTA能更高效地解决目标重叠和小样本问题,在COCO数据集上AP提升约2.3%。

数据增强

YOLOX在输入端采用更强的数据增强组合(如Mosaic和MixUp)。

性能

YOLOX在相同分辨率(如640×640)下,AP略高于YOLOv5。
YOLOX支持端到端训练(End-to-End模式),无需后处理NMS(非极大值抑制),而YOLOv5依赖NMS过滤冗余框。此外,YOLOX提供多种轻量化版本(如Nano、Tiny),适合移动端部署。
YOLOX通过多尺度特征融合和强数据增强,对小目标检测效果更优,而YOLOv5在复杂场景中的鲁棒性更强。

YOLOv11实战

yolov5,v8,v11都是由ultralytics公司制作的yolo系列

模型参数

  • Latency:延迟,是指模型推理和后处理的时间。这个指标用于衡量模型处理一张图片或进行一次预测所需的时间,时间越小,执行速度越快。默认情况下,Latency的时间计算是不包含图像解码和前处理的时间的,因为这两部分时间的影响因素较多,包括图像文件的读取速度、前处理操作(如标准化、张量化以及数据移动到显卡)的复杂度和硬件性能等。
  • FLOPs:浮点运算次数,衡量模型计算复杂度。高FLOPs意味着模型具有更高的计算复杂度,需要更多的计算资源来训练和推理。注意和FLOPS区分,S大写的是硬件的运算能力参数。
  • Parameters:模型的参数量。

训练

  1. 数据集准备
    YOLO的标签有固定的格式,注意数据是经过归一化的。
    COCO格式:class x_center y_center width height

  2. 开始训练
    YOLOv11的封装做的非常好,仅需几行代码就能够完成训练设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# import warning
# warning.filterwarnings("ignore")
from ultralytics import YOLO

if __name__ == "__main__":
model = YOLO("weights/yolo11x.pt") # load a pretrained model

results = model.train(data="data.yaml",
epochs=100, imgsz=640,
batch=16,
workers=20,
device=[0,1,2,3],
amp=True,
patience=30) # train the model

训练参数设置:

  • batch_size:每次迭代中用于训练的网络输入样本数量。较大的批次可能提高训练效率,但也可能增加内存消耗。
  • learning_rate:学习率决定了权重调整的幅度。较小的学习率意味着模型在训练过程中更新更慢,而较大的学习率可能导致模型在最优解附近震荡。
  • epochs:整个训练数据集被遍历的次数。一个epoch意味着每个训练样本都被网络学习了一次。
  • patience:等待验证指标无改进而提前停止训练的 epoch 数量。通过在性能停滞时停止训练,有助于防止过拟合。
  • momentum:动量参数用于加速SGD在相关方向上的优化,并抑制震荡。
  • lr0: 初始学习率,调整此值对于优化过程至关重要,影响模型权重更新的速度。
  • workers: 工作线程数量用于数据加载(每个 GPU)。影响数据预处理和模型输入的速度,在多 GPU 设置中特别有用。
  • device: 指定用于训练的计算设备
  • data: 数据集配置文件路径(例如, coco8.yaml )。此文件包含数据集特定的参数,包括训练和验证数据路径、类别名称和类别数量。

更多见ultraltics官方文档:训练

  1. 结果分析
    参考资料:YOLO-V5训练结果的分析与评价参考2
  • confusion_matrix:混淆矩阵,是特别用于监督学习的可视化工具。
    矩阵的每一列代表一个类的实例预测,而每一行表示一个实际的类的实例。之所以如此命名,是因为通过这个矩阵可以方便地看出机器是否将两个不同的类混淆了(比如说把一个类错当成了另一个)。
    即每一行是预测类别。每一列是真实类别。
  • P_curve:(precision)单一类准确率,预测为positive的准确率。
    意思就是,当设置置信度为某一数值的时候,各个类别识别的准确率。
  • R_curve:(recall)真实为positive的准确率,即正样本有多少被找出来了(召回了多少)。
    意思就是,当设置置信度为某一数值的时候,各个类别查全的概率。
  • PR_curve:希望更加接近于(1,1)
  • F1_curve:是分类问题的一个衡量指标,是多分类问题的关键性指标。
    它是精确率和召回率的调和平均数,最大为1,最小为0。
  • labels:该图是标签的可视化(和模型的性能没直接关联)
    (1) 第一个图是训练集得数据量,每个类别有多少个
    (2) 第二个是框的尺寸和数量
    (3) 第三个是center点的位置
    (4) 第四个是label的高宽
  • labels_correlogram:对标签不同属性相关性的分析
    x, y, width, height 4个变量之间的关系
  • result.png&result.txt
    横坐标是训练轮次,纵坐标是各个指标。
    (1) box_loss: 定位损失,预测框与标定框之间的误差(GIoU)
    (2) obj_loss: 目标存在损失,模型预测的目标存在概率
    (3) cls_loss: 分类损失,度量预测类别与真实类别的差异
    (4) mAP50-95: 表示在不同IoU阈值(从0.5到0.95,步长0.05)的mAP
    (5) mAP50: 表示阈值大于0.5的平均mAP
    (6) mAP: 平均准确率均值,是根据PR曲线计算得到的
  1. 遇见的问题
  • docker环境:opencv需要额外的库
1
pip install opencv-python-headless
  • 多卡训练
1
2
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU