本帖最后由 云天徽上 于 2024-8-20 11:27 编辑
1. 文本识别模型微调
1.1 数据选择
数据量:不更换字典的情况下,建议至少准备5000张的文本识别数据集用于模型微调;如果更换了字典(不建议),需要的数量更多。
数据分布:建议分布与实测场景尽量一致。如果实测场景包含大量短文本,则训练数据中建议也包含较多短文本,如果实测场景对于空格识别效果要求较高,则训练数据中建议也包含较多带空格的文本内容。
数据合成:针对部分字符识别有误的情况,建议获取一批特定字符数据,加入到原数据中使用小学习率微调。其中原始数据与新增数据比例可尝试 10:1 ~ 5:1, 避免单一场景数据过多导致模型过拟合,同时尽量平衡语料词频,确保常用字的出现频率不会过低。
特定字符生成可以使用 TextRenderer 工具,合成例子可参考 数码管数据合成 ,合成数据语料尽量来自真实使用场景,在贴近真实场景的基础上保持字体、背景的丰富性,有助于提升模型效果。
通用中英文数据:在训练的时候,可以在训练集中添加通用真实数据(如在不更换字典的微调场景中,建议添加LSVT、RCTW、MTWI等真实数据),进一步提升模型的泛化性能。
1.2 模型选择
建议选择PP-OCRv4模型(配置文件:en_PP-OCRv4_rec.yml,预训练模型:ch_PP-OCRv4_rec_train.tar)进行微调,其精度与泛化性能是目前提供的最优预训练模型。
PP-OCRv4 模型使用了GTC策略,其中SAR分支参数量大,当训练数据为简单场景时模型容易过拟合,导致微调效果不佳,建议去除GTC策略,模型结构部分配置文件修改如下:
1.3 训练超参选择
与文本检测任务微调相同,在识别模型微调的时候,最重要的超参就是预训练模型路径pretrained_model, 学习率learning_rate与batch_size,部分默认配置文件如下所示。
上述配置文件中,首先需要将pretrained_model字段指定为3.2章节中解压得到的ch_PP-OCRv3_rec_train/best_accuracy.pdparams文件路径。
PaddleOCR提供的配置文件是在8卡训练(相当于总的batch size是8*128=1024)、且没有加载预训练模型情况下的配置文件,因此您的场景中,学习率与总的batch size需要对应线性调整,例如:
如果您的场景中是单卡训练,单卡batch_size=128,则总的batch_size=128,在加载预训练模型的情况下,建议将学习率调整为[1e-4, 2e-5]左右(piecewise学习率策略,需设置2个值,下同)。
如果您的场景中是单卡训练,因为显存限制,只能设置单卡batch_size=64,则总的batch_size=64,在加载预训练模型的情况下,建议将学习率调整为[5e-5, 1e-5]左右。
如果有通用真实场景数据加进来,建议每个epoch中,垂类场景数据与真实场景的数据量保持在1:1左右。
比如:您自己的垂类场景识别数据量为1W,数据标签文件为vertical.txt,收集到的通用场景识别数据量为10W,数据标签文件为general.txt,
那么,可以设置label_file_list和ratio_list参数如下所示。每个epoch中,vertical.txt中会进行全采样(采样比例为1.0),包含1W条数据;general.txt中会按照0.1的采样比例进行采样,包含10W*0.1=1W条数据,最终二者的比例为1:1。
1.4 训练调优
训练过程并非一蹴而就的,完成一个阶段的训练评估后,建议收集分析当前模型在真实场景中的 badcase,有针对性的调整训练数据比例,或者进一步新增合成数据。通过多次迭代训练,不断优化模型效果。
如果在训练时修改了自定义字典,由于无法加载最后一层FC的参数,在迭代初期acc=0是正常的情况,不必担心,加载预训练模型依然可以加快模型收敛。
2. 识别的训练代码:
python tools/train.py -c configs/rec/PP-OCRv4/en_PP-OCRv4_rec.yml \
-o Global.pretrained_model=./inference_model/en_PP-OCRv4_rec_infer/best_accuracy
3. 识别的评估代码
python tools/eval.py -c configs/rec/PP-OCRv4/en_PP-OCRv4_rec.yml -o Global.pretrained_model=./output/rec_ppocr_v4/latest
4.识别的推理代码
python tools/infer_rec.py -c configs/rec/PP-OCRv4/en_PP-OCRv4_rec.yml
-o Global.infer_img="./doc/imgs_en/img_10.jpg"
Global.pretrained_model="./output/rec_ppocr_v4/best_accuracy"
微调前的结果
微调后的结果
5.训练后的模型转静态模型
python tools/export_model.py -c configs/rec/PP-OCRv4/en_PP-OCRv4_rec.yml
-o Global.pretrained_model=./output/best_accuracy
Global.save_inference_dir=./inference/
6.静态模型转onnx支持C++的TensorRT部署
paddle2onnx --model_dir /mnt/d/Downloads/202406/paddelocr/pp/ch_PP-OCRv4_det_infer/ --model_filename inference.pdmodel --params_filename inference.pdiparams --opset_version 11 --save_file /mnt/d/Downloads/202406/paddelocr/onnx/ch_PP-OCRv4_rec_infer.onnx