AIStudio目标检测实战:从零搭建YOLOv5模型避坑指南

1次阅读
没有评论

共计 2496 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

为什么目标检测值得学

目标检测能同时识别物体类别和位置,是智能监控的核心技术;在自动驾驶中实时检测行人车辆,直接关系生命安全;工业质检通过像素级定位缺陷,效率超人工十倍。掌握它,就拿到了 AI 落地的通行证。

AIStudio 目标检测实战:从零搭建 YOLOv5 模型避坑指南

模型选型:速度与精度的平衡术

  • Faster R-CNN:两阶段检测标杆,mAP 高但速度慢(5FPS),适合服务器端部署
  • SSD:单阶段多尺度检测,平衡性较好(22FPS@VOC),移动端友好
  • YOLOv5:2023 年实测性价比之王,640 分辨率下可达 140FPS(RTX3090),训练代码开箱即用

实测对比:同一张 Tesla T4 显卡上,YOLOv5s 比 SSD 快 3 倍,mAP 仅低 2 个百分点

三分钟环境准备

AIStudio 已预装 PyTorch1.7+,只需两行代码激活环境:

!pip install -U torch==1.7.0 torchvision==0.8.1
!git clone https://github.com/ultralytics/yolov5

数据准备的黄金法则

格式转换黑科技

当你的数据是 VOC 格式时,用这个脚本一键生成 YOLO 格式:

# voc2yolo.py
import xml.etree.ElementTree as ET
import os

def convert(size, box):
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

# 使用时注意修改 VOC 文件夹路径

数据标注自查清单

  • 检查标签文件是否与图像一一对应
  • 验证坐标是否归一化到 [0,1] 区间
  • 确认类别索引从 0 开始连续编号

模型配置精要

修改 models/yolov5s.yaml 的关键参数:

# 控制模型深度和宽度
depth_multiple: 0.33  # 浅层网络适合小目标
width_multiple: 0.50  # 通道数压缩比

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

训练代码的隐藏参数

分布式训练加速技巧:

train.py 
  --batch-size 64 
  --device 0,1  # 指定多卡训练
  --epochs 300 
  --data coco128.yaml 
  --weights yolov5s.pt
  --hyp data/hyps/hyp.scratch-low.yaml  # 调参秘籍

评估指标解密

mAP@0.5 的计算流程:
1. 对每个类别计算 PR 曲线
2. 计算曲线下面积(AP)
3. 所有类别 AP 取平均

实测技巧:验证时添加 --task study 参数可分析最佳置信度阈值

性能优化三板斧

混合精度训练

在 AIStudio 的 A100 显卡上开启 FP16:

python train.py --batch 64 --device 0 --epochs 100 --data coco.yaml 
--weights yolov5s.pt --hyp hyp.finetune.yaml --img 640 --adam 
--patience 0 --batch-size 64 --workers 8 --project runs/train 
--name exp --exist-ok --quad --cos-lr --sync-bn --noval --noautoanchor 
--evolve 300 --bbox_interval 1 --save_period -1 --artifact_alias latest 
--freeze 10 --multi-scale --single-cls --optimizer AdamW --lr0 0.0032 
--fraction 0.2 --label-smoothing 0.1 --cache ram --image-weights 
--patience 0 --seed 42 --local_rank 0 --fp16

数据增强组合拳

# data/hyps/hyp.scratch-low.yaml
hsv_h: 0.015  # 色相抖动
hsv_s: 0.7    # 饱和度增强
hsv_v: 0.4    # 明度变化
fliplr: 0.5   # 水平翻转
mosaic: 1.0   # 马赛克增强
mixup: 0.2    # 图像混合

显存不足救急方案

  • 降低 --batch-size 到 8 或 16
  • 添加 --linear-lr 降低初始学习率
  • 使用 --cache disk 替代 RAM 缓存

生产环境血泪史

标签错位终极解法

当发现预测框整体偏移时:
1. 检查标注工具是否使用 RGBA 格式导致坐标错位
2. 验证图像加载时是否自动旋转(EXIF 信息)
3. 排查数据增强是否引入异常变换

类别不平衡妙招

  • 对稀少类别启用--image-weights
  • 在 loss 计算时添加类别权重:
    # utils/loss.py
    class ComputeLoss:
        def __init__(self, model, autobalance=False):
            self.cls_pw = torch.ones(nc) * 0.5  # 修改此处的权重系数

过拟合预警信号

  • 训练 loss 持续下降但验证集 mAP 波动
  • 预测时出现异常密集的重复框
  • 在干净测试集上表现突然下降

模型导出实战

生成 ONNX 格式并验证:

python export.py 
  --weights runs/train/exp/weights/best.pt 
  --img 640 --batch 1 
  --device 0 --simplify --dynamic

# 验证导出结果
import onnxruntime
sess = onnxruntime.InferenceSession("yolov5s.onnx")
outputs = sess.run(None, {"images": dummy_input})

思考题进阶

  1. 当检测电梯按钮这类固定长宽比目标时,如何重新设计 Anchor Boxes?
  2. 将模型量化到 INT8 时,发现 mAP 下降 7%,有哪些补偿方案?

建议在 AIStudio 上创建「YOLOv5 调优实验室」项目实操验证

正文完
 0
评论(没有评论)