基于PP-OCR的文字识别算法移植与测试

课程全程将在SOPHGO(算能)云平台上进行。

本次课程将介绍:

1. SOPHGO(算能)云平台环境搭建

2. PP-OCR的文字识别算法

3. 通过BMNNSDK进行PP-OCR模型转换和量化

4. 实现算法的移植

5. 部署和测试

6. 相关链接

1. SOPHGO(算能)云平台环境搭建

1.1. 开通云平台账号

注意:申请开通BM1684-PCIE通用云开发空间

参考:https://cloud.sophgo.com/tpu.pdf

1.2. 开发环境初始化

1.2.1 进入命令行模式,进去默认在/home/sophgo目录

基于PP-OCR的文字识别算法移植与测试_第1张图片

 

1.2.2 切换成 root 权限


sudo -i
 

1.2.3 安装驱动


cd /home/sophgo/bmnnsdk2-bm1684_v2.7.0/scripts
./install_driver_pcie.sh
ls /dev/bm*

如果可以看到以下设备节点,表示驱动安装成功:

 

1.2.4 加载Docker,并初始化环境


cd /home/sophgo/
apt install unzip
unzip bmnnsdk2-bm1684-ubuntu-docker-py37.zip
cd bmnnsdk2-bm1684-ubuntu-docker-py37/
docker load -i bmnnsdk2-bm1684-ubuntu.docker
 

1.2.5 通过脚本创建Docker容器


cd /home/sophgo/bmnnsdk2-bm1684_v2.7.0/
# 执行脚本创建Docker容器
./docker_run_bmnnsdk.sh

# 自动进入Docker容器
# 进行环境初始化
cd scripts/

# 更新 pip
/usr/local/bin/python3 -m pip install --upgrade pip

# 安装 nntc
./install_lib.sh nntc

# 执行脚本 envsetup_pcie.sh 设置环境变量
# 设置环境变量,注意此命令只对当前终端有效,重新进入需要重新执行
source ./envsetup_pcie.sh

# 安装sophon包
pip3 install /workspace/lib/sail/python3/pcie/py37/sophon-2.7.0-py3-none-any.whl
 

1.2.6 Docker 常用命令


# 启动 Docker容器
docker start

# 查看正在运行的 Docker容器
docker ps

# 进入 Docker 容器 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it bash
 


1.2.7 通过云空间文件系统拷贝代码到Docker容器中

打开云空间文件系统:

基于PP-OCR的文字识别算法移植与测试_第2张图片

 

上传文件:文件会被存储在服务器的 /tmp 目录下

基于PP-OCR的文字识别算法移植与测试_第3张图片 

拷贝文件到Docker容器中:
Docker容器的workspace目录被映射到 /home/sophgo/bmnnsdk2-bm1684_v2.7.0/


cp /tmp/<待拷贝文件> /home/sophgo/bmnnsdk2-bm1684_v2.7.0/
 

注意:本教程后续步骤均在Docker容器中进行

2. PP-OCR的文字识别算法

---

仓库链接:https://github.com/PaddlePaddle/PaddleOCR  

PP-OCRv2技术报告:https://arxiv.org/abs/2109.03144

PP-OCR是百度飞桨团队研发的实用型超轻量OCR系统。



3. 通过BMNNSDK进行PP-OCR模型转换和量化

3.1 准备推理的模型

从Github上获取SOPHON示例项目:git clone https://github.com/sophon-ai-algo/examples.git

3.1.1 将checkpoints模型 转换为 inference模型

PaddlePaddle 支持导出 inference 模型用于部署推理场景,相比于训练调优场景,inference 模型会将网络权重与网络结构进行持久化存储,并且 PaddlePaddle 支持使用预测引擎加载 inference 模型进行预测推理。

参考:https://gitee.com/paddlepaddle/PaddleClas/blob/release/2.3/docs/zh_CN/inference_deployment/export_model.md

超轻量PP-OCRv2系列包含三个模型:检测(3.1M)+ 方向分类器(1.4M)+ 识别(8.5M)= 13.0M

可以直接通过运行SOPHON示例项目中的脚本下载转换好的inference模型:

cd examples/simple/PP-OCRv2/
./scripts/download.sh

# 下载的模型包括:
ch_PP-OCRv2_det_infer: 文本检测模型
ch_PP-OCRv2_rec_infer: 文本识别模型
ch_ppocr_mobile_v2.0_cls_infer: 文本方向分类模型
# 下载的数据包括:
ppocr_img: 用于测试的相关图片
 

3.1.2 生成FP32 BModel

