OpenVINO2022 Python API详解与演示

2022-07-26 17:41:27 浏览数 (1)

点击上方蓝字关注我们

微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识

OpenVINO2022 API介绍

OpenVINO2022 版本的SDK在使用比之前版本简单,而且功能比较丰富,特别是支持动态输入设置,一次可以推理多张图像;相比之前的模型输入只支持一种尺度输入跟每次一张图片推理来说是大大的提升执行效率。特别是Python版本的API简单易学,容易上手,只需要掌握下面几个函数就可以完成从模型加载到推理。

01

导入支持

要使用Python SDK,首先需要导入支持语句,

代码语言:javascript复制
from openvino.runtime import Coreie= Core()

02

加载模型

2022版本加载模型提供了两种模式分别是read_model与compile_model方式,这两种方式得到分别是model跟compiled model,其中通过read_model方式读取的model对象可以通过compile_model函数转换为compiled model,同时它们都支持直接访问属性获取输入与输出层信息(inputs/outputs),函数如下:

代码语言:javascript复制
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、输入图像的宽高、假设模型的原始输入为:

代码语言:javascript复制
1x3x224x224

修改为:

代码语言:javascript复制
8x3x448x448

只需要调用reshape方法,一行代码即可完成:

代码语言:javascript复制
model.reshape([8, 3, 448, 448])

前后对比示意图如下:

上述是从一种静态输入各种,设置为另外一种静态输入格式。OpenVINO的reshape还支持动态输入(不定长)的推理输入设置,假设把模型的输入格式从:

代码语言:javascript复制
[?x3x640x640]

修改为:

代码语言:javascript复制
[4x3x640x?]

其中 表示不定长,可以用如下代码:

代码语言:javascript复制
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演示,代码如下:

代码语言:javascript复制
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的地方,当你修改为动态输入的时候有时候会遇到这个错误:

代码语言:javascript复制
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推理

0 人点赞