基于YOLOv5的智慧工厂车辆检测系统实践
1. 项目背景与核心需求
在现代化智慧工厂的运营管理中,厂区进出口的车辆管理一直是安全管控的重要环节。传统的人工登记方式效率低下且容易出错,特别是在大型工业园区或建筑工地,每天进出的大型工程车辆(如货车、渣土车、混凝土搅拌车等)数量庞大,单纯依靠门卫人工记录不仅耗时耗力,还难以避免漏记、错记的情况。
这个项目的核心目标是通过深度学习技术实现厂区进出口车辆的自动化识别与记录。具体需要解决以下几个关键问题:
- 准确识别进出厂区的各类工程车辆(特别是货车、渣土车等)
- 区分车头方向以判断是进场还是出场
- 自动记录车辆信息并生成管理报表
- 适应不同天气、光照条件下的识别需求
2. 技术方案选型与设计思路
2.1 目标检测算法选择:YOLO系列
在车辆检测领域,YOLO(You Only Look Once)系列算法因其出色的实时性能而成为首选。相较于传统的两阶段检测器(如Faster R-CNN),YOLO将目标检测视为回归问题,直接在单个神经网络中预测边界框和类别概率,这使得它在保持较高准确率的同时,能够实现更快的检测速度。
对于厂区车辆检测这种需要实时处理的应用场景,我们选择了YOLOv5作为基础模型。YOLOv5在保持YOLO系列快速检测特性的基础上,通过以下改进进一步提升了性能:
- 自适应锚框计算:自动计算最适合数据集的锚框尺寸
- 更高效的网络结构:采用CSPNet作为骨干网络
- 数据增强策略:Mosaic数据增强提升小目标检测能力
- 更灵活的模型尺寸:提供n/s/m/l/x五种预训练模型,可根据硬件条件选择
2.2 数据集准备与标注规范
项目使用的是VOC格式的数据集,这是目标检测领域常用的标准格式之一。VOC数据集的特点包括:
- 每张图片对应一个XML标注文件
- 标注信息包括物体类别和边界框坐标(xmin, ymin, xmax, ymax)
- 支持多类别标注
针对厂区车辆检测的特殊需求,我们在数据标注时特别注意以下几点:
- 对渣土车、货车等关键车型单独设立类别
- 标注车头方向(用于判断进出场)
- 收集不同时段(白天/夜晚)、不同天气条件下的样本
- 确保各类别样本数量均衡
典型的VOC标注文件结构如下:
<annotation> <folder>images</folder> <filename>truck_001.jpg</filename> <size> <width>1920</width> <height>1080</height> <depth>3</depth> </size> <object> <name>dump_truck</name> <pose>Front</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>450</xmin> <ymin>300</ymin> <xmax>850</xmax> <ymax>650</ymax> </bndbox> </object> </annotation>2.3 系统架构设计
整个车辆监测系统由以下几个模块组成:
- 视频采集模块:厂区进出口的摄像头实时采集视频流
- 预处理模块:对视频帧进行尺寸调整、归一化等处理
- 目标检测模块:基于YOLOv5的车辆检测与分类
- 方向判断模块:根据车头方向判断进出场状态
- 数据记录模块:将识别结果写入数据库并生成报表
- 告警模块:对异常车辆进行实时告警
系统工作流程如下图所示(文字描述):
摄像头视频流 → 帧提取 → 图像预处理 → YOLOv5检测 → 车辆分类 → 车头方向判断 → 进出场判定 → 数据记录 → 报表生成3. 模型训练与优化
3.1 训练环境配置
推荐使用以下硬件配置进行模型训练:
- GPU: NVIDIA RTX 3090 (24GB显存)
- CPU: Intel i7或以上
- 内存: 32GB以上
- 存储: SSD硬盘,至少500GB空间
软件环境:
- 操作系统: Ubuntu 18.04/20.04
- CUDA: 11.1
- cuDNN: 8.0.5
- Python: 3.8
- PyTorch: 1.8.1
安装YOLOv5训练环境的命令如下:
git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt3.2 数据准备与增强
将VOC格式数据集转换为YOLOv5训练所需的格式。YOLOv5需要的标注格式为:
<class_id> <x_center> <y_center> <width> <height>其中坐标值都是相对于图像宽高的归一化值(0-1)。
可以使用以下Python代码进行格式转换:
import xml.etree.ElementTree as ET import os def convert_voc_to_yolo(voc_annotations_path, yolo_labels_path, classes): for xml_file in os.listdir(voc_annotations_path): tree = ET.parse(os.path.join(voc_annotations_path, xml_file)) root = tree.getroot() image_width = int(root.find('size/width').text) image_height = int(root.find('size/height').text) yolo_lines = [] for obj in root.findall('object'): class_name = obj.find('name').text class_id = classes.index(class_name) box = obj.find('bndbox') xmin = int(box.find('xmin').text) ymin = int(box.find('ymin').text) xmax = int(box.find('xmax').text) ymax = int(box.find('ymax').text) x_center = (xmin + xmax) / 2 / image_width y_center = (ymin + ymax) / 2 / image_height width = (xmax - xmin) / image_width height = (ymax - ymin) / image_height yolo_lines.append(f"{class_id} {x_center} {y_center} {width} {height}") txt_file = os.path.splitext(xml_file)[0] + '.txt' with open(os.path.join(yolo_labels_path, txt_file), 'w') as f: f.write('\n'.join(yolo_lines))数据增强是提升模型泛化能力的关键。YOLOv5默认启用了以下增强策略:
- Mosaic增强:将4张训练图像拼接为1张
- 随机水平翻转
- 色彩空间变换(HSV调整)
- 随机缩放和裁剪
对于车辆检测任务,建议额外添加以下增强:
- 雨天/雾天模拟(增加噪声和模糊)
- 夜间场景模拟(降低亮度,增加车灯效果)
- 不同角度的透视变换
3.3 模型训练与参数调优
YOLOv5提供了预训练的模型权重,我们可以在此基础上进行迁移学习。训练命令如下:
python train.py --img 640 --batch 16 --epochs 100 --data data/vehicle.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt关键参数说明:
--img 640: 输入图像尺寸为640x640--batch 16: 批次大小为16(根据GPU显存调整)--epochs 100: 训练100轮--data: 数据集配置文件路径--cfg: 模型结构配置文件--weights: 预训练权重路径
训练过程中需要监控的关键指标:
损失函数变化:
- train/box_loss: 边界框回归损失
- train/obj_loss: 目标置信度损失
- train/cls_loss: 分类损失
验证集指标:
- mAP@0.5: IoU阈值为0.5时的平均精度
- mAP@0.5:0.95: IoU阈值从0.5到0.95的平均精度
针对车辆检测的特点,我们可以进行以下优化:
调整锚框尺寸:使用k-means算法在自定义数据集上重新计算锚框
python utils/autoanchor.py --img-size 640 --cfg models/yolov5s.yaml --path data/train类别权重调整:对于样本较少的类别增加权重
# data/vehicle.yaml nc: 5 # number of classes names: ['truck', 'dump_truck', 'mixer_truck', 'van', 'car'] class_weights: [1.0, 1.5, 1.5, 1.0, 0.8] # 渣土车和搅拌车权重更高学习率调度:采用余弦退火策略
--lr0 0.01 --lrf 0.01 --cos-lr
3.4 模型评估与测试
训练完成后,使用以下命令评估模型性能:
python val.py --weights runs/train/exp/weights/best.pt --data data/vehicle.yaml --img 640重点关注以下指标:
- 各类别的精确率(Precision)和召回率(Recall)
- mAP@0.5和mAP@0.5:0.95
- 推理速度(FPS)
对于车辆方向判断的准确性,需要单独测试。可以计算车头方向判断的准确率:
正确判断方向的车次数 / 总车次数4. 系统部署与实现细节
4.1 实时检测实现
使用YOLOv5的detect.py脚本进行实时检测:
python detect.py --weights best.pt --source rtsp://admin:password@192.168.1.100:554 --view-img对于实际部署,我们需要编写自定义的检测脚本,主要功能包括:
- 视频流读取与帧处理
- 车辆检测与分类
- 车头方向判断
- 进出场逻辑处理
- 数据记录与可视化
核心检测代码框架:
import cv2 from yolov5.detect import run class VehicleMonitor: def __init__(self, model_path): self.model = torch.hub.load('ultralytics/yolov5', 'custom', path=model_path) self.tracker = {} # 用于车辆跟踪 self.in_count = 0 self.out_count = 0 def process_frame(self, frame): results = self.model(frame) detections = results.pandas().xyxy[0] for _, det in detections.iterrows(): x1, y1, x2, y2 = int(det['xmin']), int(det['ymin']), int(det['xmax']), int(det['ymax']) class_name = det['name'] confidence = det['confidence'] # 车头方向判断 direction = self.get_direction(frame[y1:y2, x1:x2]) # 车辆跟踪与进出判断 self.track_vehicle(class_name, x1, y1, x2, y2, direction) # 绘制检测框和信息 self.draw_info(frame, x1, y1, x2, y2, class_name, direction) return frame def get_direction(self, vehicle_img): """判断车头方向""" # 实现基于图像处理或深度学习的方向判断逻辑 pass def track_vehicle(self, class_name, x1, y1, x2, y2, direction): """车辆跟踪与进出场判断""" # 实现车辆跟踪和进出场计数逻辑 pass def draw_info(self, frame, x1, y1, x2, y2, class_name, direction): """绘制检测信息和计数""" color = (0, 255, 0) if direction == 'in' else (0, 0, 255) cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2) cv2.putText(frame, f"{class_name} {direction}", (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) # 显示计数 cv2.putText(frame, f"In: {self.in_count} Out: {self.out_count}", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)4.2 车头方向判断算法
车头方向判断是进出场识别的关键。我们采用以下两种方法结合的方式:
基于几何特征的方法:
- 提取车辆检测框的底部中心点作为参考点
- 检测车头灯、挡风玻璃等特征的位置关系
- 根据特征点与参考点的相对位置判断方向
基于深度学习的方法:
- 训练一个专门的车头方向分类器
- 将车辆检测框裁剪后输入分类器
- 输出前进方向(左、右、前、后)
方向分类器的训练可以使用ResNet等轻量级网络,标注数据时需要明确标注车头方向。分类标签可以设为:
- 0: 车头向左(进场)
- 1: 车头向右(出场)
- 2: 正向(无法判断进出)
- 3: 背向(无法判断进出)
4.3 数据记录与管理系统
识别结果需要持久化存储并生成管理报表。推荐使用以下技术栈:
数据库:MySQL或PostgreSQL
- 车辆记录表结构:
CREATE TABLE vehicle_records ( id INT AUTO_INCREMENT PRIMARY KEY, vehicle_type VARCHAR(50), direction VARCHAR(10), confidence FLOAT, image_path VARCHAR(255), timestamp DATETIME, plate_number VARCHAR(20) );
- 车辆记录表结构:
后端API:Flask或FastAPI
from flask import Flask, request, jsonify import mysql.connector app = Flask(__name__) @app.route('/api/record', methods=['POST']) def add_record(): data = request.json conn = mysql.connector.connect( host="localhost", user="admin", password="password", database="vehicle_db" ) cursor = conn.cursor() sql = """INSERT INTO vehicle_records (vehicle_type, direction, confidence, image_path, timestamp) VALUES (%s, %s, %s, %s, NOW())""" cursor.execute(sql, ( data['type'], data['direction'], data['confidence'], data['image_path'] )) conn.commit() cursor.close() conn.close() return jsonify({"status": "success"})前端展示:Vue.js + ECharts
- 实时监控面板
- 历史数据查询
- 统计报表生成
4.4 性能优化技巧
在实际部署中,我们需要考虑以下性能优化措施:
多线程/多进程处理:
- 视频采集与模型推理分离
- 使用生产者-消费者模式处理视频帧
模型量化与加速:
# 模型量化 model = torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtype=torch.qint8 ) # TensorRT加速 from torch2trt import torch2trt model_trt = torch2trt(model, [input_data])视频流优化:
- 降低分辨率(如1080p→720p)
- 调整帧率(如30fps→15fps)
- 使用硬件解码(如NVIDIA NVDEC)
区域检测优化:
- 只对进出口特定区域进行检测
- 设置检测灵敏度阈值
5. 常见问题与解决方案
5.1 检测精度不足
问题表现:
- 漏检小型车辆
- 误检相似物体(如大型集装箱误认为货车)
- 恶劣天气下检测率下降
解决方案:
数据增强:
- 增加小尺度车辆样本
- 添加恶劣天气下的训练数据
- 使用GAN生成更多样化的样本
模型调整:
- 减小模型下采样率(如从32倍降到16倍)
- 增加小目标检测层
- 调整非极大抑制(NMS)参数
后处理优化:
- 设置类别特定的置信度阈值
- 添加基于跟踪的检测结果平滑
5.2 方向判断错误
问题表现:
- 车头方向判断不准确
- 进出场状态误判
- 车辆遮挡导致方向无法判断
解决方案:
多帧验证:
- 基于连续多帧判断方向
- 使用卡尔曼滤波跟踪车辆轨迹
几何约束:
- 结合车辆运动方向
- 利用厂区布局信息(如只允许单向通行区域)
辅助特征:
- 检测车牌位置(通常位于车尾)
- 识别特定车型的特征(如渣土车的车厢形状)
5.3 系统延迟过高
问题表现:
- 实时检测延迟明显
- 视频流卡顿
- 系统资源占用过高
解决方案:
模型轻量化:
- 使用YOLOv5s或YOLOv5n等小型模型
- 进行模型剪枝和量化
硬件加速:
- 使用GPU进行推理
- 启用TensorRT加速
- 使用Intel OpenVINO优化
流水线优化:
- 异步处理视频帧
- 降低非关键任务的优先级
5.4 特殊场景处理
夜间检测:
- 增加红外摄像头或补光灯
- 训练集包含充足夜间样本
- 特别关注车灯特征
雨雪天气:
- 使用去雨去雾算法预处理图像
- 增加天气鲁棒性的数据增强
- 调整检测置信度阈值
车辆遮挡:
- 使用更强大的跟踪算法(如DeepSORT)
- 基于部分可见特征推断车辆类型
- 设置遮挡状态标志,避免重复计数
6. 实际部署建议
6.1 硬件选型指南
根据厂区规模和需求,推荐以下部署方案:
小型厂区(1-2个出入口):
- 工控机:Intel i5 + NVIDIA GTX 1660
- 摄像头:200万像素,支持ONVIF,30fps
- 存储:1TB SSD
中型厂区(3-5个出入口):
- 边缘服务器:Xeon 4核 + NVIDIA T4
- 摄像头:500万像素,低照度,支持H.265
- 存储:RAID 5,4TB
大型厂区(5个以上出入口):
- 集群部署:多台边缘服务器 + 中心管理节点
- 摄像头:800万像素,全景+细节组合
- 存储:分布式存储系统
6.2 摄像头安装要点
安装位置:
- 高度:4-6米,俯角30-45度
- 距离:离检测区域10-15米
- 避免逆光安装
参数设置:
- 分辨率:至少1920x1080
- 帧率:15-25fps
- 曝光模式:手动或优先快门
- 白平衡:固定或自动
辅助照明:
- 夜间补光:柔光避免过曝
- 车牌识别专用补光灯
6.3 系统集成建议
与现有系统对接:
- 门禁系统:自动抬杆放行
- ERP系统:车辆信息同步
- 安防系统:异常车辆告警
数据接口设计:
- REST API供其他系统调用
- WebSocket实时推送检测结果
- 数据库定期备份机制
用户权限管理:
- 多级管理员权限
- 操作日志审计
- 数据导出控制
6.4 维护与升级策略
日常维护:
- 定期清洁摄像头镜头
- 检查系统运行日志
- 监控硬件温度
模型迭代:
- 收集误检样本进行再训练
- 每季度更新一次模型
- A/B测试新模型效果
系统升级:
- 灰度发布新版本
- 保留回滚机制
- 升级前完整备份