CCPD数据集全解析:中文车牌识别的“双黄金标准“

CCPD数据集全解析:中文车牌识别的"黄金标准"

从数据构成、标注格式到实战应用,一文搞懂全球最主流的中文车牌识别基准数据集

1. 引言

车牌识别(License Plate Recognition, LPR)是智能交通系统的核心技术,广泛应用于电子警察、停车场管理、高速收费、车辆追踪等场景。然而,长期以来,中文车牌识别领域一直缺乏大规模、高质量、场景全覆盖的开源数据集,导致算法泛化能力差、工业落地困难。

2018年,中国科学技术大学多媒体计算与通信实验室发布了CCPD(Chinese City Parking Dataset) 数据集,彻底改变了这一局面。凭借其超大的规模、丰富的场景、精准的标注和完全开源的特性,CCPD迅速成为中文车牌识别领域的"事实标准",几乎所有主流的中文车牌识别算法都以它作为训练和评估基准。

截至2026年,CCPD已更新至多个版本,累计被引用超过2000次,支撑了数百篇学术论文和数十个工业级车牌识别系统的开发。

2. CCPD数据集简介

2.1 基本信息

  • 全称:Chinese City Parking Dataset(中国城市停车场数据集)
  • 发布机构:中国科学技术大学(USTC)多媒体计算与通信实验室
  • 首次发布:2018年(CCPD2018)
  • 最新版本:CCPD2020 + CCPD-Green(新能源车牌专项)
  • 数据总量 :超过50万张标注图片
  • 开源协议:MIT协议(完全免费,可商用)
  • 官方地址https://github.com/detectRecog/CCPD

2.2 核心定位

CCPD最初采集于中国多个城市的停车场出入口,后续扩展到小区、园区、道路等多种场景。它专门针对中国大陆地区的蓝牌、黄牌、绿牌(新能源) 车牌设计,覆盖了几乎所有实际应用中可能遇到的复杂情况,是目前最适合中文车牌识别算法训练和测试的数据集。

3. CCPD的核心优势解析

3.1 超大规模,覆盖全场景

  • 总样本量超过50万张,是其他早期中文车牌数据集的10倍以上
  • 覆盖全国31个省、自治区、直辖市的车牌
  • 包含白天、夜晚、阴天、雨天、雪天等多种天气条件
  • 涵盖不同光照强度(强光、逆光、弱光)、不同拍摄角度(平视、俯视、仰视)

3.2 精细化标注,多维度信息

CCPD的标注远不止"车牌位置+字符"这么简单,每张图片都包含11个维度的标注信息:

  • 车牌四个角点的精确坐标(像素级精度)
  • 车牌字符(汉字+字母+数字)
  • 车牌倾斜角度(水平倾斜+垂直倾斜)
  • 车牌模糊度
  • 车牌亮度
  • 车牌遮挡程度
  • 车牌所在区域的背景复杂度

这种多维度标注不仅可以训练车牌检测和字符识别模型,还可以用于车牌关键点检测、倾斜校正、图像增强等相关任务。

3.3 免费开源,社区活跃

  • 完全免费开放,无需申请,直接下载
  • 提供官方的Python数据加载和可视化代码
  • 社区贡献了大量基于CCPD的预训练模型和工具
  • 持续维护,及时修复标注错误

3.4 持续更新,紧跟行业需求

  • 2019年发布CCPD2019,将样本量从10万扩展到30万,增加了更多复杂场景
  • 2020年发布CCPD2020,新增15万张新能源车牌图片
  • 后续发布CCPD-Green专项数据集,专门针对绿色新能源车牌
  • 不断补充极端场景样本,提升数据集的挑战性

4. CCPD数据构成与子集详解

CCPD采用分场景子集的组织方式,每个子集针对一种特定的困难场景,方便研究者针对性地测试算法的鲁棒性。

4.1 整体数据分布

版本 总样本量 蓝牌 黄牌 新能源绿牌
CCPD2019 30万 25万 3万 2万
CCPD2020 45万 32万 5万 8万
CCPD-Green 10万 0 0 10万

