PaddleOCR使用笔记之模型训练

目录

  • 简介
  • 模型训练
    • 步骤一:文本检测模型(`detection`)
      • 1.准备训练数据集
      • 2.下载预训练模型
        • 模型介绍
        • 下载预训练模型
      • 3. 开始训练
        • 断点训练
      • 4.模型评估
      • 5.模型测试
      • 6.训练模型转inference模型
    • 步骤二:文本识别模型(`recognition`)
      • 1.准备训练数据集
        • 数据下载
        • 数据集划分
      • 2.下载预训练模型
        • 模型介绍
        • 下载预训练模型
      • 3.开始训练
      • 4.评估
      • 5.测试
      • 6.训练模型转inference模型
    • 步骤三:文本角度分类模型
      • 1.准备训练数据集
        • 数据集划分
      • 2.开始训练
        • 数据增强
        • 训练
      • 3.评估
      • 4.预测
      • 5.训练模型转inference模型
  • 步骤四:三模型联合推理
  • 五、放在最后:推理模型列表(V2.0,2021年1月20日更新)
    • 一、文本检测模型
    • 二、文本识别模型
      • 1. 中文识别模型
      • 2. 英文识别模型
      • 3. 多语言识别模型(更多语言持续更新中...)
        • 1. 生成意大利语配置文件测试现有模型
        • 2. 生成意大利语配置文件训练自己的数据
    • 三、文本方向分类模型
  • 参考

简介

PaddleOCR算法主要包含三个部分,分别是:

  • DB文本检测(detection)
  • 检测框矫正(classification)
  • CRNN文本识别(recognition)

在训练时,这三个模型单独进行训练,得到三个模型的训练权重,在推理预测时会把三个模型整合在一起,即PaddleOCR推理模型的最终结果是由上述三个模型串联推理而得,推理步骤大致如下:

  • 第一步,进行文本检测,得到文本位置的检测框;
  • 第二步,根据得到的文本检测框对其进行角度分类;
  • 第三步,进行文本识别。

模型训练

步骤一:文本检测模型(detection)

以文本检测模型(detection)为例,进行训练

1.准备训练数据集

icdar2015数据集可以从官网下载到,首次下载需注册。

将下载到的数据集解压到工作目录下,假设解压在 PaddleOCR/train_data/ 下。另外,PaddleOCR零散的标注文件整理成单独的标注文件,您可以通过wget的方式进行下载。

# 在PaddleOCR路径下
cd PaddleOCR/
wget -P ./train_data/  https://paddleocr.bj.bcebos.com/dataset/train_icdar2015_label.txt
wget -P ./train_data/  https://paddleocr.bj.bcebos.com/dataset/test_icdar2015_label.txt

PaddleOCR 也提供了数据格式转换脚本(该脚本的目的就是将零散的标注文件整理为一个单独的文件),可以将官网 label 转换支持的数据格式。 数据转换工具在 ppocr/utils/gen_label.py, 这里以训练集为例:

# 将官网下载的标签文件转换为 train_icdar2015_label.txt
python gen_label.py --mode="det" --root_path="icdar_c4_train_imgs/"  \
                    --input_path="ch4_training_localization_transcription_gt" \
                    --output_label="train_icdar2015_label.txt"

解压数据集和下载标注文件后,PaddleOCR/train_data/ 有两个文件夹和两个文件,分别是:

/PaddleOCR/train_data/icdar2015/text_localization/
  └─ icdar_c4_train_imgs/         icdar数据集的训练数据
  └─ ch4_test_images/             icdar数据集的测试数据
  └─ train_icdar2015_label.txt    icdar数据集的训练标注
  └─ test_icdar2015_label.txt     icdar数据集的测试标注

提供的标注文件格式如下,中间用"\t"分隔:

" 图像文件名                    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),从左上角的点开始顺时针排列
transcription 表示当前文本框的文字,当其内容为“###”时,表示该文本框无效,在训练时会跳过。

如果您想在其他数据集上训练,可以按照上述形式构建标注文件。

2.下载预训练模型

模型介绍

PaddleOCR开源的文本检测算法列表:

  • DB(paper) [2](ppocr推荐)
  • EAST(paper)[1]
  • SAST(paper)[4]

ICDAR2015文本检测公开数据集上,算法效果如下:

模型 骨干网络 precision recall Hmean 下载链接
EAST ResNet50_vd 85.80% 86.71% 86.25% 下载链接
EAST MobileNetV3 79.42% 80.64% 80.03% 下载链接
DB ResNet50_vd 86.41% 78.72% 82.38% 下载链接
DB MobileNetV3 77.29% 73.08% 75.12% 下载链接
SAST ResNet50_vd 91.39% 83.77% 87.42% 下载链接