BMPADDLE是BMNNSDK中针对PaddlePaddle的模型编译器,可以将inference模型文件编译成BMRuntime所需的文件。用户手册:https://doc.sophgo.com/docs/2.7.0/docs_latest_release/nntc/html/usage/bmpaddle.html#

通过命令生成FP32 BModel (各参数含义参考[用户手册](https://doc.sophgo.com/docs/2.7.0/docs_latest_release/nntc/html/usage/bmpaddle.html#)):

python3 -m bmpaddle [--model=] \
                  [--input_names=] \
                  [--shapes=] \
                  [--descs=] \
                  [--output_names=] \
                  [--net_name=] \
                  [--opt=] \
                  [--dyn=] \
                  [--outdir=] \
                  [--target=] \
                  [--cmp=] \
                  [--mode=] \
                  [--enable_profile=] \
                  [--list_ops]
 

可以直接通过SOPHON示例项目中的脚本文件生成FP32 BModel:

# 请根据实际情况修改模型路径、保存目录和输入尺寸等参数
# 当前路径 examples/simple/PP-OCRv2/
./scripts/gen_fp32bmodel.sh

将多个模型组合成一个模型

bm_model.bin --combine xxx.bmodel xxx.bmodel -o xxx.bmodel
 

3.2.1 查看模型信息

命令:bm_model.bin --info xxxx.bmodel


bm_model.bin --info ch_ppocr_mobile_v2.0_cls_fp32_b1b4.bmodel
# 输出
bmodel version: B.2.2
chip: BM1684
create time: Fri Sep  2 03:38:35 2022

==========================================
net 0: [ppocr_mobile_v2.0_cls]  static
------------
stage 0:
input: x, [1, 3, 48, 192], float32, scale: 1
output: save_infer_model/scale_0.tmp_1, [1, 2], float32, scale: 1
------------
stage 1:
input: x, [4, 3, 48, 192], float32, scale: 1
output: save_infer_model/scale_0.tmp_1, [4, 2], float32, scale: 1

device mem size: 1739528 (coeff: 978952, instruct: 133888, runtime: 626688)
host mem size: 0 (coeff: 0, runtime: 0)
 

3.2.2 测试模型理论性能

命令:bmrt_test –-bmodel xxx.bmodel

bmrt_test --bmodel ch_ppocr_mobile_v2.0_cls_fp32_b1b4.bmodel
# 输出
[BMRT][deal_with_options:1398] INFO:Loop num: 1
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init 
[BMRT][load_bmodel:1018] INFO:Loading bmodel from [ch_ppocr_mobile_v2.0_cls_fp32_b1b4.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:982] INFO:pre net num: 0, load net num: 1
[BMRT][bmrt_test:758] INFO:==> running network #0, name: ppocr_mobile_v2.0_cls, loop: 0
[BMRT][bmrt_test:1001] INFO:net[ppocr_mobile_v2.0_cls] stage[0], launch total time is 440 us (npu 327 us, cpu 113 us)
[BMRT][bmrt_test:1004] INFO:+++ The network[ppocr_mobile_v2.0_cls] stage[0] output_data +++
[BMRT][print_array:700] INFO:output data #0 shape: [1 2 ] < 0.499801 0.500199 >
[BMRT][bmrt_test:1049] INFO:load input time(s): 0.000168
[BMRT][bmrt_test:1050] INFO:calculate  time(s): 0.000445
[BMRT][bmrt_test:1051] INFO:get output time(s): 0.000063
[BMRT][bmrt_test:1052] INFO:compare    time(s): 0.000101
[BMRT][bmrt_test:1001] INFO:net[ppocr_mobile_v2.0_cls] stage[1], launch total time is 1050 us (npu 959 us, cpu 91 us)
[BMRT][bmrt_test:1004] INFO:+++ The network[ppocr_mobile_v2.0_cls] stage[1] output_data +++
[BMRT][print_array:700] INFO:output data #0 shape: [4 2 ] < 0.499801 0.500199 0.499801 0.500199 0.499801 0.500199 0.499801 0.500199 >
[BMRT][bmrt_test:1049] INFO:load input time(s): 0.000402
[BMRT][bmrt_test:1050] INFO:calculate  time(s): 0.001054
[BMRT][bmrt_test:1051] INFO:get output time(s): 0.000072
[BMRT][bmrt_test:1052] INFO:compare    time(s): 0.000065
 

4. 实现算法的移植


4.1 Python示例程序: 

由于python例程需要用到sail库,需要安装:


pip3 install /workspace/lib/sail/python3/pcie/py37/sophon-x.x.x-py3-none-any.whl
 

以下步骤,请严格按照顺序进行安装
您还需要安装以下依赖和工具:


sudo apt-get install -y libgeos-dev libjpeg-dev zlib1g-dev
pip3 install setuptools-scm
 

还需要安装第三方库

pip3 install -r inference/python/requirements.txt
 

若要在x86 PCIe平台使用bm_opencv可添加环境变量如下:

export PYTHONPATH=$PYTHONPATH:$REL_TOP/lib/opencv/pcie/opencv-python/
 

出现中文无法正常显示的解决办法:

apt install language-pack-zh-hans


注:在Docker容器中注意环境变量的设置(参考1.2.5设置环境变量)

基于PP-OCR的文字识别算法移植与测试_第4张图片

基于PP-OCR的文字识别算法移植与测试_第5张图片

 

5. 部署和测试

5.1 Python示例程序测试

5.1.1 文本检测 det_cv_cv_sail.py

主要用于检测图片中文本字段的位置,返回文本字段所在的四边形顶点坐标。

det_cv_cv_sail.py`的参数说明如下:


usage:det_cv_cv_sail.py [--tpu_id] [--img_path] [--det_model] [--det_batch_size] [--det_limit_side_len]
--tpu_id: 用于推理的tpu设备id;
--img_path: 输入图片文件夹的路径;
--det_model: 用于推理的文本检测bmodel路径;
--det_batch_size: 模型输入的batch_size,本例程可支持1或4;
--det_limit_side_len: 网络输入尺寸列表,本例程的模型支持960。
 

测试命令:

python3 inference/python/det_cv_cv_sail.py --tpu_id 0  --img_path data/images/ppocr_img/test --det_model data/models/fp32bmodel/ch_PP-OCRv2_det_fp32_b1b4.bmodel --det_batch_size 4

执行完成后,会将预测的可视化结果保存在`./inference_results`文件夹下。

结果展示:
基于PP-OCR的文字识别算法移植与测试_第6张图片

 

5.1.2 文本方向分类 cls_cv_cv_sail.py

主要用于判断检测并处理后的文本字段是否上下颠倒,若上下颠倒则进行矫正。

cls_cv_cv_sail.py的参数说明如下:


usage:cls_cv_cv_sail.py [--tpu_id] [--img_path] [--cls_model] [--cls_batch_size] [--cls_thresh] [--label_list] 
--tpu_id: 用于推理的tpu设备id;
--img_path: 输入图片文件夹的路径,每张图片仅包含一个文本字段;
--cls_model: 用于推理的文本方向分类bmodel路径;
--cls_batch_size: 模型输入的batch_size,本例程可支持1或4;
--cls_thresh: 文本方向矫正阈值,当预测类别为'180',且预测阈值大于该阈值时才可进行矫正;
--label_list: 文本方向分类的方向列表,本例程默认['0', '180']。
 

测试命令:

python3 inference/python/cls_cv_cv_sail.py --tpu_id 0  --img_path data/images/ppocr_img/imgs_words/ch --cls_model data/models/fp32bmodel/ch_ppocr_mobile_v2.0_cls_fp32_b1b4.bmodel --cls_batch_size 4 --cls_thresh 0.9 --label_list "0, 180"

执行完成后,会打印预测的类别及置信度如下:


INFO:root:img_name:word_4.jpg, pred:0, conf:0.9999982118606567
INFO:root:img_name:word_1.jpg, pred:0, conf:0.9998781681060791
INFO:root:img_name:word_2.jpg, pred:0, conf:0.9999998807907104
INFO:root:img_name:word_3.jpg, pred:0, conf:0.9999998807907104
INFO:root:img_name:word_5.jpg, pred:0, conf:0.9999988079071045
 

结果展示:
基于PP-OCR的文字识别算法移植与测试_第7张图片

 

5.1.3 文本识别 rec_cv_cv_sail.py

主要用于对矫正后的文本字段进行内容识别。

rec_cv_cv_sail.py的参数说明如下:


usage:rec_cv_cv_sail.py [--tpu_id] [--img_path] [--rec_model] [--rec_batch_size] [--char_dict_path] [--use_space_char] [--img_size]
--tpu_id: 用于推理的tpu设备id;
--img_path: 输入图片文件夹的路径,每张图片仅包含一个文本字段;
--rec_model: 用于推理的文本识别bmodel路径;
--rec_batch_size: 模型输入的batch_size,本例程可支持1或4;
--char_dict_path: 字符字典文件所在路径;
--use_space_char: 是否识别空格字符;
--img_size: 网络输入尺寸,本例程根据文本长度可支持[320, 32],[640, 32],[1280, 32]三种尺寸,其中[320, 32],[640, 32]可支持batch_size=4的推理。
 

测试命令:

python3 inference/python/rec_cv_cv_sail.py --tpu_id 0  --img_path data/images/ppocr_img/imgs_words/ch --rec_model data/models/fp32bmodel/ch_PP-OCRv2_rec_fp32_b1b4.bmodel --rec_batch_size 4 --char_dict_path ppocr_keys_v1.txt  --use_space_char True

执行完成后,会打印预测的文本内容及置信度如下:


INFO:root:img_name:word_4.jpg, conf:0.966046, pred:实力活力
INFO:root:img_name:word_1.jpg, conf:0.997443, pred:韩国小馆
INFO:root:img_name:word_3.jpg, conf:0.936186, pred:电话:15952301928
INFO:root:img_name:word_5.jpg, conf:0.980753, pred:西湾监管
INFO:root:img_name:word_2.jpg, conf:0.994984, pred:汉阳鹦鹉家居建材市场E区25-26号
 

结果展示:
基于PP-OCR的文字识别算法移植与测试_第8张图片


5.1.4 全流程测试

进行文本检测、方向分类、文本识别全流程测试,并输出可视化的预测结果。  
system_cv_cv_sail.py除了包含det_cv_cv_sail.py、cls_cv_cv_sail.py、rec_cv_cv_sail.py的参数外,还包括以下参数:

usage:system_cv_cv_sail.py [--drop_score] [--use_angle_cls]
--use_angle_cls: 是否进行方向矫正;
--drop_score: 若预测的文本字段置信度小于该阈值则进行舍弃。
 

测试命令:

python3 inference/python/system_cv_cv_sail.py --use_angle_cls True --drop_score  0.5 

执行完成后,会打印预测的字段,同时会将预测的可视化结果保存在`./inference_results`文件夹下。

输出结果:

...
INFO:root:ger_2.jpg
INFO:root:['was Sie versprechen.', 'HaltenSie', 'Und gebenSie noch wasdazu']
INFO:root:The visualized image saved in ./inference_results/ocr_res_ger_2.jpg
INFO:root:00056221.jpg
INFO:root:['和谐号', '3623301993****0941', '检票口16', '余友红', '限乘当日当次车', '¥73.00元', 'Shang HaiHongQiao', 'HangZhouDong', '上海虹桥', '杭州东', 'G7512次', '等座', '06车12B号', '杭州东售', 'Z57A001950', '7788.com', '9004-1300-5707-08A0-01950', '2013年07月07日13:39开']
INFO:root:The visualized image saved in ./inference_results/ocr_res_00056221.jpg
INFO:root:1.jpg
INFO:root:['华南农业大学|东图', '土地整治与土壤修复研究中心']
INFO:root:The visualized image saved in ./inference_results/ocr_res_1.jpg
...
 

结果展示:
基于PP-OCR的文字识别算法移植与测试_第9张图片

 

5.2 获得推理生成的图片


*注意:由于是在Docker容器中,如果想要看到推理的可视化结果需要退出容器,并打开Docker容器映射的文件夹,在对应位置将图片拷贝到 /tmp 文件夹下后可在云平台文件系统中下载。


# 退出容器
exit
# 进入Docker容器映射的文件夹,即Docker容器中的 workspace/目录
cd /home/sophgo/bmnnsdk2-bm1684_v2.7.0/

# 打开PP-OCRv2项目, ${PP-OCRv2}即项目所在路径
cd ${PP-OCRv2}/inference_results

# 拷贝需要的推理结果图片
cp xxxxxx.jpg /tmp/

云空间文件系统:
基于PP-OCR的文字识别算法移植与测试_第10张图片

 
6. 相关链接

样例开源仓库:https://github.com/sophon-ai-algo/examples

BM1684 BMNNSDK文档:https://developer.sophgo.com/site/index/document/6/all.html

编译工具用户开发手册: https://doc.sophgo.com/docs/2.7.0/docs_latest_release/nntc/html/index.html

量化工具用户开发手册: https://doc.sophgo.com/docs/2.7.0/docs_latest_release/calibration-tools/html/index.html

算能量化工具介绍及使用说明:https://www.bilibili.com/video/BV1DA4y1S75p?spm_id_from=333.999.0.0

官网视频教程:https://developer.sophgo.com/site/index/course/all/all.html

官网文档中心:https://developer.sophgo.com/site/index/document/all/all.html

官网下载中心:https://developer.sophgo.com/site/index/material/all/all.html

官网论坛:https://developer.sophgo.com/forum/view/43.html
 

你可能感兴趣的:(SOPHON,SDK常见问题,docker,ubuntu,运维)