TextRecognitionDataGenerator
批量生成 OCR 训练用文字图片,支持 130+ 语言、多种字体与图像退化效果的数据合成工具
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
批量生成 OCR 训练用文字图片,支持 130+ 语言、多种字体与图像退化效果的数据合成工具
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
在 OCR(光学字符识别)模型的训练过程中,数据不足一直是困扰开发者的核心难题。真实场景的文字图片获取成本高、标注工作量大,而且很多场景(票据、手写体、多语言混杂)的样本本身就极为稀缺。一个法国的 ML 工程师 Edouard Belval 在训练自己的 OCR 模型时,同样被这个问题卡住了脖子——他没有足够多的多样化文字图片来喂饱他的模型。
于是,他做了一个开发者会做的决定:自己动手,丰衣足食。他写了一个 Python 脚本,能够随机生成任意文本内容、字体、背景、噪声的文字图片。这个最初用来解决自己问题的小工具,在 2017 年左右被整理开源后,迅速成为 OCR 领域最受欢迎的数据合成工具之一——它就是 TextRecognitionDataGenerator(以下简称 trdg),目前已斩获超过 3600 颗 GitHub Stars,fork 数超过 1000 次。
打个比方:如果把 OCR 模型比作一个正在学认字的孩子,trdg 就相当于一本超级练习册——这本练习册可以无限量生成各种字迹、各种纸张、各种污渍的文字图片,让孩子反复练习,直到认字又快又准。
trdg 的核心逻辑非常清晰:随机选一段文本 → 选一个字体 → 写到某种背景上 → 叠加各种"真实感"效果 → 输出图片和标注。以下是它支持的主要能力:
trdg 内置了覆盖全球主要语言的词典文件,包括拉丁语系(英、法、德、西等)、中文(简体/繁体)、日语、韩语、泰语、阿拉伯语、印地语、越南语等在内的 130+ 种语言。用户只需指定语言代码(如 -l cn 生成中文,-l ja 生成日语),即可批量生成对应语种的文字图片。
每种语言的字体放在独立的子目录中:fonts/latin、fonts/cn、fonts/ko、fonts/ja、fonts/th、fonts/ar。trdg 自带了 Aller、Lato、Roboto、OpenSans、Raleway 等数十种开源字体文件,用户也可以自行添加任何 .ttf 字体文件来扩展字库。生成时脚本会随机选取字体,确保输出的图片字体风格多样。
这是 trdg 最核心的差异化能力。通过丰富的参数组合,可以模拟真实世界中文字图片的各种退化情况:
| 效果类型 | 参数 | 说明 |
|---|---|---|
| 文字倾斜 | -k, -rk | 随机角度斜切,模拟拍照透视变形 |
| 模糊 | -bl, -rbl | 高斯模糊,模拟老旧扫描件 |
| 扭曲 | -d, -do | 波浪/正弦扭曲,模拟纸张卷曲 |
| 背景 | -b | 4种背景:噪声白(0)、纯白(1)、准晶体(2)、图片背景(3) |
| 描边 | --stroke_width | 文字轮廓描边,增加厚重感 |
| 颜色 | -tc | 文字颜色范围,如 #000000,#FFFFFF |
| 字间距 | --character_spacing | 控制字符间距 |
| 手写体 | -hw | 调用 TensorFlow 手写模型生成手写风格图片 |
-hw 参数会调用一个预训练的 TensorFlow 手写生成模型(基于 Grzego/handwriting-generation),生成看起来真实的手写文字图片。注意:使用此功能需要安装 TensorFlow,其他场景不需要。
除了命令行,trdg 还提供 Python API,支持集成到训练 pipeline 中:
from trdg.generators import GeneratorFromDict, GeneratorFromRandom, GeneratorFromStrings, GeneratorFromWikipedia
generator = GeneratorFromStrings(
['Test1', 'Test2', 'Test3'],
blur=2,
random_blur=True
)
for img, lbl in generator:
# 直接处理 Pillow Image 对象
pass
四种 Generator 的区别在于文本来源:从词典随机选 / 从内置词典选 / 从自定义字符串列表 / 从维基百科文章中提取。
trdg 的部署极其简单,提供了三种方式:
方式一:pip 安装(推荐)
pip install trdg
安装后直接使用 trdg 命令行工具,零配置开箱即用。
方式二:GitHub 源码安装
git clone https://github.com/Belval/TextRecognitionDataGenerator
cd TextRecognitionDataGenerator
pip install -r requirements.txt
方式三:Docker 容器
docker pull belval/trdg:latest
docker run -v /output/path/:/app/out/ -t belval/trdg:latest trdg [args]
Docker 方式适合在无 Python 环境的服务器上快速部署,数据通过 volume 挂载读写。
硬件需求:纯 CPU 运行,不需要 GPU。推荐 2GB RAM + 1GB 磁盘空间即可运行。
trdg 的代码结构简洁明了,核心模块如下:
| 模块 | 职责 |
|---|---|
data_generator.py | 图片生成主逻辑,串联所有子模块 |
computer_text_generator.py | 渲染普通印刷体文字 |
handwritten_text_generator.py | 生成手写字(TensorFlow) |
background_generator.py | 生成背景(噪声/纯色/准晶体/图片) |
distorsion_generator.py | 文字扭曲(正弦/波浪/随机) |
string_generator.py | 文本字符串生成(词典/随机/Wikipedia) |
generators/ | 四种 Python API Generator 类 |
dicts/ | 130+ 语言的词典文件 |
fonts/ | 按语言分类的 TTF 字体文件 |
生成流程:用户传入参数 → string_generator 选文本 → computer_text_generator 用 PIL 渲染 → 叠加 skewing/blur/distorsion → background_generator 合成背景 → data_generator 组合输出。
这种模块化设计使得每种效果都可以独立调整或替换,非常适合二次开发。
尽管 trdg 功能强大,但它也存在一些局限,使用时需要心里有数:
1. 合成的"真实感"有上限 trdg 生成的是通过规则叠加效果模拟真实退化,而真实的 OCR 应用场景(老旧档案扫描、车牌识别、街景文字)退化模式更为复杂多样。在这些场景下,合成数据只能作为数据增强的补充,而非完全替代真实数据。
2. 字体版权风险 trdg 自带的数十种字体中,部分商业字体可能存在许可限制。在商业项目中集成使用时,建议替换为明确开源授权的字体(如 Google Fonts 系列)。
3. 手写体功能需要 TensorFlow 1.x 手写体生成依赖的 TensorFlow 模型是较老的 1.x 版本,与当前主流的 TF2.x 环境不兼容。如果只需要印刷体生成,可以忽略这个功能。
4. 多行文本支持有限 trdg 主要针对单词/短语级别的图片生成,对多行段落或复杂版面的支持较为薄弱。
trdg 的出现,体现了一个重要的趋势:数据合成正在成为 AI 民主化的关键基础设施之一。在传统观念里,高质量训练数据是科技大公司的专利,中小团队只能望洋兴叹。而 trdg 这类工具证明了:只要理解了数据的生成规律,很多场景的数据瓶颈是可以被"工程化"解决的。
从技术演进角度看,trdg 代表的合成数据方法与当下火热的"世界模型生成合成数据"趋势一脉相承——都在试图用规则或模型生成更多、更丰富的训练样本,而非被动等待真实数据的积累。
如果你正在训练一个 OCR 模型,或正在研究场景文本检测(Scene Text Detection),trdg 值得作为数据管道的第一个组件纳入你的技术选型。
以下是 trdg 生成效果的实际样张(所有图片均来自官方仓库 samples/ 目录,已验证 HTTP 200 可访问):
手写体效果(-hw):
图1:手写体合成 — 调用 TensorFlow 模型生成的手写风格文字
图2:手写体多样化 — 不同手写风格和角度的文字图片
模糊效果(-bl -rbl):
图3:高斯模糊0 — 清晰对照基准
图4:高斯模糊1 — 模拟分辨率不足的扫描效果
中文文字生成:
图5:繁体中文渲染 — 简繁体中文支持
图6:简体中文渲染 — 中文场景文本训练数据
背景叠加效果:
图7:图片背景模式 — 在真实图片背景上叠加文字
图8:准晶体纹理背景 — 几何纹理背景增加真实感
扭曲效果:
图9:波浪扭曲 — 模拟纸张卷曲造成的文字变形
图10:正弦扭曲 — 不同方向的波浪扭曲效果