PaddleOCR 数据集准备完全指南:文本检测与识别数据格式、公开数据集与训练目录组织
【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100+ languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR
本篇技术指南以 PaddleOCR 仓库中的 OCR数据集文档 为核心,系统讲解文本检测(Detection)与文本识别(Recognition)两条任务线的数据格式规范、公开数据集获取方式、官方标注转换脚本的使用方法,以及训练数据目录的标准组织方式。读完本文,你将掌握如何在自有数据上构建符合 PaddleOCR 训练要求的标注文件,并能够将 ICDAR 2015 等公开数据集一键转换为可直接训练的格式。
1. 数据格式总览:检测与识别各有一套标注规范
PaddleOCR 的训练数据按任务分为两类:文本检测(Det)与文本识别(Rec)。两者使用的标注文件格式完全不同,分别由不同的数据加载器读取:
| 任务 | 标注文件格式 | 数据加载器(源码) |
|---|---|---|
| 文本检测 | 每行一张图,图像路径 \t JSON标注 | simple_dataset.py 中的SimpleDataSet |
| 文本识别(通用格式) | 每行一条样本,图像路径 \t 文本标签 | simple_dataset.py 中的SimpleDataSet |
| 文本识别(LMDB 格式) | 二进制 LMDB 数据库 | lmdb_dataset.py 中的LMDBDataSet |
从源码实现看,检测与识别在训练时共用SimpleDataSet作为底层加载器,二者之所以标注格式不同,是因为下游的标注编码算子不同——检测任务使用DetLabelEncode解析 JSON 形式的文本框信息,识别任务则直接按分隔符拆分"图片路径 + 文本标签"。训练配置中通过dataset.name字段指定使用的数据集类,例如 PP-OCRv4_server_det.yml 中训练集声明为SimpleDataSet,而 PP-OCRv4_mobile_rec.yml 中训练集声明为MultiScaleDataSet(它是SimpleDataSet的子类)。
2. 文本检测数据准备
2.1 PaddleOCR 文字检测标注格式
文本检测任务的标注文件每一行对应一张图像,中间用\t(Tab)分隔,格式如下:
" 图像文件名 json.dumps编码的图像标注信息" ch4_test_images/img_61.jpg [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}]其中,json.dumps编码前的标注信息是一个由多个字典组成的 list,每个字典描述一个文本框:
points:文本框四个顶点的坐标(x, y),从左上角开始顺时针排列,共 4 个点;transcription:当前文本框对应的文字内容。当它的值为"###"时,表示该文本框无效,训练时会被跳过(例如包含模糊、截断文字的框)。
如果你要在 PaddleOCR 未提供标注的数据集上训练,只需要按照上述形式自行构建标注文件即可。值得注意的一个细节是:虽然检测标注以 Tab 分隔图片路径与 JSON,但 JSON 字符串内部各字段之间不能使用 Tab,否则解析会错位。
2.2 公开数据集与标注下载
PaddleOCR 官方整理了 4 个常用的文本检测公开数据集,并提供了已经转换好的 PaddleOCR 格式标注(部分数据集图片包内已自带标注):
| 数据集名称 | 图片下载地址 | PaddleOCR 标注下载地址 |
|---|---|---|
| ICDAR 2015 | https://rrc.cvc.uab.es/?ch=4&com=downloads | train / test(见官方文档表格中的链接,位于paddleocr.bj.bcebos.com数据集目录) |
| ctw1500 | https://paddleocr.bj.bcebos.com/dataset/ctw1500.zip | 图片下载地址中已包含 |
| total text | https://paddleocr.bj.bcebos.com/dataset/total_text.tar | 图片下载地址中已包含 |
| td tr | https://paddleocr.bj.bcebos.com/dataset/TD_TR.tar | 图片下载地址中已包含 |
说明:以上下载地址均为原文档中记录的官方资源地址。其中 ctw1500、total text、td tr 三个数据集在下载图片的同时即获得 PaddleOCR 格式标注;ICDAR 2015 需要额外下载转换后的标注文件。
2.2.1 ICDAR 2015 检测数据集详解
ICDAR 2015 数据集包含1000 张训练图像和500 张测试图像,是文本检测领域最常用的基准数据集之一。从官方链接下载时需要先注册账号,注册登录后下载页面中红色框标出的两部分:
Training Set Images:下载内容解压后位于icdar_c4_train_imgs文件夹;Test Set Images:下载内容解压后位于ch4_test_images文件夹。
将下载的数据集解压到工作目录(假设为PaddleOCR/train_data/)后,再下载上表提供的转换好的标注文件。PaddleOCR 还提供了官方格式转换脚本,可一键把 ICDAR 官网的 label 转换成 PaddleOCR 支持的数据格式,脚本位于 gen_label.py,以训练集为例:
# 将官网下载的标签文件转换为 train_icdar2015_label.txt python gen_label.py --mode="det" --root_path="/path/to/icdar_c4_train_imgs/" \ --input_path="/path/to/ch4_training_localization_transcription_gt" \ --output_label="/path/to/train_icdar2015_label.txt"参数含义(对应 gen_label.py 中的命令行解析):
--mode:生成识别还是检测标注,可取值rec或det,默认rec;--root_path:图像根目录,仅在mode=det时生效;--input_path:待转换的原始标注文件(mode=rec)或原始标注目录(mode=det);--output_label:转换后输出的标注文件名,默认out_label.txt。
转换完成后,解压数据集 + 下载标注文件,PaddleOCR/train_data/下应出现两个文件夹和两个文件,按如下方式组织 icdar2015 数据集:
/PaddleOCR/train_data/icdar2015/text_localization/ └─ icdar_c4_train_imgs/ icdar 2015 数据集的训练数据 └─ ch4_test_images/ icdar 2015 数据集的测试数据 └─ train_icdar2015_label.txt icdar 2015 数据集的训练标注 └─ test_icdar2015_label.txt icdar 2015 数据集的测试标注2.2.2 转换脚本源码解析:det 标注是如何生成的
以 gen_label.py 中的gen_det_label函数为例,可以看到转换过程的三个关键步骤:
- 遍历原始标注目录
input_dir下的所有 label 文件,通过文件名切片label_file[3:-4] + ".jpg"拼接出对应的图像相对路径; - 逐行读取原始标注(处理 UTF-8 BOM 头
\xef\xbb\xbf),按逗号切分,前 8 个数字每两个一组构成一个点的(x, y)坐标,第 9 个字段作为transcription文本; - 组装成
{"transcription": ..., "points": [...]}字典列表后,用json.dumps(..., ensure_ascii=False)序列化,最终写出图像路径 \t JSON的一行。
这种"官网文本行 → 四点坐标 + 文本 → JSON 标注"的转换逻辑,正是文档所描述格式的落地实现,也解释了为什么检测标注里每个点都是整数坐标对。
3. 文本识别数据准备
3.1 两种数据格式:LMDB 与通用文本格式
PaddleOCR 的文本识别算法支持两种数据存储方式:
- LMDB 格式:用于训练以 LMDB 数据库存储的数据集,由 lmdb_dataset.py 中的
LMDBDataSet读取。该实现通过load_hierarchical_lmdb_dataset递归扫描data_dir下的所有 LMDB 子库(lmdb_dataset.py),并从num-samples键读取样本总数;读取单条样本时按label-%09d与image-%09d的键命名规则取标签与图像(lmdb_dataset.py)。en benchmark(DTRB 提供)即采用此格式,下载后可直接加载训练。 - 通用文本格式:用于训练以文本文件存储标注的数据集,由 simple_dataset.py 中的
SimpleDataSet读取,这是大多数用户使用的方案,下文重点讲解。
3.2 通用格式:训练集准备
建议将训练图片统一放入同一个文件夹,并用一个 txt 文件(rec_gt_train.txt)记录每张图片的路径与标签。
注意:txt 文件中图片路径与标签默认必须用\t分割,如果用其他方式分割会导致训练报错。这是因为 SimpleDataSet.getitem中通过dataset_config.get("delimiter", "\t")取分隔符(默认\t),并用line.split(self.delimiter)拆分路径与标签,分隔符不一致必然导致解析失败。
标注文件内容示例:
" 图像文件名 图像标注信息 " train_data/rec/train/word_001.jpg 简单可依赖 train_data/rec/train/word_002.jpg 用科技让复杂的世界更简单 ...最终训练集应组织为如下文件结构:
|-train_data |-rec |- rec_gt_train.txt |- train |- word_001.png |- word_002.jpg |- word_003.jpg | ...3.3 离线增广数据的标注:多图共用一个标签
除了"单张图像一行"的格式,PaddleOCR 还支持对离线增广后的数据(即同一文本的多个增广变体)进行训练。为了防止相同样本在同一个 batch 中被多次采样,可以把相同标签对应的多张图片路径以列表形式写在同一行,训练时随机选择列表中的一张进行训练:
["11.jpg", "12.jpg"] 简单可依赖 ["21.jpg", "22.jpg", "23.jpg"] 用科技让复杂的世界更简单 3.jpg ocr上述示例中,"11.jpg"和"12.jpg"的标签相同(都是简单可依赖),训练时该行标注会随机选择其中一张图片参与当前迭代。
这一行为在源码中有明确印证:SimpleDataSet中的_try_parse_filename_list方法(simple_dataset.py)检测到文件名以[开头时,会通过json.loads解析为列表并调用random.choice随机挑选一张,随后才拼接出最终图像路径。
3.4 验证集准备
验证集的准备方式与训练集类似:需要一个包含所有验证图片的文件夹(test)和一个rec_gt_test.txt标注文件。结构如下:
|-train_data |-rec |- rec_gt_test.txt |- test |- word_001.jpg |- word_002.jpg |- word_003.jpg | ...3.5 公开识别数据集
| 数据集名称 | 图片下载地址 | PaddleOCR 标注下载地址 |
|---|---|---|
| en benchmark(MJ, SJ, IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE.) | DTRB 项目(deep-text-recognition-benchmark) | LMDB 格式,可直接用LMDBDataSet加载 |
| ICDAR 2015 | http://rrc.cvc.uab.es/?ch=4&com=downloads | train / test(见官方文档表格中的链接) |
| 多语言数据集 | 百度网盘(提取码见原文档表格) | 图片下载地址中已包含 |
其中:
- en benchmark由多个英文识别基准(MJ、SJ、IIIT、SVT、IC03、IC13、IC15、SVTP、CUTE)组成,DTRB 提供 LMDB 格式的数据包,下载后可直接用 lmdb_dataset.py 中的
LMDBDataSet加载训练,无需额外转换; - ICDAR 2015识别数据集用于快速验证,需先下载图片,再下载转换好的标注文件;
- 多语言数据集的图片包内自带 PaddleOCR 格式标注。
3.5.1 ICDAR 2015 识别标注转换
同样使用 gen_label.py 转换脚本,以训练集为例:
# 将官网下载的标签文件转换为 rec_gt_label.txt python gen_label.py --mode="rec" --input_path="{path/of/origin/label}" --output_label="rec_gt_label.txt"rec模式的转换逻辑见 gen_label.py 中的gen_rec_label函数:逐行读取原始标注,按逗号切分出图片路径与标签,去掉标签两端的引号,最后以图片路径 \t 标签的格式写出。
数据样式如下图所示,(a) 为原始图片,(b) 为每张图片对应的 Ground Truth 文本文件:
4. 数据存放路径与软链接
PaddleOCR 训练数据的默认存储路径是PaddleOCR/train_data。训练配置中的data_dir字段即指向该目录(例如 PP-OCRv4_server_det.yml 中data_dir: ./train_data/icdar2015/text_localization/,PP-OCRv4_mobile_rec.yml 中data_dir: ./train_data/)。
如果你的磁盘上已有数据集,无需复制,只需创建软链接指向数据集目录:
# linux and mac os ln -sf <path/to/dataset> <path/to/paddle_ocr>/train_data/dataset # windows mklink /d <path/to/paddle_ocr>/train_data/dataset <path/to/dataset>创建软链接后,即可在训练配置的label_file_list中填写相对于data_dir的标注文件路径。以检测任务为例,PP-OCRv4_server_det.yml 中训练集通过label_file_list指定./train_data/icdar2015/text_localization/train_icdar2015_label.txt,这与文档中给出的 icdar2015 目录组织方式完全对应。
5. 训练配置中的数据入口:从标注文件到训练管线
将上述数据格式与 PaddleOCR 的训练配置衔接起来,整体数据流如下:
- 标注文件:按本文第 2、3 节格式准备的
train_icdar2015_label.txt/rec_gt_train.txt等文件; - 配置声明:在训练 yml 的
Train.dataset中设置name(SimpleDataSet或MultiScaleDataSet等)、data_dir、label_file_list、transforms(检测需包含DetLabelEncode,识别需包含RecConAug/RecAug与标签编码算子); - 数据加载:
SimpleDataSet.__getitem__按delimiter拆分行,拼接data_dir + 文件名得到图像绝对路径,读取图像字节后交给transforms中的各算子完成解码、增广与编码; - 无效样本处理:检测标注中
transcription为###的文本框在训练时会被跳过;加载失败的样本会打印错误日志并自动重采样下一张(simple_dataset.py)。
需要特别说明的边界条件:
- Tab 分隔是硬约束:识别标注、检测标注的"路径-标注"之间必须使用
\t,配置文件中也支持通过delimiter自定义分隔符,但需与标注文件保持一致; - 路径基准是
data_dir:标注文件中的图片路径是相对路径,最终由os.path.join(self.data_dir, file_name)解析,因此标注内容与data_dir必须配套组织; - ratio_list 控制采样比例:
SimpleDataSet支持通过ratio_list对多份标注数据按比例采样,ratio < 1.0时会触发每 epoch 的随机子集重采样(见 simple_dataset.py),适合多数据源混合训练场景。
6. 延伸阅读
- 手写体数据集:见 handwritten_datasets.md
- KIE(关键信息抽取)数据集:见 kie_datasets.md
- 版面分析数据集:见 layout_datasets.md
- 表格结构识别数据集:见 table_datasets.md
- 竖排与多语言数据集:见 vertical_and_multilingual_datasets.md
- 数据标注与合成教程:data_annotation.md 与 data_synthesis.md
【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100+ languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考