前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenVINO2022 Python API详解与演示

OpenVINO2022 Python API详解与演示

作者头像
OpenCV学堂
发布2022-07-26 17:41:27
1.1K0
发布2022-07-26 17:41:27
举报
文章被收录于专栏:贾志刚-OpenCV学堂

点击上方蓝字关注我们

微信公众号: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推理

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档