共计 1447 个字符,预计需要花费 4 分钟才能阅读完成。
背景与痛点分析
CCPD 车牌数据集作为国内最大的开源车牌数据集,包含 20 万 + 真实场景车牌图像,但在实际应用中仍存在以下典型问题:

- 光照条件复杂 :强光、逆光、夜间低光等场景导致车牌区域对比度不足
- 模糊与遮挡 :车速过快或摄像头抖动产生的运动模糊,以及车牌部分遮挡
- 小目标检测 :远距离拍摄时车牌仅占图像极小区域(最小 20×10 像素)
- 长宽比极端 :新能源车牌长度是普通车牌的 1.5 倍
- 样本不均衡 :某些省份车牌样本量不足常规车牌的 1 /10
技术方案设计
数据层面优化
- 自适应直方图均衡化(CLAHE)
- 对 HSV 空间的 V 通道进行处理,避免颜色失真
-
设置 clipLimit=2.0, tileGridSize=(8,8) 取得最佳效果
-
随机擦除增强
- 模拟车牌污损场景,擦除区域面积控制在 10%-25%
-
采用任意宽高比矩形框,增强模型抗遮挡能力
-
难样本挖掘
- 第一阶段训练后,统计漏检样本的特征分布
- 针对性补充相似场景数据到训练集
模型结构改进
基于 YOLOv5s 的改进方案:
- 检测头改进 :
- 增加 P2 特征层(160×160)提升小目标检测能力
- 在 Neck 部分引入 BiFPN 结构加强特征融合
- 损失函数优化 :
- 分类任务使用 Focal Loss(α=0.25, γ=2)
- 回归任务采用 SIoU Loss 替代 CIoU
训练技巧
- EMA 模型平滑 :衰减系数设为 0.9998
- Warmup 策略 :前 500 迭代线性增加学习率
- 余弦退火 :初始 lr=0.01,最小 lr=0.0001
关键代码实现
数据预处理 Pipeline
import cv2
import albumentations as A
# CLAHE 增强实现
def apply_clahe(img):
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
hsv[:,:,2] = clahe.apply(hsv[:,:,2])
return cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
# Albumentations 增强组合
transform = A.Compose([A.RandomErasing(p=0.5, scale=(0.1, 0.25)),
A.RandomBrightnessContrast(p=0.3),
A.HueSaturationValue(p=0.2)
], bbox_params=A.BboxParams(format='yolo'))
模型改进部分
# models/yolov5s.yaml 中修改检测头
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 3], 1, Concat, [1]], # P2 输出层
[-1, 3, C3, [512, False]],
...]
性能验证
在 CCPD-test 集上的实验结果:
| 方法 | mAP@0.5 | 推理速度 (FPS) |
|---|---|---|
| YOLOv5s 基线 | 0.872 | 142 |
| + 数据增强 | 0.891 | 138 |
| + 检测头改进 | 0.903 | 125 |
| 完整方案 | 0.916 | 118 |
部署优化指南
- TensorRT 加速 :
- 使用 FP16 精度可提升 30% 推理速度
-
设置 opt_shape 参数时需考虑最大车牌尺寸
-
长宽比处理技巧 :
- 测试时保持原始图像比例
- 对检测结果做后处理时,按 10:3 宽高比过滤误检
开放性问题
- 如何提升中文省份字符的识别准确率?
- 能否设计专用字符分类器处理新能源车牌?
欢迎在 GitHub 示例项目中提交您的解决方案 PR,共同完善车牌检测技术生态。
正文完
发表至: 未分类
近一天内