Total-text文本检测公开数据集上,算法效果如下:

模型 骨干网络 precision recall Hmean 下载链接
SAST ResNet50_vd 89.63% 78.44% 83.66% 下载链接

说明: SAST模型训练额外加入了icdar2013icdar2017COCO-TextArT等公开数据集进行调优。PaddleOCR用到的经过整理格式的英文公开数据集下载:百度云地址 (提取码: 2bpi)

下载预训练模型

PaddleOCR的检测模型目前支持两种骨干网络,分别是MobileNetV3ResNet_vd系列,您可以根据需求使用PaddleClas中的模型更换骨干网络。

cd PaddleOCR/
# 下载MobileNetV3的预训练模型
wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_large_x0_5_pretrained.tar

# 或,下载ResNet18_vd的预训练模型
wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet18_vd_pretrained.tar

# 或,下载ResNet50_vd的预训练模型
wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_ssld_pretrained.tar

# 解压预训练模型文件,以MobileNetV3为例
tar -xf ./pretrain_models/MobileNetV3_large_x0_5_pretrained.tar ./pretrain_models/

# 注:正确解压backbone预训练权重文件后,文件夹下包含众多以网络层命名的权重文件,格式如下:
./pretrain_models/MobileNetV3_large_x0_5_pretrained/
  └─ conv_last_bn_mean
  └─ conv_last_bn_offset
  └─ conv_last_bn_scale
  └─ conv_last_bn_variance
  └─ ......

3. 开始训练

如果您安装的是cpu版本,请将配置文件中的 use_gpu 字段修改为false

# 单机单卡训练 mv3_db 模型
python tools/train.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./pretrain_models/MobileNetV3_large_x0_5_pretrained/
# 单机多卡训练,通过 --gpus 参数设置使用的GPU ID;如果使用的paddle版本小于2.0rc1,请使用'--select_gpus'参数选择要使用的GPU
python -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./pretrain_models/MobileNetV3_large_x0_5_pretrained/

上述指令中,通过-c 选择训练使用configs/det/det_db_mv3.yml配置文件。
有关配置文件的详细解释,请参考链接。

您也可以通过-o参数在不需要修改yml文件的情况下,改变训练的参数,比如,调整训练的学习率为0.0001

python tools/train.py -c configs/det/det_mv3_db.yml -o Optimizer.base_lr=0.0001

断点训练

如果训练程序中断,如果希望加载训练中断的模型从而恢复训练,可以通过指定Global.checkpoints指定要加载的模型路径:

python tools/train.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./your/trained/model

注意Global.checkpoints的优先级高于Global.pretrain_weights的优先级,即同时指定两个参数时,优先加载Global.checkpoints指定的模型,如果Global.checkpoints指定的模型路径有误,会加载Global.pretrain_weights指定的模型。

4.模型评估

PaddleOCR计算三个OCR检测相关的指标,分别是:PrecisionRecallHmean

运行如下代码,根据配置文件det_db_mv3.ymlsave_res_path指定的测试集检测结果文件,计算评估指标。

评估时设置后处理参数box_thresh=0.5unclip_ratio=1.5,使用不同数据集、不同模型训练,可调整这两个参数进行优化
训练中模型参数默认保存在Global.save_model_dir目录下。在评估指标时,需要设置Global.checkpoints指向保存的参数文件。

python3 tools/eval.py -c configs/det/det_mv3_db.yml  -o Global.checkpoints="{path/to/weights}/best_accuracy" PostProcess.box_thresh=0.5 PostProcess.unclip_ratio=1.5

注:box_threshunclip_ratioDB后处理所需要的参数,在评估EAST模型时不需要设置

5.模型测试

测试单张图像的检测效果

python tools/infer_det.py -c configs/det/det_mv3_db.yml -o Global.infer_img="./doc/imgs_en/img_10.jpg" Global.pretrained_model="./output/det_db/best_accuracy" Global.load_static_weights=false

测试DB模型时,调整后处理阈值,

python tools/infer_det.py -c configs/det/det_mv3_db.yml -o Global.infer_img="./doc/imgs_en/img_10.jpg" Global.pretrained_model="./output/det_db/best_accuracy" Global.load_static_weights=false PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5

测试文件夹下所有图像的检测效果

python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o Global.infer_img="./doc/imgs_en/" Global.pretrained_model="./output/det_db/best_accuracy" Global.load_static_weights=false

6.训练模型转inference模型

