PaddleOCR之模型介绍与测试

Posted ZONG_XP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PaddleOCR之模型介绍与测试相关的知识,希望对你有一定的参考价值。

0 背景

在上一篇文章中,对 PaddleOCR 的功能进行了尝鲜,感觉还不错,但调参的时候发现通过 pip 安装的包支持的模型算法有限,无法满足使用需求,因此需要下载源码进行安装测试,本文对该方法进行一个介绍

1 安装

下载源码

git clone https://github.com/PaddlePaddle/PaddleOCR.git

# 如果因为网络问题无法 pull 成功,也可选择使用码云上的托管
# 注意:码云托管代码可能无法实时同步 github 项目更新,存在 3~5 天延时,请优先使用第一种方式。
# git clone https://gitee.com/paddlepaddle/PaddleOCR

安装依赖 

cd PaddleOCR
pip install -r requirements.txt

2 模型介绍

OCR 文字识别一般包括两个部分,文本检测和文本识别;文本检测首先利用检测算法检测到图像中的文本行;然后检测到的文本行用识别算法去识别到具体文字。

2.1 检测模型

文本检测就是要定位图像中的文字区域,然后通常以边界框的形式将单词或文本行标记出来。传统的文字检测算法多是通过手工提取特征的方式,特点是速度快,简单场景效果好,但是面对自然场景,效果会大打折扣。当前多是采用深度学习方法来做。

基于深度学习的文本检测算法可以大致分为以下几类:

  1. 基于目标检测的方法;一般是预测得到文本框后,通过 NMS 筛选得到最终文本框,多是四点文本框,对弯曲文本场景效果不理想。典型算法为 EAST、Text Box 等方法。
  2. 基于分割的方法;将文本行当成分割目标,然后通过分割结果构建外接文本框,可以处理弯曲文本,对于文本交叉场景问题效果不理想。典型算法为 DB、PSENet 等方法。
  3. 混合目标检测和分割的方法;

2.2 识别模型

OCR 识别算法的输入数据一般是文本行,背景信息不多,文字占据主要部分,识别算法目前可以分为两类算法:

  1. 基于 CTC 的方法;即识别算法的文字预测模块是基于 CTC 的,常用的算法组合为  CNN+RNN+CTC。目前也有一些算法尝试在网络中加入 transformer 模块等等。
  2. 基于 Attention 的方法;即识别算法的文字预测模块是基于 Attention 的,常用算法组合是CNN+RNN+Attention。

2.3 PP-OCR模型

PaddleOCR 中集成了很多 OCR 算法,文本检测算法有 DB、EAST、SAST 等等,文本识别算法有 CRNN、RARE、StarNet、Rosetta、SRN 等算法。

其中 PaddleOCR 针对中英文自然场景通用 OCR,推出了 PP-OCR 系列模型,PP-OCR 模型由DB+CRNN 算法组成,利用海量中文数据训练加上模型调优方法,在中文场景上具备较高的文本检测识别能力。并且 PaddleOCR 推出了高精度超轻量 PP-OCRv2 模型,检测模型仅 3M,识别模型仅 8.5M,利用 PaddleSlim 的模型量化方法,可以在保持精度不降低的情况下,将检测模型压缩到 0.8M,识别压缩到 3M,更加适用于移动端部署场景。

模型下载列表 中给出了不同类型的模型,包括推理模型、训练模型、预训练模型与 slim 模型,推理模型(paddle.jit.save保存的模型) 一般是模型训练,把模型结构和模型参数保存在文件中的固化模型,多用于预测部署场景。 训练过程中保存的模型是 checkpoints 模型,保存的只有模型的参数,多用于恢复训练等。 与 checkpoints 模型相比,inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。模型区别如下

模型类型模型格式简介
推理模型inference.pdmodel、inference.pdiparams用于预测引擎推理,详情
训练模型、预训练模型*.pdparams、*.pdopt、*.states训练过程中保存的模型的参数、优化器状态和训练中间信息,多用于模型指标评估和恢复训练
slim模型*.nb经过飞桨模型压缩工具PaddleSlim压缩后的模型,适用于移动端/IoT端等端侧部署场景(需使用飞桨Paddle Lite部署)。

各个模型的关系如下所示

3 文本检测模型推理

首先下载一个推理模型

模型名称模型简介配置文件推理模型大小下载地址
ch_PP-OCRv2_det_slim【最新】slim量化+蒸馏版超轻量模型,支持中英文、多语种文本检测ch_PP-OCRv2_det_cml.yml3M推理模型
ch_PP-OCRv2_det【最新】原始超轻量模型,支持中英文、多语种文本检测ch_PP-OCRv2_det_cml.yml3M推理模型
ch_ppocr_mobile_slim_v2.0_detslim裁剪版超轻量模型,支持中英文、多语种文本检测ch_det_mv3_db_v2.0.yml2.6M推理模型
ch_ppocr_mobile_v2.0_det原始超轻量模型,支持中英文、多语种文本检测ch_det_mv3_db_v2.0.yml3M推理模型
ch_ppocr_server_v2.0_det通用模型,支持中英文、多语种文本检测,比超轻量模型更大,但效果更好ch_det_res18_db_v2.0.yml47M推理模型

这里以 ch_PP-OCRv2_det 模型为例,解压后运行下边的测试指令

