PaddleOCR 多语言模型训练教程

本教程属于训练其他语言的训练教程,中文英文已经拥有他自己的模型,但是其他语言没有,我实习的内容是大模型性能提升,负责的是OCR部分,需要训练没有发布的语言模型

数据准备

  • 解释了如何使用真实数据和合成数据来准备大量的训练图像。
  • 详细介绍了使用 PPOCRLabel 进行标注,以及如何合成数据(词典、语料库、字体、背景图片)。

模型训练与评估

  • 提供了一个典型的配置文件的示例,展示了如何通过配置文件进行模型训练。
  • 包括了单 GPU 和多 GPU 训练方式的说明,并提到了如何评估模型的性能。

推理

  • 说明了如何使用训练好的模型进行推理。

合成数据和相关资源链接

这些资源可以帮助你更深入地理解和实现自定义语言模型的训练和使用。

PaddleOCR 提供了 80 种语言模型,但仍然无法覆盖全部。发布的模型可以通过使用自己的识别数据进行微调来达到更好的效果。如果您有以下问题:

  • 测试原始识别模型时效果不佳
  • 缺乏数据,对训练过程感到困惑
  • 不知道如何替换或修改词典

本教程将帮助您学习如何合成识别图像来训练自定义识别模型,具体包括:

  • 语料合成可以提高某一类别的识别结果,以泰语为例
  • 使用您自己的词典和语料来训练模型,如纯数字模型、多语言模型等。
  • 分步训练指南,包括如何通过 .yml 配置文件配置训练参数
  • 将训练好的模型导出到推理模型

环境准备

# 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 listchars_file到你的字体和字典的路径即可

将准备好的语料库、词典、背景图放在text_renderer/data目录下,并修改默认配置,以英文数据为例。

  1. 准备thai_movies.txt中列出的n个语料库
  2. 如果要增强数据丰富度,可以准备一些背景图放在data/bg路径下,本例提供了5张imagenet。
  3. 修改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_pathdataset

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
GitHub 加速计划 / pa / PaddleOCR
41.53 K
7.59 K
下载
Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)
最近提交(Master分支:3 个月前 )
7bbda2bc 6 天前
1d4e7a80 8 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