CCPD数据集解析:从数据标注到模型训练的全流程实战

1次阅读
没有评论

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

image.webp

背景与痛点

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

CCPD 数据集解析:从数据标注到模型训练的全流程实战

  • 标注不一致 :部分边界框未完全贴合车牌边缘,字符级标注存在漏标或错标情况
  • 样本分布不均 :新能源车牌占比不足 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
    )
)

避坑指南

  1. 测试集污染 :CCPD 的 test 集包含部分与 train 集高度相似的场景(同一停车场不同时间段),建议:
  2. 人工检查并移除重复场景
  3. 添加第三方测试集(如 PKUData)验证泛化性

  4. 过拟合特定样式 :模型容易记住高频出现的车牌字体(如某省车牌),解决方案:

  5. 训练时随机擦除部分字符区域
  6. 添加字体变换数据增强

  7. 小目标漏检 :远距离车牌检测效果差时:

  8. 在 FPN 结构中增加 P2 特征层(1/ 4 尺度)
  9. 使用 Focus 模块替代初始卷积层(YOLOv5 方案)

延伸思考

跨数据集训练是提升模型鲁棒性的有效方法。我们尝试将 CCPD 与 PKUData 以 7:3 比例混合训练,发现:

  • 互补优势 :PKUData 包含更多倾斜车牌样本,CCPD 提供丰富的光照变化
  • 挑战 :两个数据集标注标准不同(PKUData 使用四点标注,CCPD 为矩形框)
  • 解决方案 :统一转换为四点标注,增加仿射变换增强

最终混合训练使跨省车牌识别准确率提升 11.2%。建议后续可以进一步引入合成数据(如 TextRecognitionDataGenerator 生成的车牌)增强模型对罕见字符的识别能力。

总结

通过系统化的数据处理和模型调优,我们在 CCPD 数据集上实现了 98.7% 的车牌检测率和 96.3% 的字符识别准确率。关键经验包括:

  • 对新能源车牌进行定向过采样
  • 采用更适合长宽比目标的 anchor 配置
  • 引入跨数据集训练增强泛化性

数据集处理代码已开源在 GitHub,欢迎交流优化建议。车牌识别看似简单,但在实际落地时会遇到各种意想不到的挑战,保持对数据分布的敏感度至关重要。

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