要对模型进行推理,首先需要通过调用 ExecutableNetwork 的方法 create_infer_request()
来创建推理请求,我们使用 compile_model()
加载了 exec_net
。 然后我们必须调用 infer()
,作为 _InferRequest_
的方法,需要一个参数:inputs。 这是一个字典,将输入层名称映射到输入数据。
- 步骤1:导入模型。我们通过
ie.read_model
来读取模型,ie.compile_model
来编译模型。 - 步骤2:加载图像并转换为输入形状。要通过网络传播图像,需要将其加载到数组中,调整为网络期望的形状,并转换为网络的输入布局格式。比如在这个案例,图像的形状为 (663,994,3)。 它的高度为 663 像素,宽度为 994 像素,并具有 3 个颜色通道。 我们得到网络期望的高度和宽度的参考,并将图像调整为该大小。最后,我们将图像尺寸更改为 N、C、H、W 格式(其中 N=1),首先调用
np.transpose()
更改为 C、H、W,然后通过调用 np.expand_dims() 添加 N 维
。 使用 np.astype()
将数据转换为 FP32。 - 步骤3:模型推理。我们可以通过使用
compiled_model([input_data])[output_layer]
直接得到推理的结果。或者我们还可以创建 InferRequest
并根据请求运行 infer
方法。输出result
的形状为 (1,1001),这和output_layer
的尺寸是一致的。此输出形状表明网络返回1001个类别的概率。最后,我们需要通过argmax找到对应的类。
from openvino.runtime import Core
import cv2
import numpy as np
print("1 load network")
ie = Core()
classification_model_xml = "model/classification.xml"
model = ie.read_model(model=classification_model_xml)
compiled_model = ie.compile_model(model=model, device_name="CPU")
input_layer = compiled_model.input(0)
output_layer = compiled_model.output(0)
print("- model input: {}".format(input_layer))
print("- model output: {}".format(output_layer))
print("2 load image")
image_filename = "data/coco_hollywood.jpg"
image = cv2.imread(image_filename)
print("- input image shape: {}".format(image.shape))
N, C, H, W = input_layer.shape
resized_image = cv2.resize(src=image, dsize=(W, H))
print("- resize image into shape: {}".format(resized_image.shape))
input_data = np.expand_dims(np.transpose(resized_image, (2, 0, 1)), 0).astype(np.float32)
print("- align image shape same as network input: {}".format(input_data.shape))
print("3 inference")
result = compiled_model([input_data])[output_layer]
print("- Inference result example, result[0]:{}".format(result[0]))
print("- Inference result shape: {}".format(result.shape))
print("- Inference result[0] shape: {}".format(result[0].shape))
request = compiled_model.create_infer_request()
request.infer(inputs={input_layer.any_name: input_data})
result = request.get_output_tensor(output_layer.index).data
result_index = np.argmax(result)
print("- Inference result is classified as class index: {}".format(result_index))
imagenet_classes = open("utils/imagenet_2012.txt").read().splitlines()
imagenet_classes = ['background'] + imagenet_classes
print("- Inference result is classified as class: {}".format(imagenet_classes[result_index]))
运行后的结果:
1 load network
- model input: <ConstOutput: names[input:0, input] shape{1,3,224,224} type: f32>
- model output: <ConstOutput: names[MobilenetV3/Predictions/Softmax] shape{1,1001} type: f32>
2 load image
- input image shape: (663, 994, 3)
- resize image into shape: (224, 224, 3)
- align image shape same as network input: (1, 3, 224, 224)
3 inference
- Inference result example, result[0]:[1.9758532e-04 5.8727856e-05 6.4592139e-05 ... 4.0716583e-05 1.7331535e-04
1.3031592e-04]
- Inference result shape: (1, 1001)
- Inference result[0] shape: (1001,)
- Inference result is classified as class index: 198
- Inference result is classified as class: n02097130 giant schnauzer
OpenVINO™ 开源工具包教程
openvinoopenvino: 是Intel开发的一个开源工具包,用于优化和部署AI推理,支持多种硬件平台。项目地址:https://gitcode.com/gh_mirrors/op/openvino 项目介绍
OpenVINO™ 是一个开源工具包,旨在优化和部署AI推理。它支持多种硬件平台,包括x86、ARM、GPU(支持OpenCL的集成和独立GPU...
C:\Intel\openvino_2021.3.394\opencv\include
C:\Intel\openvino_2021.3.394\opencv\include\opencv2
C:\Intel\openvino_2021.3.3
使用Resnet-50进行图片分类1 说明2 实验目的3 任务内容4 实验原理一、ResNet-50结构介绍二、SqueezeNet1.1与ResNet-50比较5 操作步骤6 实验状况
本实验所有代码均在ubuntu 18.04 + OpenVINO 2020R3.LTS installed 环境下验证通过,若需要代码移植,请务必检查环境配置是否与本实验环境相同。
2 实验目的
1、了解Resnet-50网络模型的特点。
2、掌握Resnet-50网络模型的使用方法。
3 任务内容
1、使用模型
在pycharm中使用openvino包,不能直接使用图标启动,要使用终端启动。如果不知道pycharm的启动文件在哪,可以通过以下指令查找:
sudo find / -name pycharm.sh
找到后进入pycharm.sh所在文件夹,执行该启动脚本:
./pycharm.sh
将onnx模型转成IR格式(FP16除了模型小一点,没任何提速):
python mo.py --input_model ~/my_project/resnet34.onnx --output_dir ~/openvin