PaddleOCR 多语言模型训练教程
本教程属于训练其他语言的训练教程,中文英文已经拥有他自己的模型,但是其他语言没有,我实习的内容是大模型性能提升,负责的是OCR部分,需要训练没有发布的语言模型
数据准备
- 解释了如何使用真实数据和合成数据来准备大量的训练图像。
- 详细介绍了使用 PPOCRLabel 进行标注,以及如何合成数据(词典、语料库、字体、背景图片)。
模型训练与评估
- 提供了一个典型的配置文件的示例,展示了如何通过配置文件进行模型训练。
- 包括了单 GPU 和多 GPU 训练方式的说明,并提到了如何评估模型的性能。
推理
- 说明了如何使用训练好的模型进行推理。
合成数据和相关资源链接
- 完整代码链接: https://aistudio.baidu.com/projectdetail/8244749
- 数据集链接: https://aistudio.baidu.com/datasetdetail/291204
这些资源可以帮助你更深入地理解和实现自定义语言模型的训练和使用。
PaddleOCR 提供了 80 种语言模型,但仍然无法覆盖全部。发布的模型可以通过使用自己的识别数据进行微调来达到更好的效果。如果您有以下问题:
- 测试原始识别模型时效果不佳
- 缺乏数据,对训练过程感到困惑
- 不知道如何替换或修改词典
本教程将帮助您学习如何合成识别图像来训练自定义识别模型,具体包括:
- 语料合成可以提高某一类别的识别结果,以泰语为例
- 使用您自己的词典和语料来训练模型,如纯数字模型、多语言模型等。
- 分步训练指南,包括如何通过
.yml
配置文件配置训练参数 - 将训练好的模型导出到推理模型
![](https://img-blog.csdnimg.cn/img_convert/c17631c7bd26385e57b91a17a41bfb37.png)
环境准备
# install paddlepaddle and paddleocr whl package
# !pip install -U pip
!pip install paddlepaddle paddleocr
!git clone https://github.com/PaddlePaddle/PaddleOCR
安装第三方要求
!cd PaddleOCR && pip install -r requirements.txt
!pip install -r ./text_renderer/requirements.txt
快速使用
首先我们展示 paddleocr WHL 包的使用方法。如果您想了解如何使用 WHL 包,请查看本教程。
!paddleocr --image_dir /your/image/path --lang=en
数据准备
训练一个识别模型总是需要大量的识别图像,比如 0.1 到 100 万张。除了现有的数据集之外,一般很难获得这么多的真实数据,因此合成数据往往在扩充数据量方面起着重要作用。另一方面,如果只有合成数据,模型的泛化能力可能不够强。在实际训练过程中,按一定比例采样真实数据和合成数据往往是更好的方法。
真实数据标注
我们推荐使用 PPOCRLabel 作为 OCR 任务的标注工具,因为它内置了 PP-OCR 模型,可以自动检测和重新识别数据,效率可提高 50% 以上。
更多信息请阅读 PPOCRLabel 的 README
合成数据
数据合成工具:
合成识别图像需要五个元素:词典、语料、字体、背景图片、文本图片生成器工具(推荐text_renderer,适用于多种语言),然后通过间距、横竖、弯曲等配置来控制最终的效果,使合成图像能够近似真实图像。
接下来我们依次介绍如何获取这些元素。
词典和语料库
词典对应模型需要识别的文本信息,也就是说需要识别的文本都应该在词典中出现。语料库是生成文本图片所需要的单词和句子,合成工具会根据语料库来合成文本图片。
PaddleOCR 中的词典文件和语料文件都是 .txt 格式。
例如部分泰语词典如下:
ก
ข
ค
ฆ
ง
จ
ฉ
ช
ซ
ฌ
ญ
ฎ
ฏ
部分泰语语料库如下:
โต้ทีดีอาร์ไอ
แต่คำตอบที่ว่า
ทุกกรณีปัญหา
นักรักชาติ
“นโยบายสามหก”
Islington
อะซีม
获取词典和语料库有三种方式
- 从 PaddleOCR github 仓库下载
PaddleOCR 在 github 仓库 中发布了一系列词典,用于训练 PP-OCR 多语言模型(训练好的模型可以在 此处 找到)。
- 自定义词典或语料库
以上词典往往用于通用场景,而其他场景需要的字符是特定的,或者通用词典中的字符不一定全部需要,因此可以根据场景自定义词典的内容。比如你只想识别数字,你的词典就只包含0-9。
如果你想有针对性地提高某些效果,比如空格、特殊符号、标点符号等,可以在构建语料库时多添加这些信息
- 通过语料库获取词典
第三种方法是基于语料库准备词典。这种方法适合先准备语料库内容,通过算法遍历语料库内容,生成包含语料库中所有单词的词典。
字体和背景
当模型识别一些没见过的字体形式(比如点阵字体、数码管字体)时,可能会出现不好的效果,所以需要合成类似字体的数据。
你可以在字体网站找到不同类型的字体。
合成数据的背景应该与真实数据相似。如果你针对特定场景训练模型,你可以直接从真实数据中抓取背景图像。例如,在PCB场景中,图像都是绿色的,这就需要一张类似的绿色图像作为背景。
如果场景中的背景不均匀,你也可以使用ImageNet中的数据作为背景图像
开始合成
使用text renderer
的方法很简单,只需要指定fonts list
,chars_file
到你的字体和字典的路径即可
将准备好的语料库、词典、背景图放在text_renderer/data目录下,并修改默认配置,以英文数据为例。
- 准备thai_movies.txt中列出的
n
个语料库 - 如果要增强数据丰富度,可以准备一些背景图放在
data/bg路径
下,本例提供了5张imagenet。 - 修改
text_renderer/parse_args.py
中的默认参数:--chars_file
、--fonts_list
、--corpus_dir
、--corpus_mode
启动数据合成脚本
!cd text_renderer && python main.py --num_img=10
另外,可用于训练 PaddleOCR 的真实信息存储在 output/default/label.txt
中
default/00000000.jpg (พลังน้ำ)
default/00000001.jpg โต้ทีดีอาร์ไอ
default/00000002.jpg แต่คำตอบที่ว่า
default/00000003.jpg ทุกกรณีปัญหา
default/00000004.jpg นักรักชาติ
default/00000005.jpg “นโยบายสามหก”
default/00000006.jpg และคนมีเหตุมีผล
...
泰语数据
由于合成过程较长,提供已合成的泰语数据集。
点击链接将合成泰语数据保存到您的 Google Drive,然后从您的 Drive 中打开文件,将 th_img.tar
解压到 PaddleOCR 文件夹。
PaddleOCR 要求的标注格式是使用 \t
来分割图片路径和图片标签,如果使用其他方式分割,会造成训练误差
" Image file name Image annotation "
th_img/0/ILSVRC2012_val_00019591_5.jpg ทุกกรณีปัญหา
th_img/0/ILSVRC2012_val_00010000_5.jpg ทุกกรณีปัญหา
th_img/0/ILSVRC2012_val_00012707_5.jpg ทุกกรณีปัญหา
th_img/0/ILSVRC2012_val_00017283_5.jpg ทุกกรณีปัญหา
th_img/0/ILSVRC2012_val_00012583_5.jpg ทุกกรณีปัญหา
th_img/0/ILSVRC2012_val_00015817_6.jpg นักรักชาติ
th_img/0/ILSVRC2012_val_00018484_6.jpg นักรักชาติ
th_img/0/ILSVRC2012_val_00010596_6.jpg นักรักชาติ
th_img/0/ILSVRC2012_val_00013689_6.jpg นักรักชาติ
th_img/0/ILSVRC2012_val_00013117_6.jpg นักรักชาติ
...
当您使用自己的数据进行训练时,请参考以下内容来组织文件结构。
- 训练集
建议将训练图像放在同一个文件夹中,并使用一个txt文件(例如rec_gt_train.txt
)存储图像路径和标签。rec_gt_train.txt
的格式如上。txt文件的内容如下:
最终的训练集应该具有以下文件结构:
|-train_data
|-rec
|- rec_gt_train.txt
|- train
|- word_001.png
|- word_002.jpg
|- word_003.jpg
| ...
- 测试集
与训练集类似,测试集也需要提供一个包含所有图像的文件夹(test)和一个rec_gt_test.txt。测试集的结构如下:
|-train_data
|-rec
|-ic15_data
|- rec_gt_test.txt
|- test
|- word_001.jpg
|- word_002.jpg
|- word_003.jpg
| ...
模型训练与评估
PaddleOCR 将训练参数以配置文件的形式传入(包括模型结构、训练配置等),下面是一个典型的配置文件形式。
我们对下面一些重要的参数进行了注释,更多配置可以在 /config/
中找到
如果需要添加新的配置文件,请参考下面的示例修改 character_dict_path
和 dataset
Global:
debug: false
use_gpu: true
epoch_num: 2
log_smooth_window: 20
print_batch_step: 10
save_model_dir: ./output/thai
save_epoch_step: 3
eval_batch_step: [0, 2000]
cal_metric_during_train: true
pretrained_model:
checkpoints:
save_inference_dir:
use_visualdl: false
infer_img: doc/imgs_words/ch/word_1.jpg
character_dict_path: train_data/th_img/th_dict.txt
max_text_length: &max_text_length 25
infer_mode: false
use_space_char: true
distributed: true
save_res_path: ./output/rec/predicts_ppocrv3_thai.txt
Optimizer:
name: Adam
beta1: 0.9
beta2: 0.999
lr:
name: Cosine
learning_rate: 0.001
warmup_epoch: 5
regularizer:
name: L2
factor: 3.0e-05
Architecture:
model_type: rec
algorithm: SVTR_LCNet
Transform:
Backbone:
name: MobileNetV1Enhance
scale: 0.5
last_conv_stride: [1, 2]
last_pool_type: avg
last_pool_kernel_size: [2, 2]
Head:
name: MultiHead
head_list:
- CTCHead:
Neck:
name: svtr
dims: 64
depth: 2
hidden_dims: 120
use_guide: True
Head:
fc_decay: 0.00001
- SARHead:
enc_dim: 512
max_text_length: *max_text_length
Loss:
name: MultiLoss
loss_config_list:
- CTCLoss:
- SARLoss:
PostProcess:
name: CTCLabelDecode
Metric:
name: RecMetric
main_indicator: acc
ignore_space: False
Train:
dataset:
name: SimpleDataSet
data_dir: ./train_data/
ext_op_transform_idx: 1
label_file_list:
- ./train_data/th_img/train_list.txt
transforms:
- DecodeImage:
img_mode: BGR
channel_first: false
- RecConAug:
prob: 0.5
ext_data_num: 2
image_shape: [48, 320, 3]
- RecAug:
- MultiLabelEncode:
- RecResizeImg:
image_shape: [3, 48, 320]
- KeepKeys:
keep_keys:
- image
- label_ctc
- label_sar
- length
- valid_ratio
loader:
shuffle: true
batch_size_per_card: 128
drop_last: true
num_workers: 4
Eval:
dataset:
name: SimpleDataSet
data_dir: ./train_data
label_file_list:
- ./train_data/th_img/val_list.txt
transforms:
- DecodeImage:
img_mode: BGR
channel_first: false
- MultiLabelEncode:
- RecResizeImg:
image_shape: [3, 48, 320]
- KeepKeys:
keep_keys:
- image
- label_ctc
- label_sar
- length
- valid_ratio
loader:
shuffle: false
drop_last: false
batch_size_per_card: 128
num_workers: 4
训练
因为我们通过配置文件指定了很多参数,所以启动模型训练任务的命令很简单,只需要通过-c
指定配置文件的路径即可
!python3 tools/train.py -c configs/rec/PP-OCRv3/multi_language/latin_PP-OCRv3_rec.yml
PaddleOCR 提供了单GPU和多GPU两种训练方式。当数据量较大时,我们建议使用多GPU模式,命令如下:
#通过--gpus指定GPU数量
python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec.yml -o Global.pretrained_model=en_PP-OCRv3_rec_train/best_accuracy
这里由于平台上不是每个人都可以使用多GPU模式,所以我们还是使用单CPU来启动基础训练。
由于我们提供的数据集大小不足以训练出好的泰语模型,我们建议您合成或添加更多数据。
!python3 tools/train.py -c train_data/th_img/thai_PP-OCRv3_rec.yml -o Global.use_gpu=False
如果你熟悉持续训练、使用新主干进行训练、混合精度训练、使用知识蒸馏进行训练,你可以在本文档中了解更多用法
评估
训练时的模型参数默认保存在Global.save_model_dir
目录下,评估指标时需要设置Global.checkpoints
指向保存的参数文件,评估数据集可以通过修改configs/rec/PP-OCRv3/{your/config/file}.yml
文件中的Eval.dataset.label_file_list
字段来设置。
!python3 tools/eval.py -c train_data/th_img/thai_PP-OCRv3_rec.yml -o Global.checkpoints=./output/thai/best_accuracy
推理
!python3 tools/infer_rec.py -c train_data/th_img/thai_PP-OCRv3_rec.yml -o Global.checkpoints=./output/thai/best_accuracy Global.infer_img=./train_data/th_img/0/ILSVRC2012_val_00019591_5.jpg