点击上方蓝字关注我们
微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识
OpenVINO2022 API介绍
OpenVINO2022 版本的SDK在使用比之前版本简单,而且功能比较丰富,特别是支持动态输入设置,一次可以推理多张图像;相比之前的模型输入只支持一种尺度输入跟每次一张图片推理来说是大大的提升执行效率。特别是Python版本的API简单易学,容易上手,只需要掌握下面几个函数就可以完成从模型加载到推理。
01
导入支持
要使用Python SDK,首先需要导入支持语句,
from openvino.runtime import Coreie= Core()
02
加载模型
2022版本加载模型提供了两种模式分别是read_model与compile_model方式,这两种方式得到分别是model跟compiled model,其中通过read_model方式读取的model对象可以通过compile_model函数转换为compiled model,同时它们都支持直接访问属性获取输入与输出层信息(inputs/outputs),函数如下:
model = ie. read_model(model=”your model path”, weights=”your weights path”compiled = ie.compile_model(model, "CPU")
print(model.inputs)print(model.outputs)
print(compiled.inputs)print(compiled.outputs)
03
修改模型输入
Model的reshape方法支持把模型输入修改,同时会修改整个模型的下行转发推理,当前支持的修改参数包括batch size、输入图像的宽高、假设模型的原始输入为:
1x3x224x224
修改为:
8x3x448x448
只需要调用reshape方法,一行代码即可完成:
model.reshape([8, 3, 448, 448])
前后对比示意图如下:
上述是从一种静态输入各种,设置为另外一种静态输入格式。OpenVINO的reshape还支持动态输入(不定长)的推理输入设置,假设把模型的输入格式从:
[?x3x640x640]
修改为:
[4x3x640x?]
其中 ?表示不定长,可以用如下代码:
for input_layer in model.inputs: input_shape = input_layer.partial_shape input_shape[0] = 4 input_shape[3] = -1 model.reshape({input_layer: input_shape})
其中 -1表示不定长!
注意:修改输入/动态输入在iGPU上暂时还无法被支持,所以AUTO模式下修改以后可能会遇到推理失败的情况!这块建议参考官方文档说明。
04
模型推理
Python SDK支持两种方式,一种是通过complied model直接推理,这种方式跟很多深度学习的推理方式非常类似,另外一种方式是先通过compiled model创建InferRequest实例对象,然后调用infer方法完成推理,个人推荐第一种方法,简单快捷明了,希望OpenVINO以后直接把第二种方法给disable了,同时官方的教程也更新为第一种方式推理!两种推理方式代码示意,
方法一:
results = compiled_model(input_data)
方法二:
infer_request = compiled_model.create_infer_request()
infer_request.infer()
output_tensor = infer_request.get_output_tensor()
场景文字检测模型演示
下面是基于2022版本最新Python SDK调用OpenVINO官方提供的自带场景文字检测模型,完成了一个简单的场景文字检测OpenVINO2022版本 Python SDK演示,代码如下:
import cv2 as cvimport numpy as npfrom openvino.runtime import Core
class OpenVINOTextDetector(): def __init__(self): # 预处理设置 0 - 放缩, 1- 保持比例 self.preprocess_img_mode = 0 # 插值方式, 0 - 最近邻 1 - 线性, 2 - 立方 self.interpolate_mode = cv.INTER_LINEAR self.score_threshold = 0.5 self.init_text_detector() def init_text_detector(self): ie = Core() model = ie.read_model(model="D:/python/openvm/models/text-detection-0004.xml", weights="D:/python/openvm/models/text-detection-0004.bin") self.compiled_model = ie.compile_model(model=model, device_name="CPU") self.input_layer = next(iter(self.compiled_model.inputs)) # model/segm_logits/add, model/link_logits_/add # 1, 192, 320, 2 it = iter(self.compiled_model.outputs) self.output_layer1 = next(it) self.output_layer2 = next(it) def format_input(self, image): n, h, w, c = self.input_layer.shape if self.preprocess_img_mode == 0: resized_image = cv.resize(image, (w, h), interpolation=self.interpolate_mode) if self.preprocess_img_mode == 1: resized_image = np.zeros((h, w, 3), np.uint8) rows, cols, _ = image.shape rate_y = rows / h rate_x = cols / w if rate_y <= 1.0 and rate_x <= 1.0: resized_image[0:rows, 0:cols] = image if rate_y > 1.0 or rate_x > 1.0: rate_max = max(rate_x, rate_y) rh = int(rows / rate_max) rw = int(cols / rate_max) rimg = cv.resize(image, (rw, rh)) resized_image[0:rh, 0:rw] = rimg input_data = np.expand_dims(resized_image, 0).astype(np.float32) return input_data def exec(self, image: np.ndarray) -> dict: ih, iw, _ = image.shape input_data = self.format_input(image) outputs = self.compiled_model([input_data]) out1 = np.squeeze(outputs[self.output_layer1]) _, oh, ow, _ = outputs[self.output_layer1].shape pixel_mask = np.zeros((oh, ow), dtype=np.uint8) for row in range(oh): for col in range(ow): pv2 = out1[row, col, 1] if pv2 > self.score_threshold: pixel_mask[row, col] = 255 mask = cv.resize(pixel_mask, (iw, ih)) contours, hiearchy = cv.findContours(mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) text_boxes = [] for cnt in range(len(contours)): x, y, w, h = cv.boundingRect(contours[cnt]) text_boxes.append((x, y, w, h)) return text_boxes
if __name__ == "__main__": mt = OpenVINOTextDetector() image = cv.imread("D:/openvino_test.png") boxes = mt.exec(image) for box in boxes: x, y, w, h = box cv.rectangle(image, (x, y), (x w, y h), (0, 0, 255), 2, 8, 0) cv.imshow("OpenVINO2022 Python SDK -Text Detect Demo", image) cv.imwrite("D:/result.png",image) cv.waitKey(0) cv.destroyAllWindows()
输入图像:
场景文字检测结果:
一个trick的地方,当你修改为动态输入的时候有时候会遇到这个错误:
ValueError: get_shape was called on a descriptor::Tensor with dynamic shape
这个时候你需要把Core初始化为全局类属性变量或者一个全局变量一般情况下就会修正这个错误,这个是使用动态输入推理最有玄机的地方!原因我也解释不清楚,也许OpenVINO还需要持续改进,提升开发者满意度!
扫码查看OpenCV OpenVIO Pytorch系统化学习路线图
推荐阅读
CV全栈开发者说 - 从传统算法到深度学习怎么修炼
2022入坑深度学习,我选择Pytorch框架!
Pytorch轻松实现经典视觉任务
教程推荐 | Pytorch框架CV开发-从入门到实战
OpenCV4 C 学习 必备基础语法知识三
OpenCV4 C 学习 必备基础语法知识二
OpenCV4.5.4 人脸检测 五点landmark新功能测试
OpenCV4.5.4人脸识别详解与代码演示
OpenCV二值图象分析之Blob分析找圆
OpenCV4.5.x DNN YOLOv5 C 推理
OpenCV4.5.4 直接支持YOLOv5 6.1版本模型推理
OpenVINO2021.4 YOLOX目标检测模型部署测试
比YOLOv5还厉害的YOLOX来了,官方支持OpenVINO推理