共计 3221 个字符,预计需要花费 9 分钟才能阅读完成。
背景介绍
CCPD(Chinese City Parking Dataset)是目前最大的中文车牌识别开源数据集,包含超过 30 万张真实场景下的车牌图像。数据覆盖不同天气条件(晴天、雨天、雾天)、不同时间段(白天、夜晚)以及多种拍摄角度,具有以下特点:

- 高分辨率:所有图像均为 1920×1080 像素
- 丰富标注:包含车牌号、车牌颜色、车牌位置(四点坐标)及车辆品牌等信息
- 场景多样:涵盖停车场、道路卡口等多种实际场景
在车牌识别任务中,CCPD 因其数据量和多样性成为基准测试的首选数据集,能有效验证模型的泛化能力。
数据下载
官方获取途径:
-
通过论文作者 GitHub 仓库下载(需科学上网):
https://github.com/detectRecog/CCPD -
国内镜像源(推荐):
- 百度网盘:https://pan.baidu.com/s/1nW1kF8j 提取码:ccpd
- 阿里云 OSS:https://ccpd-dataset.oss-cn-hangzhou.aliyuncs.com/CCPD2019.zip
下载后文件结构:
CCPD2019/
├── CCPD-Base/ # 基础数据集(20 万张)├── CCPD-DB/ # 低亮度场景
├── CCPD-FN/ # 新牌照
└── CCPD-Weather/ # 特殊天气条件
数据预处理
标注解析示例
CCPD 使用文件名存储标注信息,格式为:
025-95_113-154&383_386&473-386&473_177&454_154&383_363&402-0_0_22_27_27_33_16-37-15.jpg
解析代码:
import cv2
import re
def parse_ccpd_filename(filename):
"""参数示例:"025-95_113-154&383_386&473-...jpg"返回:{'vertices': [[154,383],[386,473],...], # 车牌四角坐标'rect': [x_min, y_min, width, height], # 外接矩形'license':' 皖 A12345', # 车牌号'brightness': 95, # 亮度值'blurriness': 113 # 模糊度
}
"""basename = os.path.basename(filename).split('.')[0]
parts = basename.split('-')
# 解析车牌位置
vertices = []
for coord in parts[2].split('_'):
x, y = map(int, coord.split('&'))
vertices.append([x, y])
# 计算外接矩形
x_coords = [v[0] for v in vertices]
y_coords = [v[1] for v in vertices]
x_min, x_max = min(x_coords), max(x_coords)
y_min, y_max = min(y_coords), max(y_coords)
return {
'vertices': vertices,
'rect': [x_min, y_min, x_max-x_min, y_max-y_min],
'license': parts[-1],
'brightness': int(parts[1].split('_')[0]),
'blurriness': int(parts[1].split('_')[1])
}
# 使用示例
annotation = parse_ccpd_filename("025-95_113-154&383_386&473-...jpg")
print(f"检测到车牌:{annotation['license']}")
图像增强实践
推荐使用 albumentations 进行高效增强:
import albumentations as A
transform = A.Compose([A.RandomBrightnessContrast(p=0.5), # 随机调整亮度对比度
A.MotionBlur(blur_limit=5, p=0.3), # 运动模糊模拟
A.CLAHE(p=0.2), # 对比度限制自适应直方图均衡
A.RandomGamma(p=0.2), # 伽马变换
A.Cutout(max_h_size=20, p=0.1) # 随机遮挡
], bbox_params=A.BboxParams(format='pascal_voc'))
# 应用增强
image = cv2.imread("ccpd_image.jpg")
bbox = annotation['rect'] # [x_min, y_min, width, height]
transformed = transform(image=image, bboxes=[bbox])
aug_img = transformed['image']
aug_bbox = transformed['bboxes'][0]
模型训练
推荐架构
- 检测阶段:
- YOLOv5s(平衡速度与精度)
-
Faster R-CNN(高精度场景)
-
识别阶段:
- LPRNet(轻量级端到端网络)
- CRNN(CNN+RNN+CTC 经典组合)
训练代码片段(PyTorch 示例)
# 数据加载器配置
train_loader = torch.utils.data.DataLoader(CCPDDataset('CCPD2019/CCPD-Base', transform=transform),
batch_size=32,
shuffle=True,
num_workers=4
)
# 模型定义(示例使用简化版 LPRNet)model = nn.Sequential(nn.Conv2d(3, 64, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
# ... 更多卷积层
nn.Flatten(),
nn.Linear(1024, 78) # 78 个字符类别(汉字 + 字母 + 数字)).cuda()
# 训练循环
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()
for epoch in range(50):
for images, labels in train_loader:
preds = model(images.cuda())
loss = criterion(preds, labels.cuda())
optimizer.zero_grad()
loss.backward()
optimizer.step()
关键参数建议:
– 输入尺寸:94×24 像素(车牌标准比例)
– 学习率:初始 1e-3,每 10epoch 衰减 0.1
– Batch Size:根据 GPU 显存选择(通常 32-128)
避坑指南
常见问题
- 文件名解析错误:
- 确保正确处理横杠 (-) 和下划线 (_) 的分隔作用
-
验证坐标点是否构成凸四边形
-
类别不平衡:
- 各省份车牌出现频率差异大(如皖牌占 40%+)
-
解决方法:
- 过采样稀有类别
- 使用类别加权损失函数
-
小字符识别困难:
- 汉字识别准确率通常低于字母 / 数字
- 改进方案:
- 单独增加汉字分类头
- 采用注意力机制强化局部特征
性能优化
- 推理加速:
- 使用 TensorRT 部署模型
-
将检测与识别模型合并为单阶段网络
-
数据层面:
- 优先使用 CCPD-Weather 子集提升模型鲁棒性
- 对模糊样本(blurriness>150)进行专项训练
总结与展望
CCPD 数据集为中文车牌识别研究提供了标准基准,在实际应用中仍需注意:
– 新能源车牌格式(绿牌)的兼容性
– 极端光照条件下的识别稳定性
未来发展方向:
1. 结合超分技术提升低分辨率车牌识别率
2. 开发无需定位的端到端识别系统
3. 适应无牌车、临时牌等特殊场景
读者可以尝试:
– 在 CCPD 基础上加入自采数据增强多样性
– 测试不同 backbone(如 MobileNetV3、EfficientNet)的效果
– 探索 Transformer 在车牌识别中的应用