tar xf ch_PP-OCRv2_det_infer.tar
python3 tools/infer/predict_det.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./ch_PP-OCRv2_det_infer/"

可视化文本检测结果默认保存到 ./inference_results 文件夹里面,结果文件的名称前缀为 'det_res'。

通过参数 limit_type 和 det_limit_side_len 来对图片的尺寸进行限制, limit_type 可选参数为 [max, min], det_limit_size_len 为正整数,一般设置为 32 的倍数,比如 960。

参数默认设置为 limit_type='max', det_limit_side_len=960。表示网络输入图像的最长边不能超过 960, 如果超过这个值,会对图像做等宽比的 resize 操作,确保最长边为det_limit_side_len。 设置为 limit_type='min', det_limit_side_len=960 则表示限制图像的最短边为 960。

如果输入图片的分辨率比较大,而且想使用更大的分辨率预测,可以设置 det_limit_side_len 为想要的值,比如 1216:

python3 tools/infer/predict_det.py --image_dir="./doc/imgs/1.jpg" --det_model_dir="./inference/ch_PP-OCRv2_det_infer/" --det_limit_type=max --det_limit_side_len=1216

如果想使用 CPU 进行预测,执行命令如下

python3 tools/infer/predict_det.py --image_dir="./doc/imgs/1.jpg" --det_model_dir="./inference/ch_PP-OCRv2_det_infer/"  --use_gpu=False

4 文本识别模型推理

超轻量中文识别模型推理,可以执行如下命令:

# 下载超轻量中文识别模型:
wget  https://paddleocr.bj.bcebos.com/PP-OCRv2/chinese/ch_PP-OCRv2_rec_infer.tar
tar xf ch_PP-OCRv2_rec_infer.tar
python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words/ch/word_4.jpg" --rec_model_dir="./ch_PP-OCRv2_rec_infer/"

执行命令后,图像的预测结果(识别的文本和得分)会打印到屏幕上,示例如下:

Predicts of ./doc/imgs_words/ch/word_4.jpg:('实力活力', 0.98458153)

5 方向分类模型推理

方向分类模型推理,可以执行如下命令:

# 下载超轻量中文方向分类器模型:
wget  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar
tar xf ch_ppocr_mobile_v2.0_cls_infer.tar
python3 tools/infer/predict_cls.py --image_dir="./doc/imgs_words/ch/word_4.jpg" --cls_model_dir="ch_ppocr_mobile_v2.0_cls_infer"

执行命令后,图像的预测结果(分类的方向和得分)会打印到屏幕上,示例如下:

Predicts of ./doc/imgs_words/ch/word_4.jpg:['0', 0.9999982]

6 级联推理

以超轻量中文 OCR 模型推理为例,在执行预测时,需要通过参数 image_dir 指定单张图像或者图像集合的路径、参数 det_model_dir, cls_model_dir 和 rec_model_dir 分别指定检测,方向分类和识别的 inference 模型路径。参数 use_angle_cls 用于控制是否启用方向分类模型。use_mp 表示是否使用多进程。total_process_num 表示在使用多进程时的进程数。可视化识别结果默认保存到 ./inference_results 文件夹里面。

# 使用方向分类器
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/ch_PP-OCRv2_det_infer/" --cls_model_dir="./inference/cls/" --rec_model_dir="./inference/ch_PP-OCRv2_rec_infer/" --use_angle_cls=true


# 不使用方向分类器
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/ch_PP-OCRv2_det_infer/" --rec_model_dir="./inference/ch_PP-OCRv2_rec_infer/" --use_angle_cls=false


# 使用多进程
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/ch_PP-OCRv2_det_infer/" --rec_model_dir="./inference/ch_PP-OCRv2_rec_infer/" --use_angle_cls=false --use_mp=True --total_process_num=6

执行命令后,识别结果图像如下:

7 其它模型推理

如果想尝试使用其他检测算法或者识别算法,需要更新相应配置和模型,比如要使用 EAST 文本检测模型和 STAR-Net 文本识别模型时,首先下载模型进行转化,然后再推理

7.1 模型转换

首先将 EAST 文本检测训练过程中保存的模型,转换成inference model。以基于Resnet50_vd骨干网络,在ICDAR2015英文数据集训练的模型为例( 模型下载地址 ),可以使用如下命令进行转换:

python3 tools/export_model.py -c configs/det/det_r50_vd_east.yml -o Global.pretrained_model=./det_r50_vd_east_v2.0_train/best_accuracy  Global.save_inference_dir=./inference/det_east

 7.2 级联推理

python3 tools/infer/predict_system.py --image_dir="./doc/imgs_en/img_10.jpg" --det_model_dir="./inference/det_east/" --det_algorithm="EAST" --rec_model_dir="./inference/starnet/" --rec_image_shape="3, 32, 100" --rec_char_type="en"

执行命令后,识别结果图像如下:

参考

以上是关于PaddleOCR之模型介绍与测试的主要内容,如果未能解决你的问题,请参考以下文章

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

[课程][原创]paddleocr训练自己数据集windows版

开发者说PaddleOCR的.NET封装与应用部署

PaddleOCR 部署实战之Java&C#方案直播分享来啦

PaddleOCR 部署实战之Java&C#方案直播分享来啦

[课程][原创]paddleocr训练自己的数据集ubuntu版