截止到目前,我们得到了文本检测的训练模型,并对其进行了测试,但这并不是最终的推理模型,需要进行转换,以MobileNetV3backbone训练的DB算法为例,将训练好的模型转换成inference模型只需要运行如下命令:

# -c 后面设置训练算法的yml配置文件
# -o 配置可选参数
# Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。
# Global.load_static_weights 参数需要设置为 False。
# Global.save_inference_dir参数设置转换的模型将保存的地址。

python3 tools/export_model.py -c configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0.yml -o Global.pretrained_model=./ch_lite/ch_ppocr_mobile_v2.0_det_train/best_accuracy Global.load_static_weights=False Global.save_inference_dir=./inference/det_db/

步骤二:文本识别模型(recognition)

1.准备训练数据集

PaddleOCR 支持两种数据格式:

  • lmdb 用于训练公开数据,调试算法;
  • 通用数据 训练自己的数据:

数据下载

训练数据的默认存储路径是 PaddleOCR/train_data,如果您的磁盘上已有数据集,Windows系统需要将数据集拷贝至对应位置,Linux只需创建软链接至数据集目录:

ln -sf <path/to/dataset> <path/to/paddle_ocr>/train_data/dataset

若您本地没有数据集,可以在官网下载 icdar2015 数据,用于快速验证。也可以参考DTRB,下载 benchmark 所需的lmdb格式数据集。

数据集划分

若您希望使用自己的数据进行训练,请参考下文组织您的数据。

  • 训练集

首先请将训练图片放入同一个文件夹(train_images),并用一个txt文件(rec_gt_train.txt)记录图片路径和标签。

注意: 默认请将图片路径和图片标签用\t 分割,如用其他方式分割将造成训练报错

" 图像文件名                 图像标注信息 "
train_data/train_0001.jpg   简单可依赖
train_data/train_0002.jpg   用科技让复杂的世界更简单

PaddleOCR 提供了一份用于训练 icdar2015 数据集的标签文件,通过以下方式下载:

# 训练集标签
wget -P ./train_data/ic15_data  https://paddleocr.bj.bcebos.com/dataset/rec_gt_train.txt
# 测试集标签
wget -P ./train_data/ic15_data  https://paddleocr.bj.bcebos.com/dataset/rec_gt_test.txt

PaddleOCR 也提供了数据格式转换脚本,可以将官网 label 转换支持的数据格式。 数据转换工具在 ppocr/utils/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"

注意,为了和文本检测使用同一个数据集(文本检测使用官方标注工具PPLabel标注而得),在本步骤使用官方提供的转换文件,发现无法实现该目的。解决办法

最终训练集应有如下文件结构:

|-train_data
    |-ic15_data
        |- rec_gt_train.txt
        |- train
            |- word_001.png
            |- word_002.jpg
            |- word_003.jpg
            | ...
  • 测试集

同训练集类似,测试集也需要提供一个包含所有图片的文件夹(test)和一个rec_gt_test.txt,测试集的结构如下所示:

|-train_data
    |-ic15_data
        |- rec_gt_test.txt
        |- test
            |- word_001.jpg
            |- word_002.jpg
            |- word_003.jpg
            | ...
  • 字典

最后需要提供一个字典({word_dict_name}.txt),使模型在训练时,可以将所有出现的字符映射为字典的索引。

因此字典需要包含所有希望被正确识别的字符,{word_dict_name}.txt需要写成如下格式,并以 utf-8 编码格式保存:

l
d
a
d
r
n

word_dict.txt 每行有一个单字,将字符与数字索引映射在一起,“and” 将被映射成 [2 5 1]

ppocr/utils/ppocr_keys_v1.txt 是一个包含6623个字符的中文字典

ppocr/utils/ic15_dict.txt 是一个包含36个字符的英文字典

ppocr/utils/dict/french_dict.txt 是一个包含118个字符的法文字典

ppocr/utils/dict/japan_dict.txt 是一个包含4399个字符的日文字典

ppocr/utils/dict/korean_dict.txt 是一个包含3636个字符的韩文字典

ppocr/utils/dict/german_dict.txt 是一个包含131个字符的德文字典

ppocr/utils/dict/en_dict.txt 是一个包含63个字符的英文字典

您可以按需使用。

目前的多语言模型仍处在demo阶段,会持续优化模型并补充语种,非常欢迎您为我们提供其他语言的字典和字体,如您愿意可将字典文件提交至 dict 将语料文件提交至corpus,我们会在Repo中感谢您。

  • 自定义字典

如需自定义dic文件,请在 configs/rec/rec_icdar15_train.yml 中添加 character_dict_path 字段, 指向您的字典路径。
并将 character_type 设置为 ch

  • 添加空格类别

