在计算机视觉领域的实际项目开发中,模型选型往往决定着整个项目的成败。作为山东大学2023级创新实训的参与者,我们团队最初确定了一个基于传统图像处理算法的方案。然而,在深入调研和前期实验后,我们发现这个方案存在几个致命缺陷:
经过对当前主流目标检测技术的横向对比,我们最终决定转向YOLO(You Only Look Once)系列算法。这个决定并非一时兴起,而是基于以下关键发现:
重要提示:在计算机视觉项目中,切忌过早锁定技术方案。建议保留15-20%的时间用于技术验证和方案调整。
我们使用同一测试数据集对比了传统方案和YOLOv8的指标差异:
| 指标 | 传统方案 | YOLOv8n | YOLOv8s |
|---|---|---|---|
| mAP@0.5 | 0.82 | 0.89 | 0.91 |
| 推理速度(FPS) | 23 | 45 | 38 |
| 模型大小(MB) | 15 | 5.2 | 14.4 |
| 训练周期(epoch) | - | 100 | 100 |
从数据可以看出,即使是YOLO的最小模型(YOLOv8n),在精度和速度上都全面超越了传统方案。这验证了我们转向YOLO决策的正确性。
YOLOv8相比前代有几个关键改进:
这些改进使得YOLOv8特别适合我们的实训项目需求——需要在有限的计算资源下实现实时目标检测。
我们选择Python 3.8+PyTorch 1.12的组合,这是经过测试最稳定的环境配置:
bash复制# 创建conda环境
conda create -n yolo_train python=3.8
conda activate yolo_train
# 安装PyTorch
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
# 安装Ultralytics YOLO
pip install ultralytics
避坑指南:CUDA版本必须与PyTorch版本严格匹配。我们遇到过因版本不兼容导致的训练崩溃问题。
采用COCO数据格式规范,目录结构如下:
code复制dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
使用LabelImg进行标注时,需要注意:
我们开发了自动化脚本检查标注质量:
python复制import os
from PIL import Image
def validate_annotations(img_dir, label_dir):
for img_file in os.listdir(img_dir):
img_path = os.path.join(img_dir, img_file)
label_path = os.path.join(label_dir, os.path.splitext(img_file)[0]+'.txt')
# 验证图像和标注文件是否存在
if not os.path.exists(label_path):
print(f"Missing label for {img_file}")
continue
# 验证图像能否正常打开
try:
Image.open(img_path).verify()
except:
print(f"Corrupted image: {img_file}")
我们的训练配置(yolov8n.yaml)如下:
yaml复制# 模型参数
nc: 10 # 类别数
depth_multiple: 0.33 # 控制backbone深度
width_multiple: 0.25 # 控制通道数
# 训练参数
lr0: 0.01 # 初始学习率
lrf: 0.1 # 最终学习率 = lr0 * lrf
momentum: 0.937
weight_decay: 0.0005
warmup_epochs: 3.0
warmup_momentum: 0.8
warmup_bias_lr: 0.1
启动训练命令:
bash复制yolo train data=custom.yaml model=yolov8n.yaml epochs=100 imgsz=640 batch=16
训练过程中的关键监控指标:
在训练中期,我们发现某些类别的AP值明显偏低。通过分析发现是类别分布不均导致:
code复制类别分布统计:
类别1: 1200样本
类别2: 800样本
类别3: 150样本 ← 问题类别
解决方案:
修改后的损失函数:
python复制# 在自定义训练脚本中添加
loss = ComputeLoss(
model=model,
cls_pw=1.5, # 增加分类损失权重
fl_gamma=1.5 # Focal Loss参数
)
当验证集指标开始下降时,我们采取了以下措施:
增加数据增强:
调整模型正则化:
yaml复制dropout: 0.2 # 新增dropout层
label_smoothing: 0.1 # 标签平滑
早停策略:
python复制patience = 10 # 连续10个epoch验证指标不提升则停止
为将模型部署到边缘设备,我们进行了以下优化:
模型量化:
bash复制yolo export model=best.pt format=onnx imgsz=640 half=True
TensorRT加速:
python复制import tensorrt as trt
# 构建优化引擎代码...
测试结果:
经过调整后的YOLO方案最终达到了以下指标:
关键经验分享:
这个项目让我深刻体会到:在计算机视觉领域,选择适合的算法框架往往事半功倍。YOLO系列以其优异的性能平衡,成为我们这类实训项目的理想选择。