news 2026/9/11 20:23:33

PaddleOCR 数据集准备完全指南:文本检测与识别数据格式、公开数据集与训练目录组织

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaddleOCR 数据集准备完全指南:文本检测与识别数据格式、公开数据集与训练目录组织

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 2015https://rrc.cvc.uab.es/?ch=4&com=downloadstrain / test(见官方文档表格中的链接,位于paddleocr.bj.bcebos.com数据集目录)
ctw1500https://paddleocr.bj.bcebos.com/dataset/ctw1500.zip图片下载地址中已包含
total texthttps://paddleocr.bj.bcebos.com/dataset/total_text.tar图片下载地址中已包含
td trhttps://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:生成识别还是检测标注,可取值recdet,默认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函数为例,可以看到转换过程的三个关键步骤:

  1. 遍历原始标注目录input_dir下的所有 label 文件,通过文件名切片label_file[3:-4] + ".jpg"拼接出对应的图像相对路径;
  2. 逐行读取原始标注(处理 UTF-8 BOM 头\xef\xbb\xbf),按逗号切分,前 8 个数字每两个一组构成一个点的(x, y)坐标,第 9 个字段作为transcription文本;
  3. 组装成{"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-%09dimage-%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 2015http://rrc.cvc.uab.es/?ch=4&com=downloadstrain / 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 的训练配置衔接起来,整体数据流如下:

  1. 标注文件:按本文第 2、3 节格式准备的train_icdar2015_label.txt/rec_gt_train.txt等文件;
  2. 配置声明:在训练 yml 的Train.dataset中设置nameSimpleDataSetMultiScaleDataSet等)、data_dirlabel_file_listtransforms(检测需包含DetLabelEncode,识别需包含RecConAug/RecAug与标签编码算子);
  3. 数据加载SimpleDataSet.__getitem__delimiter拆分行,拼接data_dir + 文件名得到图像绝对路径,读取图像字节后交给transforms中的各算子完成解码、增广与编码;
  4. 无效样本处理:检测标注中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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 20:21:44

G1垃圾回收器:Java大内存应用性能优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 20:20:43

WSUS漏洞CVE-2025-59287深度解析:未认证远程代码执行的危害与加固

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 20:19:10

Flutter与OpenHarmony跨平台待办应用开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 20:17:24

用C++23重写RTOS:协程与模块化设计实践指南

最近半年我一直在折腾一个叫 ZerOS 的小项目。说白了&#xff0c;就是想把传统 RTOS 里那套任务、信号量、队列、中断管理的经典逻辑&#xff0c;用 C23 重新表达一遍。刚开始只是觉得 C 语言写内核实在太啰嗦了&#xff0c;后来越写越发现&#xff0c;语言层面的变化对整个系统…

作者头像 李华
网站建设 2026/9/11 20:17:19

直流母线电容选型:纹波电流校核与三种拓扑计算实例

选直流母线电容&#xff0c;这是我被问得最多的话题。前阵子一个做储能变换器的朋友&#xff0c;拿着算好的铭牌过来问我&#xff1a;“公式都套了&#xff0c;容量也对&#xff0c;为什么满载跑二十分钟电容烫得不敢碰&#xff1f;”我看了一眼设计&#xff0c;容量确实按教科…

作者头像 李华