共计 2003 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
CCPD(Chinese City Parking Dataset)是目前国内最全面的车牌检测与识别数据集之一,包含超过 30 万张真实场景下的车牌图像。数据覆盖不同天气条件(晴天、雨天、雾天)、不同角度(正面、侧面)以及多种车牌类型(蓝牌、黄牌、新能源车牌等)。但在实际应用中,我们发现数据集存在几个典型问题:

- 标注不一致 :部分边界框未完全贴合车牌边缘,字符级标注存在漏标或错标情况
- 样本分布不均 :新能源车牌占比不足 5%,而普通蓝牌占比超 70%
- 噪声干扰 :约 3% 的样本存在严重模糊或遮挡问题
数据预处理实战
数据清洗
首先过滤无效样本并统一标注格式(CCPD 使用.txt 存储标注,需转换为标准 COCO 格式):
import os
import cv2
from collections import defaultdict
# 统计各类别分布
category_dist = defaultdict(int)
for anno_file in os.listdir('CCPD/annotations'):
with open(f'CCPD/annotations/{anno_file}') as f:
lines = f.readlines()
for line in lines:
category = line.split('_')[0] # 提取车牌类型
category_dist[category] += 1
# 过滤低质量样本
def is_valid_sample(img_path):
img = cv2.imread(img_path)
if img is None:
return False
h, w = img.shape[:2]
return h >= 30 and w >= 100 # 剔除过小图像
数据增强
针对样本不平衡问题,使用 imbalanced-learn 库进行过采样:
from imblearn.over_sampling import RandomOverSampler
import numpy as np
# 示例:对新能源车牌过采样
new_energy_indices = [i for i, cat in enumerate(labels) if cat == '新能源']
ros = RandomOverSampler(sampling_strategy={ '新能源': 5000}) # 目标采样数
X_resampled, _ = ros.fit_resample(np.array(new_energy_indices).reshape(-1,1), None)
模型训练对比
YOLOv5 适配
车牌通常为长宽比固定的矩形,需要调整 anchor 配置:
# data/ccpd.yaml
anchors:
- [12,16, 19,36, 40,28] # 小目标
- [36,75, 76,55, 72,146] # 中目标
- [142,110, 192,243, 459,401] # 大目标(适应不同距离车牌)
Faster R-CNN 调优
由于车牌字符需要高精度识别,建议使用更密集的 ROI Pooling:
model = fasterrcnn_resnet50_fpn(
roi_pooler=torchvision.ops.MultiScaleRoIAlign(featmap_names=['0', '1', '2', '3'],
output_size=14, # 默认 7×7 提升至 14×14
sampling_ratio=2
)
)
避坑指南
- 测试集污染 :CCPD 的 test 集包含部分与 train 集高度相似的场景(同一停车场不同时间段),建议:
- 人工检查并移除重复场景
-
添加第三方测试集(如 PKUData)验证泛化性
-
过拟合特定样式 :模型容易记住高频出现的车牌字体(如某省车牌),解决方案:
- 训练时随机擦除部分字符区域
-
添加字体变换数据增强
-
小目标漏检 :远距离车牌检测效果差时:
- 在 FPN 结构中增加 P2 特征层(1/ 4 尺度)
- 使用 Focus 模块替代初始卷积层(YOLOv5 方案)
延伸思考
跨数据集训练是提升模型鲁棒性的有效方法。我们尝试将 CCPD 与 PKUData 以 7:3 比例混合训练,发现:
- 互补优势 :PKUData 包含更多倾斜车牌样本,CCPD 提供丰富的光照变化
- 挑战 :两个数据集标注标准不同(PKUData 使用四点标注,CCPD 为矩形框)
- 解决方案 :统一转换为四点标注,增加仿射变换增强
最终混合训练使跨省车牌识别准确率提升 11.2%。建议后续可以进一步引入合成数据(如 TextRecognitionDataGenerator 生成的车牌)增强模型对罕见字符的识别能力。
总结
通过系统化的数据处理和模型调优,我们在 CCPD 数据集上实现了 98.7% 的车牌检测率和 96.3% 的字符识别准确率。关键经验包括:
- 对新能源车牌进行定向过采样
- 采用更适合长宽比目标的 anchor 配置
- 引入跨数据集训练增强泛化性
数据集处理代码已开源在 GitHub,欢迎交流优化建议。车牌识别看似简单,但在实际落地时会遇到各种意想不到的挑战,保持对数据分布的敏感度至关重要。
