文章作者:英特爾物聯網行業創新大使,楊雪鋒 博士。中國礦業大學機電工程學院副教授;發表學術論文30余篇,獲國家專利授權20多件(其中發明專利8件)。
OpenVINO 簡介
OpenVINO 工具套件2022.1版于2022年3月22日正式發布,根據官宣OpenVINO 迎來迄今為止最重大更新,2022.1新特性搶先看!,OpenVINO 2022.1將是迄今為止最大變化的版本,并可以直接支持讀取飛槳模型。
PGNet 簡介
任意形狀文本的識別(例如,彎曲文本)受到越來越多的研究關注,而應用也愈發廣泛(例如,廣告牌識別、印章識別等)
AAAI 2021會議上發表的百度自研的端到端場景文本識別 PGNet1 算法,有效的滿足了上述需求,其典型特點有:
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
準備 PGNet 的 OpenVINO 推理程序開發環境
要完成 PGNet 的 OpenVINO 推理程序開發,需要安裝:
PaddleOCR 運行環境,參考:
安裝 PaddleOCR 運行環境
克隆 PaddleOCR 到本地,并安裝第三方庫
OpenVINO 開發套件:
pip install openvino-dev[onnx]
下載 PGNet 預訓練模型
PaddleOCR 已提供 PGNet 預訓練模型,請自行下載并解壓,如下圖所示。
PGNet 預訓練模型下載鏈接:
https://paddleocr.bj.bcebos.com/dygraph_v2.0/pgnet/e2e_server_pgnetA_infer.tar
下載完畢后,運行 PaddleOCR 自帶的預測程序:
toolsinferpredict_e2e.py
# 如果想使用CPU進行預測,需設置use_gpu參數為Falsepython3 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。
用 OpenVINO 讀取 PGNet 預訓練模型
如前所述,OpenVINO 支持直接讀入飛槳模型。使用下面的代碼,可以快速測試 OpenVINO 讀入 PGNet 模型的效果。
from openvino.runtime import Core
# 指定PGNet模型路徑pgnet_path = “.e2e_server_pgnetA_inferinference.pdmodel”
# 創建Core對象core = Core()# 載入并編譯PGNet模型sess = core.compile_model(model=pgnet_path, device_name=“CPU”)# 輸出PGNet模型輸入&輸出信息print(sess.input)
運行效果如下圖所示,說明 OpenVINO 直接讀取飛槳版 PGNet 模型成功。
使用 OpenVINO 開發 PGNet 的推理程序
基于上述代碼,結合 PGNet 的數據前處理和后處理代碼,即可開發出完整的 PGNet 推理程序。
01
升級 PaddleOCR 自帶預測程序,
支持 OpenVINO 推理
由于 PaddleOCR 自帶的預測程序:
toolsinferpredict_e2e.py
已經實現了 PGNet 的數據前處理和后處理代碼,所以,只需要稍微修改:
toolsinferpredict_e2e.py
toolsinferutility.py
添加 OpenVINO 的推理代碼,即可升級 PaddleOCR 對 OpenVINO 的支持。上述代碼,可以在下方鏈接下載。下載后,請并替換同名文件。
https://gitee.com/ppov-nuc/pgnet-openvino-inference
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 toolsinferpredict_e2e.py --e2e_algorithm=“PGNet” --image_dir=.docimgs_en --e2e_model_dir=ov_infere2e_server_pgnetA_inferinference.pdmodel --e2e_pgnet_valid_set=“totaltext” --use_gpu=False --use_openvino=True
運行效果如下圖所示:
從運行結果可以看到,使用了 OpenVINO 的推理程序,運行的平均時間是1.33s;沒有使用OpenVINO 的推理程序,運行的平均時間是5.09s。OpenVINO 極大的提升了模型在 CPU 上的推理計算效率。
02
借鑒 PaddleOCR 的前處理和后處理代碼,
實現 OpenVINO 推理程序
直接使用 ppocr 中自帶的前處理和后處理代碼,可以輕松實現 PGNet 的OpenVINO 推理程序:
https://gitee.com/ppov-nuc/pgnet-openvino-inference/blob/master/pgnet_ov_infer.py
from openvino.runtime import Corefrom ppocr.data import create_operators, transformfrom ppocr.postprocess import build_post_processimport cv2import numpy as npimport 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_oppre_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_oppostprocess_params = {}postprocess_params[‘name’] = ‘PGPostProcess’postprocess_params[“score_thresh”] = 0.5postprocess_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 = dataimg = np.expand_dims(img, axis=0)shape_list = np.expand_dims(shape_list,
axis=0)starttime = time.time()
# Do the inference by OpenVINOoutputs = pgnet([img])out_layers = pgnet.outputpreds = {}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() - starttimeprint(f“Predict time:
{elapse}s”)import utilitysrc_im = utility.draw_e2e_res(points, strs, image_path)cv2.imshow(“PGNet infer by OpenVINO”, src_im)cv2.waitKey(0)cv2.destroyAllWindows()
運行結果,如下圖所示:
總結
飛槳版的 PGNet 是一個易學易用、文檔化和工程化做的非常好的3、端到端的、可以檢測彎曲文字的模型。
由于從OpenVINO 2022.1版本開始,OpenVINO Runtime 已經支持了直接讀取飛槳模型,且 OpenVINO 的 API 簡單易用,所以,可以很容易的升級 PaddleOCR 自帶的預測程序:
toolsinferpredict_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
?。?]PaddleOCRFAQ: https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/FAQ.md#13
?。?]PGNetrepo:
https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/algorithm_e2e_pgnet.md
編輯:黃飛
評論
查看更多