4.2 核心子集详解

  1. CCPD-Base(基础集)

    • 样本量:约20万张
    • 特点:场景相对简单,车牌清晰、无明显遮挡、角度正常
    • 用途:模型的基础训练,学习车牌的基本特征
  2. CCPD-Blur(模糊集)

    • 样本量:约2万张
    • 特点:包含运动模糊、对焦模糊、雾霾导致的模糊
    • 用途:测试算法对模糊车牌的识别能力
  3. CCPD-Rotate(水平倾斜集)

    • 样本量:约2万张
    • 特点:车牌水平倾斜角度在-30°到+30°之间
    • 用途:测试算法对水平倾斜车牌的校正和识别能力
  4. CCPD-Tilt(垂直倾斜集)

    • 样本量:约2万张
    • 特点:车牌垂直倾斜角度在-15°到+15°之间
    • 用途:测试算法对垂直倾斜车牌的识别能力
  5. CCPD-DB(遮挡集)

    • 样本量:约2万张
    • 特点:车牌被雨刮器、灰尘、贴纸、其他车辆等部分遮挡
    • 用途:测试算法对遮挡车牌的补全和识别能力
  6. CCPD-FN(恶劣天气集)

    • 样本量:约1万张
    • 特点:雨天、雪天、雾天拍摄的车牌
    • 用途:测试算法在恶劣天气下的鲁棒性
  7. CCPD-Challenge(挑战集)

    • 样本量:约1万张
    • 特点:综合了多种困难因素,是整个数据集中最难的子集
    • 用途:算法的最终性能评估,比较不同算法的优劣
  8. CCPD-Green(新能源车牌集)

    • 样本量:约10万张
    • 特点:专门针对8位新能源绿牌(小型车)和黄绿牌(大型车)
    • 用途:训练和测试新能源车牌识别算法

5. CCPD标注格式深度解析

CCPD最具特色的是它的文件名标注法------所有标注信息都编码在图片的文件名中,无需额外的标注文件,极大地方便了数据的使用和分发。

5.1 文件名标注规则

一个典型的CCPD文件名如下:

复制代码
025-95_113-154&383_386&473-386&473_177&454_154&383_386&473-0_0_3_24_33_29_16-63-7.jpg

文件名由7个部分组成,用短横线-分隔,各部分含义如下:

序号 字段 含义 示例
1 区域代码 省份+城市代码 025(安徽合肥)
2 模糊度 0-200,数值越大越模糊 95_113(水平模糊度95,垂直模糊度113)
3 车牌边界框 左上角坐标&右下角坐标 154&383_386&473(x1=154,y1=383,x2=386,y2=473)
4 车牌四个角点坐标 右下&右上&左上&左下 386&473_177&454_154&383_386&473
5 车牌字符 7位(蓝/黄牌)或8位(绿牌)字符编码 0_0_3_24_33_29_16(皖A0D339Q)
6 亮度 0-255,数值越大越亮 63
7 倾斜角度 水平倾斜角度 7(水平倾斜7度)

5.2 字符编码规则

车牌字符采用数字编码,对应关系如下:

  • 省份汉字:0-30,对应全国31个省、自治区、直辖市(0=皖,1=京,2=津,...30=藏)
  • 字母和数字:31-64,对应A-Z和0-9(31=A,32=B,...56=Z,57=0,...66=9)

例如,编码0_0_3_24_33_29_16对应的字符是:

  • 0 → 皖
  • 0 → A
  • 3 → D
  • 24 → 3
  • 33 → 3
  • 29 → 9
  • 16 → Q
  • 最终车牌:皖A0D339Q

5.3 坐标系统

CCPD采用图像左上角为原点的像素坐标系统:

  • x轴向右为正
  • y轴向下为正
  • 四个角点的顺序固定为:右下角 → 右上角 → 左上角 → 左下角

6. 实战:快速加载与使用CCPD

6.1 数据集下载

从官方GitHub仓库下载对应版本的数据集:

下载后解压到本地目录,建议的目录结构:

复制代码
./data/
└── CCPD2020/
    ├── CCPD-Base/
    ├── CCPD-Blur/
    ├── CCPD-Rotate/
    └── ...

