当前位置:网站首页>使用OpenVINO实现飞桨版PGNet推理程序
使用OpenVINO实现飞桨版PGNet推理程序
2022-08-05 01:43:00 【英特尔边缘计算社区】
目录
第1章 使用OpenVINOTM实现飞桨版PGNet推理程序
1.6.1升级PaddleOCR自带预测程序,支持OpenVINO推理
1.6.2借鉴PaddleOCR的前处理和后处理代码,实现OpenVINO推理程序
使用OpenVINOTM实现飞桨版PGNet推理程序
作者:杨雪峰 英特尔物联网行业创新大使
1.1OpenVINOTM 简介
OpenVINO 工具包2022.1版于2022年3月22日正式发布,根据官宣《OpenVINO 迎来迄今为止最重大更新,2022.1新特性抢先看》,OpenVINO 2022.1将是迄今为止最大变化的版本,并可以直接支持读取飞桨模型。

1.2 PGNet简介
任意形状文本的识别(例如,弯曲文本)受到越来越多的研究关注,而应用也愈发广泛(例如,广告牌识别、印章识别等),如下图所示。


AAAI 2021会议上发表的百度自研的端到端场景文本识别PGNet[1]算法,有效的满足了上述需求,其典型特点有:
- PGNet是一种新颖的、端到端的、的任意形状的文本检测识别器框架
- 不需要字符级别的标注,NMS操作以及ROI操作[2]
- 提出预测文本行内的阅读顺序模块和基于图的修正模块来提升文本识别效果
- 识别精度和运行速度堪称SOTA

*上图引用自PNGet论文[1]
另外,飞桨版PGNet的工程化和文档化做的极好,没有任何基础的人,都可以在不到半天的时间内完成PGNet的开发环境搭建、模型训练、ONNX模型导出。
PGNet的文档链接:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/algorithm_e2e_pgnet.md
1.3准备PGNet的OpenVINO推理程序开发环境
要完成PGNet的OpenVINO推理程序开发,需要安装:
- PaddleOCR运行环境,参考:
- OpenVINOTM开发工具
pip install openvino-dev[onnx]1.4下载PGNet预训练模型
PaddleOCR已提供PGNet预训练模型,请自行下载并解压,如下图所示。

PGNet预训练模型下载链接:https://paddleocr.bj.bcebos.com/dygraph_v2.0/pgnet/e2e_server_pgnetA_infer.tar
下载完毕后,运行PaddleOCR自带的预测程序 tools\infer\predict_e2e.py
# 如果想使用CPU进行预测,需设置use_gpu参数为False python3 tools/infer/predict_e2e.py --e2e_algorithm="PGNet" --image_dir="./doc/imgs_en/img623.jpg" --e2e_model_dir="./inference/e2e_server_pgnetA_infer/" --e2e_pgnet_valid_set="totaltext" --use_gpu=False |
运行结果,如下图所示,说明PaddleOCR和PGNet预训练模型都准备好了。
从图中可见,运行的平均时间是5.09s。
1.5用OpenVINOTM读取PGNet预训练模型
如前所述,OpenVINOTM支持直接读入飞桨模型。使用下面的代码,可以快速测试OpenVINOTM读入PGNet模型的效果。
from openvino.runtime import Core
# 指定PGNet模型路径
pgnet_path = ".\e2e_server_pgnetA_infer\inference.pdmodel"
# 创建Core对象
core = Core()
# 载入并编译PGNet模型
sess = core.compile_model(model=pgnet_path, device_name="CPU")
# 输出PGNet模型输入&输出信息
print(sess.input)运行效果如下图所示,说明OpenVINOTM直接读取飞桨版PGNet模型成功。

1.6使用OpenVINOTM开发PGNet的推理程序
基于上述代码,结合PGNet的数据前处理和后处理代码,即可开发出完整的PGNet推理程序。
1.6.1升级PaddleOCR自带预测程序,支持OpenVINO推理
由于PaddleOCR自带的预测程序 tools\infer\predict_e2e.py,已经实现了PGNet的数据前处理和后处理代码,所以,只需要稍微修改:
- tools\infer\predict_e2e.py
- tools\infer\utility.py
添加OpenVINO的推理代码,即可升级PaddleOCR对OpenVINO的支持。
上述代码,可以从PGNet OpenVINO Inference: Do the PGNet inference based on OpenVINO 下载。下载后,请并替换同名文件。
OpenVINO支持代码如下所示,所有修改处都添加了“# OpenVINO Support Here”:
# OpenVINO Support Here
elif self.use_openvino:
outputs = self.predictor([img])
out_layers = self.predictor.output
preds = {}
preds['f_border'] = outputs[out_layers(0)]
preds['f_char'] = outputs[out_layers(1)]
preds['f_direction'] = outputs[out_layers(2)]
preds['f_score'] = outputs[out_layers(3)]替换完同名文件后,使用命令:
python tools\infer\predict_e2e.py --e2e_algorithm="PGNet" --image_dir=.\doc\imgs_en --e2e_model_dir=ov_infer\e2e_server_pgnetA_infer\inference.pdmodel --e2e_pgnet_valid_set="totaltext" --use_gpu=False --use_openvino=True |
运行效果如下所示:

从运行结果可以看到,使用了OpenVINO的推理程序,运行的平均时间是1.33s;没有使用OpenVINO的推理程序,运行的平均时间是5.09s。OpenVINO极大的提升了模型在CPU上的推理计算效率。
1.6.2借鉴PaddleOCR的前处理和后处理代码,实现OpenVINO推理程序
直接使用ppocr中自带的前处理和后处理代码,可以轻松实现PGNet的OpenVINO推理程序:pgnet_ov_infer.py · PPOV_NUC/PGNet OpenVINO Inference - Gitee.com
from openvino.runtime import Core
from ppocr.data import create_operators, transform
from ppocr.postprocess import build_post_process
import cv2
import numpy as np
import time
# 指定PGNet模型路径
pgnet_path = "./e2e_server_pgnetA_infer/inference.pdmodel"
# 创建Core对象
core = Core()
# 载入并编译PGNet模型
pgnet = core.compile_model(model=pgnet_path, device_name="CPU")
# 创建preprocess_op
pre_process_list = [{
'E2EResizeForTest': {
'max_side_len': 768,
'valid_set': 'totaltext'}
}, {
'NormalizeImage': {
'std': [0.229, 0.224, 0.225],
'mean': [0.485, 0.456, 0.406],
'scale': '1./255.',
'order': 'hwc'
}
}, {
'ToCHWImage': None
}, {
'KeepKeys': {
'keep_keys': ['image', 'shape']
}
}]
preprocess_op = create_operators(pre_process_list)
# 创建postprocess_op
postprocess_params = {}
postprocess_params['name'] = 'PGPostProcess'
postprocess_params["score_thresh"] = 0.5
postprocess_params["character_dict_path"] = "./ic15_dict.txt"
postprocess_params["valid_set"] = 'totaltext'
postprocess_params["mode"] = 'fast'
postprocess_op = build_post_process(postprocess_params)
def clip_det_res(points, img_height, img_width):
for pno in range(points.shape[0]):
points[pno, 0] = int(min(max(points[pno, 0], 0), img_width - 1))
points[pno, 1] = int(min(max(points[pno, 1], 0), img_height - 1))
return points
# 定义filter_tag_det_res_only_clip函数
def filter_tag_det_res_only_clip(dt_boxes, image_shape):
img_height, img_width = image_shape[0:2]
dt_boxes_new = []
for box in dt_boxes:
box = clip_det_res(box, img_height, img_width)
dt_boxes_new.append(box)
dt_boxes = np.array(dt_boxes_new)
return dt_boxes
# 载入图像数据并实现预处理
image_path = 'img623.jpg'
image = cv2.imread(image_path)
data = {'image': image}
data = transform(data, preprocess_op)
img, shape_list = data
img = np.expand_dims(img, axis=0)
shape_list = np.expand_dims(shape_list, axis=0)
starttime = time.time()
# Do the inference by OpenVINO
outputs = pgnet([img])
out_layers = pgnet.output
preds = {}
preds['f_border'] = outputs[out_layers(0)]
preds['f_char'] = outputs[out_layers(1)]
preds['f_direction'] = outputs[out_layers(2)]
preds['f_score'] = outputs[out_layers(3)]
post_result = postprocess_op(preds, shape_list)
points, strs = post_result['points'], post_result['texts']
dt_boxes = filter_tag_det_res_only_clip(points, image.shape)
elapse = time.time() - starttime
print(f"Predict time: {elapse}s")
import utility
src_im = utility.draw_e2e_res(points, strs, image_path)
cv2.imshow("PGNet infer by OpenVINO", src_im)
cv2.waitKey(0)
cv2.destroyAllWindows()运行结果,如下图所示:

1.7总结:
飞桨版的PGNet是一个易学易用、文档化和工程化做的非常好的[3]、端到端的、可以检测弯曲文字的模型。
由于从OpenVINO 2022.1版本开始,OpenVINO Runtime已经支持了直接读取飞桨模型,且OpenVINO的API简单易用,所以,可以很容易的升级PaddleOCR自带的预测程序 tools\infer\predict_e2e.py支持OpenVINO推理计算,或者从零开发OpenVINO推理程序。
经过OpenVINO优化后,PGNet的CPU推理计算效率大大提升,平均运行时间从5.09s,提升到1.33s,效率提升非常明显。
注意:运行时间,仅供参考,在不同CPU上,运行的时间会不一样。
参考资料
[1] PGNet: Real-time Arbitrarily-Shaped Text Spotting with Point Gathering Network, https://www.aaai.org/AAAI21Papers/AAAI-2885.WangP.pdf
[2] PaddleOCR FAQ: PaddleOCR/FAQ.md at release/2.5 · PaddlePaddle/PaddleOCR · GitHub
[3] PGNet repo: https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/algorithm_e2e_pgnet.md
边栏推荐
猜你喜欢

【Word】Word公式导出PDF后出现井号括号#()错误

Use of pytorch: Convolutional Neural Network Module

CNI (Container Network Plugin)

习题:选择结构(一)

5. PCIe official example

第09章 性能分析工具的使用【2.索引及调优篇】【MySQL高级】

如何发现一个有价值的 GameFi?

4. PCIe interface timing

金仓数据库 KingbaseES V8 GIS数据迁移方案(3. 基于ArcGIS平台的数据迁移到KES)

Introduction to JVM class loading
随机推荐
MySQL3
Kubernetes 网络入门
Difference between MBps and Mbps
How DHCP works
PCIe 核配置
3. pcie.v 文件
2021年11月网络规划设计师上午题知识点(上)
动态规划/背包问题总结/小结——01背包、完全背包
torch.autograd.grad finds the second derivative
Methods commonly used interface automation test framework postman tests
5. PCIe official example
主库预警日志报错ORA-00270
Lattice PCIe 学习 1
ORA-01105 ORA-03175
CNI (Container Network Plugin)
Bit rate vs. resolution, which one is more important?
Day Fourteen & Postman
数仓4.0(三)------数据仓库系统
【PyQT5 绑定函数的传参】
【机器学习】21天挑战赛学习笔记(二)