如果希望支持识别"空格"类别, 请将yml文件中的 use_space_char 字段设置为 True

2.下载预训练模型

模型介绍

PaddleOCR基于动态图开源的文本识别算法列表:

  • CRNN(paper)[7](ppocr推荐)
  • Rosetta(paper)[10]
  • STAR-Net(paper)[11]
  • RARE(paper)[12] coming soon
  • SRN(paper)[5] coming soon

参考[DTRB]3文字识别训练和评估流程,使用MJSynthSynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法效果如下:

模型 骨干网络 Avg Accuracy 模型存储命名 下载链接
Rosetta Resnet34_vd 80.9% rec_r34_vd_none_none_ctc 下载链接
Rosetta MobileNetV3 78.05% rec_mv3_none_none_ctc 下载链接
CRNN Resnet34_vd 82.76% rec_r34_vd_none_bilstm_ctc 下载链接
CRNN MobileNetV3 79.97% rec_mv3_none_bilstm_ctc 下载链接
StarNet Resnet34_vd 84.44% rec_r34_vd_tps_bilstm_ctc 下载链接
StarNet MobileNetV3 81.42% rec_mv3_tps_bilstm_ctc 下载链接

下载预训练模型

PaddleOCR提供了训练脚本、评估脚本和预测脚本,本节将以 CRNN 识别模型为例:

首先下载预训练模型,您可以下载训练好的模型在 icdar2015 数据上进行finetune

cd PaddleOCR/
# 下载MobileNetV3的预训练模型
wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_mv3_none_bilstm_ctc_v2.0_train.tar
# 解压模型参数
cd pretrain_models
tar -xf rec_mv3_none_bilstm_ctc_v2.0_train.tar && rm -rf rec_mv3_none_bilstm_ctc_v2.0_train.tar

3.开始训练

如果您安装的是cpu版本,请将配置文件中的 use_gpu 字段修改为false

# GPU训练 支持单卡,多卡训练,通过--gpus参数指定卡号
# 训练icdar15英文数据 训练日志会自动保存为 "{save_model_dir}" 下的train.log
python3 -m paddle.distributed.launch --gpus '0,1,2,3'  tools/train.py -c configs/rec/rec_icdar15_train.yml
  • 数据增强

PaddleOCR提供了多种数据增强方式,如果您希望在训练时加入扰动,请在配置文件中设置 distort: true

默认的扰动方式有:颜色空间转换(cvtColor)、模糊(blur)、抖动(jitter)、噪声(Gasuss noise)、随机切割(random crop)、透视(perspective)、颜色反转(reverse)。

训练过程中每种扰动方式以50%的概率被选择,具体代码实现请参考:img_tools.py

由于OpenCV的兼容性问题,扰动操作暂时只支持Linux

  • 训练

PaddleOCR支持训练和评估交替进行, 可以在 configs/rec/rec_icdar15_train.yml 中修改 eval_batch_step 设置评估频率,默认每500个iter评估一次。评估过程中默认将最佳acc模型,保存为 output/rec_CRNN/best_accuracy

如果验证集很大,测试将会比较耗时,建议减少评估次数,或训练完再进行评估。

提示: 可通过 -c 参数选择 configs/rec/ 路径下的多种模型配置进行训练,PaddleOCR支持的识别算法有:

配置文件 算法名称 backbone trans seq pred
rec_chinese_lite_train_v2.0.yml CRNN Mobilenet_v3 small 0.5 None BiLSTM ctc
rec_chinese_common_train_v2.0.yml CRNN ResNet34_vd None BiLSTM ctc
rec_icdar15_train.yml CRNN Mobilenet_v3 large 0.5 None BiLSTM ctc
rec_mv3_none_bilstm_ctc.yml CRNN Mobilenet_v3 large 0.5 None BiLSTM ctc
rec_mv3_none_none_ctc.yml Rosetta Mobilenet_v3 large 0.5 None None ctc
rec_r34_vd_none_bilstm_ctc.yml CRNN Resnet34_vd None BiLSTM ctc
rec_r34_vd_none_none_ctc.yml Rosetta Resnet34_vd None None ctc

训练中文数据,推荐使用rec_chinese_lite_train_v2.0.yml,如您希望尝试其他算法在中文数据集上的效果,请参考下列说明修改配置文件:

rec_chinese_lite_train_v2.0.yml 为例:

Global:
  ...
  # 添加自定义字典,如修改字典请将路径指向新字典
  character_dict_path: ppocr/utils/ppocr_keys_v1.txt
  # 修改字符类型
  character_type: ch
  ...
  # 识别空格
  use_space_char: True