6.2 Python代码示例:解析与可视化

下面是一个简单的Python脚本,用于解析CCPD文件名并可视化标注结果:

python 复制代码
import os
import cv2
import numpy as np

# 省份汉字映射
provinces = ["皖", "京", "津", "渝", "沪", "冀", "晋", "蒙", "辽", "吉", "黑",
             "苏", "浙", "京", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "桂",
             "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新"]

# 字母数字映射
alphabets = [chr(ord('A') + i) for i in range(26)]
digits = [chr(ord('0') + i) for i in range(10)]
chars = alphabets + digits

def parse_ccpd_filename(filename):
    """解析CCPD文件名,返回标注信息"""
    parts = filename.split('-')
    
    # 解析车牌字符(自动识别7位/8位车牌)
    char_codes = list(map(int, parts[4].split('_')))
    plate = provinces[char_codes[0]]
    for code in char_codes[1:]:
        plate += chars[code - 31]
    
    # 解析边界框
    x1, y1, x2, y2 = map(int, parts[2].replace('&', '_').split('_'))
    
    # 解析四个角点
    points = list(map(int, parts[3].replace('&', '_').split('_')))
    corners = np.array(points).reshape(4, 2)
    
    return {
        'plate': plate,
        'bbox': (x1, y1, x2, y2),
        'corners': corners,
        'blur': float(parts[1].split('_')[0]),
        'brightness': int(parts[5]),
        'tilt': int(parts[6])
    }

