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 核心子集详解
-
CCPD-Base(基础集)
- 样本量:约20万张
- 特点:场景相对简单,车牌清晰、无明显遮挡、角度正常
- 用途:模型的基础训练,学习车牌的基本特征
-
CCPD-Blur(模糊集)
- 样本量:约2万张
- 特点:包含运动模糊、对焦模糊、雾霾导致的模糊
- 用途:测试算法对模糊车牌的识别能力
-
CCPD-Rotate(水平倾斜集)
- 样本量:约2万张
- 特点:车牌水平倾斜角度在-30°到+30°之间
- 用途:测试算法对水平倾斜车牌的校正和识别能力
-
CCPD-Tilt(垂直倾斜集)
- 样本量:约2万张
- 特点:车牌垂直倾斜角度在-15°到+15°之间
- 用途:测试算法对垂直倾斜车牌的识别能力
-
CCPD-DB(遮挡集)
- 样本量:约2万张
- 特点:车牌被雨刮器、灰尘、贴纸、其他车辆等部分遮挡
- 用途:测试算法对遮挡车牌的补全和识别能力
-
CCPD-FN(恶劣天气集)
- 样本量:约1万张
- 特点:雨天、雪天、雾天拍摄的车牌
- 用途:测试算法在恶劣天气下的鲁棒性
-
CCPD-Challenge(挑战集)
- 样本量:约1万张
- 特点:综合了多种困难因素,是整个数据集中最难的子集
- 用途:算法的最终性能评估,比较不同算法的优劣
-
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仓库下载对应版本的数据集:
- CCPD2019/2020/CCPD-Green:https://github.com/detectRecog/CCPD#dataset-download
下载后解压到本地目录,建议的目录结构:
./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非常优秀,但它仍然存在一些局限性:
- 地域限制:仅包含中国大陆车牌,缺少港澳台地区和国外车牌
- 数据类型限制:主要是静态图片,没有视频序列数据
- 标注格式:文件名标注法虽然方便,但不是标准的COCO/VOC格式,需要自己解析
- 极端场景:部分极端场景(如严重污损、完全遮挡)的样本仍然不足
- 无语义信息:没有车辆类型、颜色、品牌等额外的语义标注
8.2 社区衍生数据集
为了弥补这些不足,社区已经开发了多个高质量的衍生数据集:
重要提醒:所有社区衍生数据集的标注质量均不如官方CCPD,使用前建议进行人工校验;工业级应用建议以官方CCPD为主,衍生数据集仅作为补充用于提升特定场景的鲁棒性。
9. 总结与资源推荐
9.1 总结
CCPD数据集的出现,极大地推动了中文车牌识别技术的发展。它以超大的规模、丰富的场景、精准的标注和完全开源的特性,成为了中文车牌识别领域不可替代的"黄金标准"。
无论是学术研究还是工业开发,CCPD都是入门和进阶车牌识别的首选数据集。它不仅提供了高质量的训练数据,还建立了统一的评估标准,使得不同算法之间的比较更加公平和可靠。
9.2 资源推荐
-
官方GitHub仓库:https://github.com/detectRecog/CCPD
-
官方论文:《Towards End-to-End License Plate Detection and Recognition: A Large Dataset and Baseline》