PaddleOCR 使用以及用自己的数据训练

在OCR方面找了很多资料,本来想要找pytorch框架下的算法,无奈很多OCR算法太老,没人更新。感觉这块有点冷门似的,不像其它热门算法一出来就有各个框架版本的复现。

看了paddleOCR真的是相当全面深刻了,还是我们自家的框架接地气。而且百度经常搞直播分享学习什么的,各种训练营还有学习群....

首先github下载:https://github.com/PaddlePaddle/PaddleOCR 并解压

一。试用官方模型

打开这个网址的中文版,下载预训练模型:

https://github.com/PaddlePaddle/PaddleOCR/blob/develop/README_ch.md

先用轻量OCR模型,分别下载检测和识别以及方向分类器。这里关于预训练模型/训练模型/推理模型,官方有说明:

注:更多模型在模型列表中:https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/models_list.md

这里我 下载的是infer 推理模型ch_ppocr_mobile_v1.1_xx, 下载完解压到PaddleOCR/inference 下,可以新建inference文件夹:

每个文件夹下有两个文件:model 和params

官方快速开始的教程:https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/quickstart_en.md

可以使用如下命令等:

1
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v1.1_det_infer/"  --rec_model_dir="./inference/ch_ppocr_mobile_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True

但我习惯在代码里跑:

参数模块在这 tools/infer/utility.py 需要更改的参数:

图片路径 --image_dir = ./doc/imgs/3.jpg

1
检测模型路径--det_model_dir = ./inference/ch_ppocr_mobile_v1.1_det_infer

1
识别模型--rec_model_dir = ./inference/ch_ppocr_mobile_v1.1_rec_infer
1
字典--rec_char_dict_path = ./ppocr/utils/ppocr_keys_v1.txt  这个参数很重要,这个字典文字取决与你的模型是识别中文还是英文数字什么的,这个是中文字典,还有一个ic15_dict.txt 是英文和数字
1
分类模型--cls_model_dir = ./inference/ch_ppocr_mobile_v1.1_cls_infer
1
draw_ocr_box_txt 函数中 有个字体的路径  font_path= doc/simfang.ttf
1
text_visual 函数中的字体路径也是 font_path= doc/simfang.ttf

ok。 测试图片在doc/imgs下,测试结果输出在 doc/imgs_results 以及 ./inference_results 文件夹下:

二。训练自己的数据

我暂时只训练识别的crnn。

官方教程:https://www.bookstack.cn/read/PaddleOCR/recognition.md

我用的通用数据,不是lmdb 格式。数据准备 ICDAR2015数据集

下载地址:https://blog.csdn.net/weixin_45779880/article/details/105642393

选择4.3 word recognition

下载下来后有train 和test 两份数据集以及各自的标签文件。

这里使用的是官方的标签文件:

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

预训练模型:

  1. cd PaddleOCR/
  2. # 下载MobileNetV3的预训练模型
  3. wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/rec_mv3_none_bilstm_ctc.tar
  4. # 解压模型参数
  5. cd pretrain_models
  6. tar -xf rec_mv3_none_bilstm_ctc.tar && rm -rf rec_mv3_none_bilstm_ctc.tar

训练配置:

训练文件tools/train.py

参数文件tools/program.py

1
--config = ./configs/rec/rec_icdar15_train.yml
1
rec_icdar15_train.yml 中两个参数比较关键:
1
reader_yml 数据读取方式。数据集与标签路径
1
pretrain_weights预训练模型路径

还有image_shape: [3, 32, 100] 这个虽然是可以根据自己数据大小该,但h 必须是32的整数倍。crnn 中cnn会将图像缩放到 32×W×1 大小。

1
保存文件的路径 save_model_dir: ./output/rec_CRNN

其他参数 最大文本长度,文本类型(中英文),数据增强什么的都可以适当调整

我用的时候经常相对路径不能用,所以很多地方要改为绝对路径,到处找参数。

然后就可以:python train.py 运行程序:

而且我要在cmd中运行才行,pycharm一运行系统就崩了。。。我崩了好几次不知道是什么原因,改了bs还是一样。

模型训练好后如下:

然后进行训练模型的测试:注意测试图片用/doc/imgs_words_en 英文的文字图片,不是没经过裁剪的图片。

图片路径在:rec_icdar15_train.yml 中 infer_img 。 checkpoints 路径也可以在这里写。

1
python tools/infer_rec.py  -o Global.checkpoints=/home/yao/Documents/PaddleOCR/pretrain_models/rec_mv3_none_bilstm_ctc/best_accuracy

这个测试我的效果很差,还没找原因,先记录:

接下来inference 测试。

inference 之前 要把训练的模型转换为推断模型:

1
python3 tools/export_model.py -c configs/rec/rec_icdar15_train.yml -o Global.checkpoints="/home/yao/Documents/PaddleOCR/output/my_model/best_accuracy" Global.save_inference_dir="./output/expor_model/"

得到:

然后就是按一的步骤试用官方模型那样,只要把识别文件夹中的模型换为自己训练的模型即可。