Optimizer:
  ...
  # 添加学习率衰减策略
  lr:
    name: Cosine
    learning_rate: 0.001
  ...

...

Train:
  dataset:
    # 数据集格式,支持LMDBDateSet以及SimpleDataSet
    name: SimpleDataSet
    # 数据集路径
    data_dir: ./train_data/
    # 训练集标签文件
    label_file_list: ["./train_data/train_list.txt"]
    transforms:
      ...
      - RecResizeImg:
          # 修改 image_shape 以适应长文本
          image_shape: [3, 32, 320]
      ...
  loader:
    ...
    # 单卡训练的batch_size
    batch_size_per_card: 256
    ...

Eval:
  dataset:
    # 数据集格式,支持LMDBDateSet以及SimpleDataSet
    name: SimpleDataSet
    # 数据集路径
    data_dir: ./train_data
    # 验证集标签文件
    label_file_list: ["./train_data/val_list.txt"]
    transforms:
      ...
      - RecResizeImg:
          # 修改 image_shape 以适应长文本
          image_shape: [3, 32, 320]
      ...
  loader:
    # 单卡验证的batch_size
    batch_size_per_card: 256
    ...

注意,预测/评估时的配置文件请务必与训练一致。

4.评估

评估数据集可以通过 configs/rec/rec_icdar15_train.yml 修改Eval中的 label_file_path 设置。

# GPU 评估, Global.checkpoints 为待测权重
python -m paddle.distributed.launch --gpus '0' tools/eval.py -c configs/rec/rec_icdar15_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy

5.测试

使用 PaddleOCR 训练好的模型,可以通过以下脚本进行快速预测。

默认预测图片存储在 infer_img 里,通过 -o Global.checkpoints 指定权重:

# 预测英文结果
python3 tools/infer_rec.py -c configs/rec/rec_icdar15_train.yml -o Global.pretrained_model={path/to/weights}/best_accuracy Global.load_static_weights=false Global.infer_img=doc/imgs_words/en/word_1.png

预测使用的配置文件必须与训练一致,如您通过 python3 tools/train.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml 完成了中文模型的训练,您可以使用如下命令进行中文模型预测。

# 预测中文结果
python3 tools/infer_rec.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml -o Global.pretrained_model={path/to/weights}/best_accuracy Global.load_static_weights=false Global.infer_img=doc/imgs_words/ch/word_1.jpg

6.训练模型转inference模型

识别模型inference模型与检测的方式相同,如下:

# -c 后面设置训练算法的yml配置文件
# -o 配置可选参数
# Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。
# Global.load_static_weights 参数需要设置为 False。
# Global.save_inference_dir参数设置转换的模型将保存的地址。

python3 tools/export_model.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml -o Global.pretrained_model=./ch_lite/ch_ppocr_mobile_v2.0_rec_train/best_accuracy Global.load_static_weights=False Global.save_inference_dir=./inference/rec_crnn/

注意:如果您是在自己的数据集上训练的模型,并且调整了中文字符的字典文件,请注意修改配置文件中的character_dict_path是否是所需要的字典文件。

转换成功后,在目录下有三个文件:

/inference/rec_crnn/
    ├── inference.pdiparams         # 识别inference模型的参数文件
    ├── inference.pdiparams.info    # 识别inference模型的参数信息,可忽略
    └── inference.pdmodel           # 识别inference模型的program文件

步骤三:文本角度分类模型

1.准备训练数据集

请按如下步骤设置数据集:

训练数据的默认存储路径是 PaddleOCR/train_data/cls,如果您的磁盘上已有数据集,Windows系统需要将数据集拷贝至对应位置,Linux只需创建软链接至数据集目录:

ln -sf <path/to/dataset> <path/to/paddle_ocr>/train_data/cls/dataset

数据集划分

  • 训练集

首先请将训练图片放入同一个文件夹(train_images),并用一个txt文件(cls_gt_train.txt)记录图片路径和标签。

注意: 默认请将图片路径和图片标签用 \t 分割,如用其他方式分割将造成训练报错

0180分别表示图片的角度为0度和180

" 图像文件名                 图像标注信息 "
train/word_001.jpg   0
train/word_002.jpg   180

最终训练集应有如下文件结构:

|-train_data
    |-cls
        |- cls_gt_train.txt
        |- train
            |- word_001.png
            |- word_002.jpg
            |- word_003.jpg
            | ...
  • 测试集

同训练集类似,测试集也需要提供一个包含所有图片的文件夹(train)和一个cls_gt_test.txt,测试集的结构如下所示:

|-train_data
    |-cls
        |- cls_gt_test.txt
        |- test
            |- word_001.jpg
            |- word_002.jpg
            |- word_003.jpg
            | ...

