CCPD数据集下载与预处理全指南:从数据获取到模型训练

1次阅读
没有评论

共计 3221 个字符,预计需要花费 9 分钟才能阅读完成。

image.webp

背景介绍

CCPD(Chinese City Parking Dataset)是目前最大的中文车牌识别开源数据集,包含超过 30 万张真实场景下的车牌图像。数据覆盖不同天气条件(晴天、雨天、雾天)、不同时间段(白天、夜晚)以及多种拍摄角度,具有以下特点:

CCPD 数据集下载与预处理全指南:从数据获取到模型训练

  • 高分辨率:所有图像均为 1920×1080 像素
  • 丰富标注:包含车牌号、车牌颜色、车牌位置(四点坐标)及车辆品牌等信息
  • 场景多样:涵盖停车场、道路卡口等多种实际场景

在车牌识别任务中,CCPD 因其数据量和多样性成为基准测试的首选数据集,能有效验证模型的泛化能力。

数据下载

官方获取途径:

  1. 通过论文作者 GitHub 仓库下载(需科学上网):

    https://github.com/detectRecog/CCPD

  2. 国内镜像源(推荐):

  3. 百度网盘:https://pan.baidu.com/s/1nW1kF8j 提取码:ccpd
  4. 阿里云 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]

模型训练

推荐架构

  1. 检测阶段:
  2. YOLOv5s(平衡速度与精度)
  3. Faster R-CNN(高精度场景)

  4. 识别阶段:

  5. LPRNet(轻量级端到端网络)
  6. 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)

避坑指南

常见问题

  1. 文件名解析错误:
  2. 确保正确处理横杠 (-) 和下划线 (_) 的分隔作用
  3. 验证坐标点是否构成凸四边形

  4. 类别不平衡:

  5. 各省份车牌出现频率差异大(如皖牌占 40%+)
  6. 解决方法:

    • 过采样稀有类别
    • 使用类别加权损失函数
  7. 小字符识别困难:

  8. 汉字识别准确率通常低于字母 / 数字
  9. 改进方案:
    • 单独增加汉字分类头
    • 采用注意力机制强化局部特征

性能优化

  1. 推理加速:
  2. 使用 TensorRT 部署模型
  3. 将检测与识别模型合并为单阶段网络

  4. 数据层面:

  5. 优先使用 CCPD-Weather 子集提升模型鲁棒性
  6. 对模糊样本(blurriness>150)进行专项训练

总结与展望

CCPD 数据集为中文车牌识别研究提供了标准基准,在实际应用中仍需注意:
– 新能源车牌格式(绿牌)的兼容性
– 极端光照条件下的识别稳定性

未来发展方向:
1. 结合超分技术提升低分辨率车牌识别率
2. 开发无需定位的端到端识别系统
3. 适应无牌车、临时牌等特殊场景

读者可以尝试:
– 在 CCPD 基础上加入自采数据增强多样性
– 测试不同 backbone(如 MobileNetV3、EfficientNet)的效果
– 探索 Transformer 在车牌识别中的应用

正文完
 0
评论(没有评论)