1. 毕业设计实战:基于YOLOv5的车型检测系统开发全记录
去年指导学弟完成这个课题时,我们花了三周时间从零搭建完整系统,最终检测精度达到94.3%。这个项目非常适合作为计算机视觉方向的毕业设计,既有足够的理论深度又具备工程实践价值。下面我将完整还原开发过程,包括环境配置、数据准备、模型训练到部署的全套方案。
车型检测属于特定目标检测领域,相比通用物体检测更注重对车辆特征的识别精度。我们选择YOLOv5作为基础框架,因其在速度和精度上的平衡性最好,社区支持也最完善。整个项目用Python实现,涉及OpenCV、PyTorch等核心库,最终代码量约2000行。
关键提示:建议使用Python 3.8+PyTorch 1.8的组合,这是经过验证最稳定的版本搭配。最新版反而容易出现兼容性问题。
2. 开发环境配置详解
2.1 基础软件栈搭建
首先需要配置CUDA环境,这是深度学习项目的前提条件。以NVIDIA RTX 3060显卡为例:
# 验证CUDA可用性 nvidia-smi # 应显示显卡信息 nvcc --version # 应显示CUDA版本然后创建隔离的Python环境(强烈建议使用conda):
conda create -n vehicle_det python=3.8 conda activate vehicle_det pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html2.2 YOLOv5框架部署
直接从官方仓库克隆最新代码:
git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt常见问题排查:
- 如果遇到pycocotools安装失败,尝试:
pip install cython pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI - OpenCV报错可以指定安装版本:
pip install opencv-python==4.5.5.64
3. 数据集构建与增强策略
3.1 数据采集方案
我们采用组合数据源:
- 开源数据集:UA-DETRAC(约10万张车辆图像)
- 自制数据:使用手机拍摄校园停车场(约2000张)
- 网络爬取:重点补充特殊车型(消防车、工程车等)
数据目录结构示例:
dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/3.2 标注规范与工具
使用LabelImg进行标注,保存为YOLO格式:
- 类别定义:0=car, 1=bus, 2=truck, 3=motorcycle
- 标注文件示例:
0 0.634375 0.401852 0.2375 0.296296 2 0.345312 0.613889 0.178125 0.222222
为提高模型鲁棒性,我们采用以下增强策略:
# data/hyps/hyp.scratch.yaml augment: hsv_h: 0.015 # 色相增强 hsv_s: 0.7 # 饱和度增强 hsv_v: 0.4 # 明度增强 degrees: 5.0 # 旋转角度 translate: 0.1 # 平移 scale: 0.5 # 缩放 shear: 0.0 # 剪切 perspective: 0.0005 # 透视变换4. 模型训练与调优实战
4.1 基础训练配置
启动初始训练(以YOLOv5s为例):
python train.py --img 640 --batch 16 --epochs 100 --data data/vehicle.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt关键参数解析:
- --img 640:输入图像尺寸
- --batch 16:根据显存调整(RTX 3060建议16)
- --epochs 100:初始训练轮次
- --data:自定义数据集配置文件
- --weights:预训练权重
4.2 进阶调优技巧
- 学习率策略调整:
# data/hyps/hyp.finetune.yaml lr0: 0.001 # 初始学习率 lrf: 0.01 # 最终学习率系数 momentum: 0.937 # SGD动量 weight_decay: 0.0005 # 权重衰减- 添加注意力机制(在models/yolov5s.yaml中):
backbone: [[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2 [-1, 1, CBAM, [128]], # 添加CBAM模块 [-1, 3, C3, [128]], ...]- 分类头改进:
class Detect(nn.Module): def __init__(self, nc=80, anchors=()): super().__init__() self.stride = torch.tensor([8., 16., 32.]) self.anchors = torch.tensor(anchors).float().view(3, -1, 2) self.no = nc + 5 # 输出维度 self.nl = len(anchors) # 检测层数 # 替换原卷积为深度可分离卷积 self.conv = nn.Sequential( DWConv(256, 256), nn.BatchNorm2d(256), nn.SiLU(), nn.Conv2d(256, self.no * self.na, 1))5. 模型评估与部署方案
5.1 性能评估指标
使用val.py脚本进行验证:
python val.py --weights runs/train/exp/weights/best.pt --data data/vehicle.yaml --img 640关键指标解读:
| 指标名称 | 计算公式 | 预期值 |
|---|---|---|
| mAP@0.5 | 0.5IoU时的平均精度 | >0.85 |
| mAP@0.5:0.95 | 多阈值平均精度 | >0.65 |
| Precision | TP/(TP+FP) | >0.9 |
| Recall | TP/(TP+FN) | >0.8 |
5.2 部署优化方案
- ONNX导出:
python export.py --weights best.pt --include onnx --img 640 --simplify- TensorRT加速:
trtexec --onnx=best.onnx --saveEngine=best.engine --fp16- Python推理示例:
import cv2 import torch from models.experimental import attempt_load from utils.general import non_max_suppression model = attempt_load('best.pt') img = cv2.imread('test.jpg') img = preprocess(img) # 预处理函数 pred = model(img)[0] pred = non_max_suppression(pred, 0.5, 0.45) # 置信度阈值0.5,IOU阈值0.45 for det in pred: if len(det): for *xyxy, conf, cls in det: label = f'{model.names[int(cls)]} {conf:.2f}' plot_one_box(xyxy, img, label=label) # 绘制检测框6. 常见问题解决方案
6.1 训练过程问题
Loss震荡严重
- 检查学习率是否过大(建议初始lr=0.001)
- 验证数据标注质量(使用verify.py脚本)
- 尝试增加batch size(显存允许情况下)
过拟合现象
- 添加更多数据增强(mixup, cutout等)
- 引入Label Smoothing(在hyp配置中设置)
- 提前停止训练(监控val mAP)
6.2 部署阶段问题
ONNX导出失败
- 确保PyTorch和ONNX版本兼容
- 尝试添加--dynamic参数
- 简化模型结构(移除自定义层)
推理速度不达标
- 使用TensorRT加速(可提升3-5倍)
- 尝试量化(FP16/INT8)
- 优化后处理代码(使用C++实现)
7. 项目扩展方向
多任务学习在检测基础上增加:
- 车牌识别
- 车辆颜色分类
- 车型细分(SUV/轿车等)
边缘设备部署
- 树莓派+Intel神经计算棒
- Jetson Nano部署方案
- 安卓端部署(NCNN框架)
业务系统集成
graph LR A[摄像头] --> B(车型检测) B --> C{决策逻辑} C -->|普通车辆| D[放行] C -->|特殊车辆| E[报警]
实际开发中发现,在夜间场景下检测精度会下降约15%。解决方案是添加红外图像数据或采用低照度增强算法。这个细节很少有论文提及,但对实际应用非常关键。