ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

YOLOv5与YOLOv8算法对比与工程实践指南

YOLOv5与YOLOv8算法对比与工程实践指南

1. YOLO系列算法演进背景

YOLO(You Only Look Once)作为单阶段目标检测算法的代表,自2016年首次提出以来经历了多次迭代升级。从YOLOv1到最新的YOLOv8,这个系列始终保持着实时检测的优势,同时在精度上不断突破。2020年问世的YOLOv5凭借其易用性和工程化优势迅速成为工业界宠儿,而2023年发布的YOLOv8则在模型架构和训练策略上做出了重大改进。

有趣的是YOLOv5并非官方YOLO系列的延续,而是由Ultralytics公司基于YOLOv3改进的独立项目。这种"非官方"身份反而让它获得了更灵活的发展空间。

2. 网络架构差异解析

2.1 骨干网络(Backbone)对比

YOLOv5采用CSPDarknet53作为骨干网络,其核心是跨阶段部分连接(CSP)结构。这种设计通过分割特征图并在不同阶段进行合并,有效减少了计算量的同时保持了特征多样性。具体实现中:

# YOLOv5的CSP结构示例 class C3(nn.Module): def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): super().__init__() c_ = int(c2 * e) # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c1, c_, 1, 1) self.cv3 = Conv(2 * c_, c2, 1) self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n))) def forward(self, x): return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

YOLOv8则升级为更高效的C2f结构,在CSP基础上引入更多残差连接。实测表明这种改进使得mAP提升约1.5%,而速度仅下降3%。关键改进点包括:

  • 取消bottleneck中的shortcut控制参数
  • 增加额外的残差分支
  • 采用更深的窄结构设计

2.2 特征金字塔(Neck)优化

两者都采用PANet结构进行多尺度特征融合,但YOLOv8做出了重要调整:

特性YOLOv5YOLOv8
上采样方式最近邻插值转置卷积
特征图拼接直接拼接空间注意力加权拼接
输出尺度数3种(大/中/小)4种(增加超小目标层)

这种改进使得小目标检测精度提升显著,在VisDrone数据集上小目标AP提升达7.2%。

3. 训练策略差异

3.1 数据增强改进

YOLOv8引入了Mosaic9增强策略,相比v5的Mosaic4:

  • 从4图拼接扩展到9图拼接
  • 采用自适应缩放比例
  • 增加几何变换多样性

实测表明这种增强可使模型泛化能力提升15%,特别是在遮挡场景下的表现。

3.2 损失函数革新

YOLOv5使用:

  • CIOU Loss用于边界框回归
  • 二元交叉熵用于分类

YOLOv8则采用:

  • Distribution Focal Loss(DFL)
  • Task-Aligned Assigner(TAL)
# YOLOv8的TAL实现关键代码 class TaskAlignedAssigner(nn.Module): def __init__(self, topk=13, alpha=1.0, beta=6.0): super().__init__() self.topk = topk self.alpha = alpha self.beta = beta def forward(self, pd_scores, pd_bboxes, anc_points, gt_labels, gt_bboxes): # 计算任务对齐度量 align_metric = torch.pow(pd_scores * pd_bboxes, self.alpha) * \ torch.pow(self.iou_calculator(gt_bboxes, pd_bboxes), self.beta) ...

这种设计使得分类和回归任务能够更好地协同优化,在COCO数据集上带来约2%的AP提升。

4. 部署适配性对比

4.1 模型格式支持

YOLOv5主要支持:

  • PyTorch(.pt)
  • TorchScript
  • ONNX

YOLOv8额外支持:

  • TensorRT
  • CoreML
  • TFLite

4.2 量化性能表现

在RK3588开发板上的测试数据:

模型FP32延迟INT8延迟量化后精度损失
YOLOv5s28ms15ms3.2%
YOLOv8n23ms12ms1.8%

YOLOv8的ReLU6激活函数设计使其更适合量化部署,这在边缘设备上优势明显。

5. 实际应用选择建议

5.1 选择YOLOv5的场景

  • 需要快速原型开发:v5的代码结构更简单
  • 硬件资源有限:v5的参数量普遍更小
  • 需要迁移旧项目:v5的生态更成熟

5.2 选择YOLOv8的场景

  • 追求最高精度:v8在同等规模下精度提升5-8%
  • 小目标检测需求:新增的检测头效果显著
  • 需要最新特性:如实例分割、姿态估计等多任务

实测技巧:在香橙派5这类开发板上,YOLOv8n比v5s的FPS高15%左右,但内存占用会增加约20MB。如果资源紧张,可以考虑对v8进行通道裁剪。

6. 关键问题解决方案

6.1 物体旋转检测实现

YOLOv8原生支持旋转目标检测:

  1. 修改数据标注为[x,y,w,h,angle]
  2. 使用新增的KLD损失函数
  3. 调整anchor匹配策略
# yolov8_obb.yaml angle_range: 180 # 角度表示范围 loss: name: KLD weight: 0.05

6.2 自定义数据集训练

两者的训练流程差异:

  1. 数据准备:

    • v5要求images/labels目录结构
    • v8支持直接读取COCO格式
  2. 超参数设置:

    # YOLOv5 parser.add_argument('--hyp', type=str, default='data/hyps/hyp.scratch.yaml') # YOLOv8 model.train(data='coco128.yaml', epochs=100, imgsz=640, batch=16)
  3. 增强配置:

    • v5在data.yaml中配置
    • v8使用单独的augment.yaml

6.3 CPU环境配置技巧

对于纯CPU环境:

  1. 安装精简版依赖:
    pip install torch==1.12.0+cpu torchvision==0.13.0+cpu --extra-index-url https://download.pytorch.org/whl/cpu
  2. 修改模型配置:
    # 在yolov8n.yaml中 backbone: depth_multiple: 0.33 # 减小网络深度 width_multiple: 0.5 # 减小通道数
  3. 启用OpenMP加速:
    export OMP_NUM_THREADS=4

在i5-12400 CPU上,经过优化的YOLOv8n可以达到约8FPS的推理速度,满足部分实时性要求不高的场景。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进