课程全程将在SOPHGO(算能)云平台上进行。
本次课程将介绍:
1. SOPHGO(算能)云平台环境搭建
2. PP-OCR的文字识别算法
3. 通过BMNNSDK进行PP-OCR模型转换和量化
4. 实现算法的移植
5. 部署和测试
6. 相关链接
注意:申请开通BM1684-PCIE通用云开发空间
参考:https://cloud.sophgo.com/tpu.pdf
1.2.1 进入命令行模式,进去默认在/home/sophgo目录
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
1.2.7 通过云空间文件系统拷贝代码到Docker容器中
打开云空间文件系统:
上传文件:文件会被存储在服务器的 /tmp 目录下
拷贝文件到Docker容器中:
Docker容器的workspace目录被映射到 /home/sophgo/bmnnsdk2-bm1684_v2.7.0/
cp /tmp/<待拷贝文件> /home/sophgo/bmnnsdk2-bm1684_v2.7.0/
注意:本教程后续步骤均在Docker容器中进行
---
仓库链接:https://github.com/PaddlePaddle/PaddleOCR
PP-OCRv2技术报告:https://arxiv.org/abs/2109.03144
PP-OCR是百度飞桨团队研发的实用型超轻量OCR系统。
从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
由于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设置环境变量)
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`文件夹下。
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
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号
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
...
*注意:由于是在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/
样例开源仓库: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