2.开始训练

将准备好的txt文件和图片文件夹路径分别写入配置文件的 Train/Eval.dataset.label_file_listTrain/Eval.dataset.data_dir 字段下,Train/Eval.dataset.data_dir字段下的路径和文件里记载的图片名构成了图片的绝对路径。

如果您安装的是cpu版本,请将配置文件中的 use_gpu 字段修改为false

# GPU训练 支持单卡,多卡训练,通过 '--gpus' 指定卡号,如果使用的paddle版本小于2.0rc1,请使用'--select_gpus'参数选择要使用的GPU
# 启动训练,下面的命令已经写入train.sh文件中,只需修改文件里的配置文件路径即可
python3 -m paddle.distributed.launch --gpus '0,1,2,3,4,5,6,7'  tools/train.py -c configs/cls/cls_mv3.yml

数据增强

PaddleOCR提供了多种数据增强方式,如果您希望在训练时加入扰动,请在配置文件中取消Train.dataset.transforms下的RecAugRandAugment字段的注释。

默认的扰动方式有:颜色空间转换(cvtColor)、模糊(blur)、抖动(jitter)、噪声(Gasuss noise)、随机切割(random crop)、透视(perspective)、颜色反转(reverse),随机数据增强(RandAugment)。

训练过程中除随机数据增强外每种扰动方式以50%的概率被选择,具体代码实现请参考:
rec_img_aug.py
randaugment.py

由于OpenCV的兼容性问题,扰动操作暂时只支持linux

训练

PaddleOCR支持训练和评估交替进行, 可以在 configs/cls/cls_mv3.yml 中修改 eval_batch_step 设置评估频率,默认每1000个iter评估一次。训练过程中将会保存如下内容:

├── best_accuracy.pdopt # 最佳模型的优化器参数
├── best_accuracy.pdparams # 最佳模型的参数
├── best_accuracy.states # 最佳模型的指标和epoch等信息
├── config.yml # 本次实验的配置文件
├── latest.pdopt # 最新模型的优化器参数
├── latest.pdparams # 最新模型的参数
├── latest.states # 最新模型的指标和epoch等信息
└── train.log # 训练日志

如果验证集很大,测试将会比较耗时,建议减少评估次数,或训练完再进行评估。

注意,预测/评估时的配置文件请务必与训练一致。

3.评估

评估数据集可以通过修改configs/cls/cls_mv3.yml文件里的Eval.dataset.label_file_list 字段设置。

export CUDA_VISIBLE_DEVICES=0
# GPU 评估, Global.checkpoints 为待测权重
python3 tools/eval.py -c configs/cls/cls_mv3.yml -o Global.checkpoints={path/to/weights}/best_accuracy

4.预测

使用 PaddleOCR 训练好的模型,可以通过以下脚本进行快速预测。

通过 Global.infer_img 指定预测图片或文件夹路径,通过 Global.checkpoints 指定权重:

# 预测分类结果
python3 tools/infer_cls.py -c configs/cls/cls_mv3.yml -o Global.pretrained_model={path/to/weights}/best_accuracy Global.load_static_weights=false Global.infer_img=doc/imgs_words/ch/word_1.jpg

5.训练模型转inference模型

方向分类模型转inference模型与检测的方式相同,如下:

# -c 后面设置训练算法的yml配置文件
# -o 配置可选参数
# Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。
# Global.load_static_weights 参数需要设置为 False。
# Global.save_inference_dir参数设置转换的模型将保存的地址。

python3 tools/export_model.py -c configs/cls/cls_mv3.yml -o Global.pretrained_model=./ch_lite/ch_ppocr_mobile_v2.0_cls_train/best_accuracy Global.load_static_weights=False Global.save_inference_dir=./inference/cls/

转换成功后,在目录下有三个文件:

/inference/cls/
    ├── inference.pdiparams         # 分类inference模型的参数文件
    ├── inference.pdiparams.info    # 分类inference模型的参数信息,可忽略
    └── inference.pdmodel           # 分类inference模型的program文件

步骤四:三模型联合推理

以下代码实现了文本检测方向分类器文本识别串联推理,在执行预测时,需要通过参数image_dir指定单张图像或者图像集合的路径、参数det_model_dir指定检测inference模型的路径、参数rec_model_dir指定识别inference模型的路径、参数use_angle_cls指定是否使用方向分类器、参数cls_model_dir指定方向分类器inference模型的路径、参数use_space_char指定是否预测空格字符。可视化识别结果默认保存到./inference_results文件夹里面。


# 预测image_dir指定的单张图像
python tools/infer/predict_system.py --image_dir="./inference_img/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer"  --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer" --use_angle_cls=True --use_space_char=True