def visualize_ccpd_annotation(img_path, annotation):
    """可视化CCPD标注结果"""
    img = cv2.imread(img_path)
    
    # 绘制边界框
    x1, y1, x2, y2 = annotation['bbox']
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
    
    # 绘制四个角点
    for (x, y) in annotation['corners']:
        cv2.circle(img, (x, y), 3, (0, 0, 255), -1)
    
    # 绘制车牌字符
    cv2.putText(img, annotation['plate'], (x1, y1-10), 
                cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
    
    return img

# 测试
if __name__ == '__main__':
    img_path = './data/CCPD2020/CCPD-Base/025-95_113-154&383_386&473-386&473_177&454_154&383_386&473-0_0_3_24_33_29_16-63-7.jpg'
    
    annotation = parse_ccpd_filename(os.path.basename(img_path))
    print(f"车牌号码:{annotation['plate']}")
    print(f"边界框:{annotation['bbox']}")
    
    img = visualize_ccpd_annotation(img_path, annotation)
    cv2.imshow('CCPD Annotation', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

6.3 PyTorch Dataset类

下面是一个用于PyTorch的CCPD Dataset类,可以直接用于模型训练:

python 复制代码
import torch
from torch.utils.data import Dataset
from PIL import Image

class CCPDDataset(Dataset):
    def __init__(self, data_dirs, transform=None):
        """
        Args:
            data_dirs: CCPD子目录列表(如['./data/CCPD2020/CCPD-Base', './data/CCPD2020/CCPD-Blur'])
            transform: 图像变换
        """
        self.transform = transform
        self.img_list = []
        
        # 递归加载所有目录下的jpg图片
        for data_dir in data_dirs:
            for root, _, files in os.walk(data_dir):
                for file in files:
                    if file.endswith('.jpg'):
                        self.img_list.append(os.path.join(root, file))
    
    def __len__(self):
        return len(self.img_list)
    
    def __getitem__(self, idx):
        img_path = self.img_list[idx]
        img = Image.open(img_path).convert('RGB')
        
        annotation = parse_ccpd_filename(os.path.basename(img_path))
        
        if self.transform:
            img = self.transform(img)
        
        return img, annotation

# 示例:加载CCPD-Base和CCPD-Blur进行训练
if __name__ == '__main__':
    from torchvision import transforms
    
    transform = transforms.Compose([
        transforms.Resize((640, 640)),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    ])
    
    dataset = CCPDDataset(
        data_dirs=[
            './data/CCPD2020/CCPD-Base',
            './data/CCPD2020/CCPD-Blur'
        ],
        transform=transform
    )
    
    print(f"总样本量:{len(dataset)}")
    
    # 创建数据加载器
    dataloader = torch.utils.data.DataLoader(dataset, batch_size=16, shuffle=True, num_workers=4)
    
    # 遍历一个batch
    for imgs, annotations in dataloader:
        print(f"Batch size: {imgs.shape[0]}")
        print(f"第一个样本的车牌:{annotations['plate'][0]}")
        break

7. 应用场景与学术价值

7.1 算法训练与基准测试

CCPD是几乎所有中文车牌识别算法的标准基准:

  • 车牌检测:YOLO系列、SSD、Faster R-CNN等目标检测算法
  • 字符识别:CRNN、LPRNet、Attention-OCR等序列识别算法
  • 端到端识别:YOLO-LPR、PlateNet等一体化车牌识别算法
  • 关键点检测:用于车牌倾斜校正的关键点检测算法

7.2 工业级系统开发

CCPD的场景覆盖度和标注质量完全满足工业级应用的需求:

  • 智能停车场车牌识别系统
  • 高速路口电子警察系统
  • 小区出入口车辆管理系统
  • 物流园区车辆追踪系统

7.3 学术研究贡献

截至2026年,已有超过2000篇学术论文使用CCPD数据集,涵盖:

  • 车牌识别算法的创新
  • 小样本车牌识别
  • 低质车牌图像增强
  • 多任务车牌理解
  • 边缘设备上的轻量化车牌识别

8. 局限性与衍生数据集

8.1 现有不足

尽管CCPD非常优秀,但它仍然存在一些局限性:

  1. 地域限制:仅包含中国大陆车牌,缺少港澳台地区和国外车牌
  2. 数据类型限制:主要是静态图片,没有视频序列数据
  3. 标注格式:文件名标注法虽然方便,但不是标准的COCO/VOC格式,需要自己解析
  4. 极端场景:部分极端场景(如严重污损、完全遮挡)的样本仍然不足
  5. 无语义信息:没有车辆类型、颜色、品牌等额外的语义标注

8.2 社区衍生数据集

为了弥补这些不足,社区已经开发了多个高质量的衍生数据集:

重要提醒:所有社区衍生数据集的标注质量均不如官方CCPD,使用前建议进行人工校验;工业级应用建议以官方CCPD为主,衍生数据集仅作为补充用于提升特定场景的鲁棒性。

9. 总结与资源推荐

9.1 总结

CCPD数据集的出现,极大地推动了中文车牌识别技术的发展。它以超大的规模、丰富的场景、精准的标注和完全开源的特性,成为了中文车牌识别领域不可替代的"黄金标准"。

无论是学术研究还是工业开发,CCPD都是入门和进阶车牌识别的首选数据集。它不仅提供了高质量的训练数据,还建立了统一的评估标准,使得不同算法之间的比较更加公平和可靠。

9.2 资源推荐

相关推荐
吃着火锅x唱着歌2 小时前
深度探索C++对象模型 学习笔记 第三章 Data语意学(2)
c++·笔记·学习
_李小白2 小时前
【OSG学习笔记】Day 35: Material(材质)
笔记·学习·材质
ZhiqianXia2 小时前
Pytorch 学习笔记(21) : PyTorch Profiler
pytorch·笔记·学习
iiiiii112 小时前
【论文阅读笔记】ReVal:让大模型强化学习真正支持离策略(off-policy)数据复用
论文阅读·笔记·语言模型·大模型·llm
炽烈小老头2 小时前
【每天学习一点算法 2026/04/10】Excel表列序号
学习·算法
渡我白衣2 小时前
运筹帷幄——在线学习与实时预测系统
人工智能·深度学习·神经网络·学习·算法·机器学习·caffe
ZhiqianXia2 小时前
PyTorch学习笔记(16):scheduler.py
pytorch·笔记·学习
半壶清水2 小时前
[软考网规考点笔记]-局域网之高速以太网
网络·笔记·网络协议·考试
一定要AK10 小时前
Spring 入门核心笔记
java·笔记·spring