# 预测image_dir指定的图像集合
python tools/infer/predict_system.py --image_dir="./doc/imgs/" --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer/"  --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls=True --use_space_char=True

# 如果想使用CPU进行预测,需设置use_gpu参数为False
python tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer/"  --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls=True --use_space_char=True --use_gpu=False

五、放在最后:推理模型列表(V2.0,2021年1月20日更新)

说明 :2.0版模型和1.1版模型的主要区别在于动态图训练vs.静态图训练,模型性能上无明显差距。

PaddleOCR提供的可下载模型包括推理模型训练模型预训练模型slim模型,模型区别说明如下:

模型类型 模型格式 简介
推理模型 inference.pdmodel、inference.pdiparams 用于python预测引擎推理,详情
训练模型、预训练模型 *.pdparams、*.pdopt、*.states 训练过程中保存的模型的参数、优化器状态和训练中间信息,多用于模型指标评估和恢复训练
slim模型 *.nb 用于lite部署

一、文本检测模型

模型名称 模型简介 配置文件 推理模型大小 下载地址
ch_ppocr_mobile_slim_v2.0_det slim裁剪版超轻量模型,支持中英文、多语种文本检测 ch_det_mv3_db_v2.0.yml 推理模型 (coming soon) / 训练模型 (coming soon)
ch_ppocr_mobile_v2.0_det 原始超轻量模型,支持中英文、多语种文本检测 ch_det_mv3_db_v2.0.yml 3M 推理模型 / 训练模型
ch_ppocr_server_v2.0_det 通用模型,支持中英文、多语种文本检测,比超轻量模型更大,但效果更好 ch_det_res18_db_v2.0.yml 47M 推理模型 / 训练模型

二、文本识别模型

1. 中文识别模型

模型名称 模型简介 配置文件 推理模型大小 下载地址
ch_ppocr_mobile_slim_v2.0_rec slim裁剪量化版超轻量模型,支持中英文、数字识别 rec_chinese_lite_train_v2.0.yml 推理模型 / 训练模型
ch_ppocr_mobile_v2.0_rec 原始超轻量模型,支持中英文、数字识别 rec_chinese_lite_train_v2.0.yml 3.71M 推理模型 / 训练模型 / 预训练模型
ch_ppocr_server_v2.0_rec 通用模型,支持中英文、数字识别 rec_chinese_common_train_v2.0.yml 94.8M 推理模型 / 训练模型 / 预训练模型

说明: 训练模型是基于预训练模型在真实数据与竖排合成文本数据上finetune得到的模型,在真实应用场景中有着更好的表现,预训练模型则是直接基于全量真实数据与合成数据训练得到,更适合用于在自己的数据集上finetune。

2. 英文识别模型

模型名称 模型简介 配置文件 推理模型大小 下载地址
en_number_mobile_slim_v2.0_rec slim裁剪量化版超轻量模型,支持英文、数字识别 rec_en_number_lite_train.yml 推理模型 / 训练模型
en_number_mobile_v2.0_rec 原始超轻量模型,支持英文、数字识别 rec_en_number_lite_train.yml 2.56M 推理模型 / 训练模型

3. 多语言识别模型(更多语言持续更新中…)

说明: 新增的多语言模型的配置文件通过代码方式生成,您可以通过--help参数查看当前PaddleOCR支持生成哪些多语言的配置文件:

# 该代码需要在指定目录运行
cd {your/path/}PaddleOCR/configs/rec/multi_language/
python3 generate_multi_language_configs.py --help

下面以生成意大利语配置文件为例:

1. 生成意大利语配置文件测试现有模型

如果您仅仅想用配置文件测试PaddleOCR提供的多语言模型可以通过下面命令生成默认的配置文件,使用PaddleOCR提供的小语种字典进行预测。

# 该代码需要在指定目录运行
cd {your/path/}PaddleOCR/configs/rec/multi_language/
# 通过-l或者--language参数设置需要生成的语种的配置文件,该命令会将默认参数写入配置文件
python3 generate_multi_language_configs.py -l it

2. 生成意大利语配置文件训练自己的数据

如果您想训练自己的小语种模型,可以准备好训练集文件、验证集文件、字典文件和训练数据路径,这里假设准备的意大利语的训练集、验证集、字典和训练数据路径为:

  • 训练集:{your/path/}PaddleOCR/train_data/train_list.txt
  • 验证集:{your/path/}PaddleOCR/train_data/val_list.txt
  • 使用PaddleOCR提供的默认字典:{your/path/}PaddleOCR/ppocr/utils/dict/it_dict.txt
  • 训练数据路径:{your/path/}PaddleOCR/train_data

使用以下命令生成配置文件:

# 该代码需要在指定目录运行
cd {your/path/}PaddleOCR/configs/rec/multi_language/
# -l或者--language字段是必须的
# --train修改训练集,--val修改验证集,--data_dir修改数据集目录,-o修改对应默认参数
# --dict命令改变字典路径,示例使用默认字典路径则该参数可不填
python3 generate_multi_language_configs.py -l it \
--train train_data/train_list.txt \
--val train_data/val_list.txt \
--data_dir train_data \
-o Global.use_gpu=False
模型名称 模型简介 配置文件 推理模型大小 下载地址
french_mobile_v2.0_rec 法文识别 rec_french_lite_train.yml 2.65M 推理模型 / 训练模型
german_mobile_v2.0_rec 德文识别 rec_german_lite_train.yml 2.65M 推理模型 / 训练模型
korean_mobile_v2.0_rec 韩文识别 rec_korean_lite_train.yml 3.9M 推理模型 / 训练模型
japan_mobile_v2.0_rec 日文识别 rec_japan_lite_train.yml 4.23M 推理模型 / 训练模型
it_mobile_v2.0_rec 意大利文识别 rec_it_lite_train.yml 2.53M 推理模型 / 训练模型
xi_mobile_v2.0_rec 西班牙文识别 rec_xi_lite_train.yml 2.53M 推理模型 / 训练模型
pu_mobile_v2.0_rec 葡萄牙文识别 rec_pu_lite_train.yml 2.63M 推理模型 / 训练模型
ru_mobile_v2.0_rec 俄罗斯文识别 rec_ru_lite_train.yml 2.63M 推理模型 / 训练模型
ar_mobile_v2.0_rec 阿拉伯文识别 rec_ar_lite_train.yml 2.53M 推理模型 / 训练模型
hi_mobile_v2.0_rec 印地文识别 rec_hi_lite_train.yml 2.63M 推理模型 / 训练模型
chinese_cht_mobile_v2.0_rec 中文繁体识别 rec_chinese_cht_lite_train.yml 5.63M 推理模型 / 训练模型
ug_mobile_v2.0_rec 维吾尔文识别 rec_ug_lite_train.yml 2.63M 推理模型 / 训练模型
fa_mobile_v2.0_rec 波斯文识别 rec_fa_lite_train.yml 2.63M 推理模型 / 训练模型
ur_mobile_v2.0_rec 乌尔都文识别 rec_ur_lite_train.yml 2.63M 推理模型 / 训练模型
rs_mobile_v2.0_rec 塞尔维亚文(latin)识别 rec_rs_lite_train.yml 2.53M 推理模型 / 训练模型
oc_mobile_v2.0_rec 欧西坦文识别 rec_oc_lite_train.yml 2.53M 推理模型 / 训练模型
mr_mobile_v2.0_rec 马拉地文识别 rec_mr_lite_train.yml 2.63M 推理模型 / 训练模型
ne_mobile_v2.0_rec 尼泊尔文识别 rec_ne_lite_train.yml 2.63M 推理模型 / 训练模型
rsc_mobile_v2.0_rec 塞尔维亚文(cyrillic)识别 rec_rsc_lite_train.yml 2.63M 推理模型 / 训练模型
bg_mobile_v2.0_rec 保加利亚文识别 rec_bg_lite_train.yml 2.63M 推理模型 / 训练模型
uk_mobile_v2.0_rec 乌克兰文识别 rec_uk_lite_train.yml 2.63M 推理模型 / 训练模型
be_mobile_v2.0_rec 白俄罗斯文识别 rec_be_lite_train.yml 2.63M 推理模型 / 训练模型
te_mobile_v2.0_rec 泰卢固文识别 rec_te_lite_train.yml 2.63M 推理模型 / 训练模型
ka_mobile_v2.0_rec 卡纳达文识别 rec_ka_lite_train.yml 2.63M 推理模型 / 训练模型
ta_mobile_v2.0_rec 泰米尔文识别 rec_ta_lite_train.yml 2.63M 推理模型 / 训练模型

三、文本方向分类模型

模型名称 模型简介 配置文件 推理模型大小 下载地址
ch_ppocr_mobile_slim_v2.0_cls slim量化版模型 cls_mv3.yml 推理模型 / 训练模型
ch_ppocr_mobile_v2.0_cls 原始模型 cls_mv3.yml 1.38M 推理模型 / 训练模型

参考

  1. 官方文档

你可能感兴趣的:(计算机视觉,自然语言处理,深度学习,PaddleOCR)