0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何将Pytorch自训练模型变成OpenVINO IR模型形式

SDNLAB 来源:英特尔物联网 2023-06-07 09:31 次阅读

简 介


本文章将依次介绍如何将Pytorch自训练模型经过一系列变换变成OpenVINO IR模型形式,而后使用OpenVINO Python API 对IR模型进行推理,并将推理结果通过OpenCV API显示在实时画面上。

本文Python程序的开发环境是Ubuntu20.04 LTS + PyCharm,硬件平台是AIxBoard爱克斯板开发者套件。

本文项目背景:针对2023第十一届全国大学生光电设计竞赛赛题2“迷宫寻宝”光电智能小车题目。基于该赛项宝藏样式,我通过深度学习训练出能分类四种不同颜色不同标记形状骨牌的模型,骨牌样式详见图1.1。

13bd2a62-0486-11ee-90ce-dac502259ad0.png

| 图1.1 四种骨牌类型

Pytorch pth模型转换成OpenVINO IR模型

Pytorch是一个基于Torch的开源Python学习库,是一个以Python优先的深度学习框架。Pth模型文件是Pytorch进行模型保存时的一种模型格式,OpenVINO暂不支持直接对Pth模型文件进行推理,所以我们要将Pth格式的模型先转换成ONNX格式文件,再通过OpenVINO自带的Model Optimizer(模型优化器)进一步转变成OpenVINO IR模型。处理过程如下所示:

通过Pytorch将Pth模型转换成ONNX模型

转换后的文件(Pth —> ONNX):

import torch.onnx

# SZTU LIXROBO 23.5.14 #

#******************************************#

# 1. 模型加载

model = torch.load('Domino_best.pth', map_location=torch.device('cpu'))

# 2. 设置模型为评估模式而非训练模式

model.eval()

# 3. 生成随机从标准正态分布抽取的张量

dummy_input = torch.randn(1,3,224,224,device='cpu')

# 4. 导出ONNX模型(保存训练参数权重)

torch.onnx.export(model,dummy_input,"Domino_best.onnx",export_params=True)

13e5b982-0486-11ee-90ce-dac502259ad0.png

通过终端来将ONNX模型转化成OpenVINO IR模型格式

在终端中输入(Terminal):

mo --input_model Domino_best.onnx --compress_to_fp16

# mo 启动OpenVINO 的Model Optimizer(模型优化器) # input_model 输入您转换的ONNX模型内容根的路径 # compress _to_fp16 将模型输出精度变为FP16 等后一会,终端输出:

13f02caa-0486-11ee-90ce-dac502259ad0.png  

代表ONNX模型转换成OpenVINO IR模型成功。这里的信息告诉我们该Model是IR 11的形式,并分别保存在.xml和.bin文件下。

转换后的文件(ONNX —> IR 11):

140620dc-0486-11ee-90ce-dac502259ad0.png  

mapping文件是一些转换信息,暂时不会用到该文件。

至此,我们模型转换的全部工作已经完成,接下来就是运用OpenVINO Runtime对IR 11模型进行推理。

使用OpenVINO Runtime对IR 11模型进行推理

在这一章节里我们将在Pycharm中使用OpenVINO Runtime对我们在1.2章中转换得来的IR 11模型进行推理,并将推理结果实时展现在摄像头画面中。

在开始之前,我们不妨了解推理程序的整个工作流程:

导入必要的功能库(如openvino.runtime 以及 cv2和numpy)

探测硬件平台所能使用的可搭载设备

创建核心对象以及加载模型和标签

输入图像进行预处理,正则化,转变成网络输入形状

将处理后的图像交由推理程序进行推理,得到推理结果和处理时间并显示出来

导入功能包

import openvino.runtime as ov

import numpy as np

import cv2

import time

这里一共导入4个功能包:

1. openvino.runtime 这是openvino runtime推理的主要功能包,也可用openvino.inference_engine进行推理,过程大体是一致的。

2.numpy 这是常用的一个Python开源科学计算库

3.cv2 也即OpenCV,用来处理有关图像的一些信息

4.time 记录系统运行时间

设备检测以及模型载入

我们可以使用Core对象中的available_devices函数来获取当前硬件平台可供推理引擎使用的设备。

core = ov.Core()

print(core.available_devices)

如图所示我们能得到在AlxBoard爱克斯开发板上可供我们使用的推理设备有CPU和GPU

14220dba-0486-11ee-90ce-dac502259ad0.png  

将模型进行载入:

# SZTU LIXROBO 23.5.19 #

#************************************#

# 1. 创建核心对象

core = ov.Core()

# 2. 规定IR 11模型的模型文件和权重文件

model = "Domino_best.xml"

weights = "Domino_best.bin"

# 3. 将模型文件和权重文件进行读取

model_ir = core.read_model(model= model,weights=weights)

# 4. 把模型加载到设备上

(此处使用HETERO插件进行异构,加载到GPU和CPU上)

com_model_ir= core.compile_model(model=model_ir,device_name="HETERO:GPU,CPU")

# 5. 获取模型输出层

output_layer_ir = com_model_ir.outputs[0]

# 6. 由于是简单模型,故label手动注入,也可使用导入标签文件等其他方式

label = ['BlueFake','BlueTrue','RedFake','RedTrue']

图像预处理

得到的图像我们需要做一些预先处理才能输入到推理引擎中进行推理并得到结果。这一小节我们将展示如何把图像进行处理。

#************************************#

# 图像预处理、归一化 #

def normalize(img: np.ndarray) ->np.ndarray:

# 1. 类型转换成np.float32

img = img.astype(np.float32)

# 2. 设置常用均值和标准差来正则化

mean =(0.485,0.456,0.406)

std =(0.299,0.224,0.255)

img /=255.0

img -=mean

img /=std

# 3. 返回处理后的img

return img

#************************************#

# 图像处理函数 #

def img_pre(img):

# 1. 对OV输入图像颜色模型从BGR转变成RGB

img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

# 2. 对图像进行裁切

res_img = cv2.resize(img, (224, 224))

# 3. 使用我们定义的预处理函数对图像进行处理

nor_img = normalize(res_img)

# 4. 将处理好的图像转变为网络输入形状

nor_input_img = np.expand_dims(np.transpose(nor_img, (2, 0, 1)), 0)

# 5. 返回处理结果

return nor_input_img

推理过程以及结果展示

在上一节中我们把输入图像所要进行的预处理图像进行了一个定义,在这一小节则是OpenVINO Runtime推理程序的核心。

#************************************#

# 推理主程序 #

def image_infer(img):

# 1. 设置记录起始时间

start_time = time.time()

# 2. 将图像进行处理

imgb = img_pre(img)

# 3. 输入图像进行推理,得到推理结果

res_ir = com_model_ir([imgb])[output_layer_ir]

# 4. 对结果进行归一化处理,使用Sigmod归一

Confidence_Level = 1/(1+np.exp(-res_ir[0]))

# 5. 将结果进行从小到大的排序,便于我们获取置信度最高的类别

result_mask_ir = np.squeeze(np.argsort(res_ir, axis=1)).astype(np.uint8)

# 6. 用CV2的putText方法将置信度最高对应的label以及其置信度绘制在图像上

img = cv2.putText(img,str(label[result_mask_ir[3]])+' '+ str(Confidence_Level[result_mask_ir[3]]),(50,80), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2,cv2.LINE_AA)

# 7. 记录推理结束时间

end_time = time.time()

# 8. 计算出摄像头运行帧数

FPS = 1 / (end_time - start_time)

# 9. 将帧数绘制在图像上

img = cv2.putText(img, 'FPS ' + str(int(FPS)), (50, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2,cv2.LINE_AA)

# 10. 返回图像

return img

以上推理函数编写已经完成。以下是运行主程序:

#********************主程序***********************#

# 1. 获取摄像头

cap = cv2.VideoCapture(0)

# 2. 循环判断

while 1:

# 1. 获得实时画面

success,frame = cap.read()

# 2. 把实时画面交由推理函数进行推理

frame = image_infer(frame)

# 3. 将画面显示在窗口

cv2.imshow("img",frame)

cv2.waitKey(1)

当我们运行该程序时,会得到如下画面。

14308dea-0486-11ee-90ce-dac502259ad0.png143e7b1c-0486-11ee-90ce-dac502259ad0.png

如图所示,我们的Pytorch模型成功在OpenVINO的优化以及推理下成功部署在AlxBoard爱克斯开发板,帧数在40-60之间,推理的结果非常好,很稳定。

与Pytorch模型 CPU推理进行比较

原先推理的过程我们是通过torch功能库进行推理,我们将两者进行比较。

143e7b1c-0486-11ee-90ce-dac502259ad0.png14833f4a-0486-11ee-90ce-dac502259ad0.png

| 左为OpenVINO优化推理,右为torch推理

如图所示OpenVINO优化推理过后的结果从实际帧数上看大约有5-8倍的提升,推理精度也有少许加强。

结 论

自训练Pytorch模型在通过OpenVINO Model Optimizer 模型优化后用OpenVINO Runtime进行推理,推理过程简单清晰。推理仅需几个核心函数便可实现基于自训练Pytorch模型的转化以及推理程序。OpenVINO简单易上手,提供了强大的资料库供学者查阅,其包含了从模型建立到模型推理的全过程。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40802
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83486
  • Ubuntu系统
    +关注

    关注

    0

    文章

    84

    浏览量

    3790
  • pytorch
    +关注

    关注

    2

    文章

    764

    浏览量

    12840

原文标题:自训练Pytorch模型使用OpenVINO优化并部署在AIxBoard™

文章出处:【微信号:SDNLAB,微信公众号:SDNLAB】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Pytorch模型训练实用PDF教程【中文】

    模型部分?还是优化器?只有这样不断的通过可视化诊断你的模型,不断的对症下药,才能训练出一个较满意的模型。本教程内容及结构:本教程内容主要为在 Py
    发表于 12-21 09:18

    pytorch模型转化为onxx模型的步骤有哪些

    首先pytorch模型要先转化为onxx模型,然后从onxx模型转化为rknn模型直接转化会出现如下问题,环境都是正确的,论坛询问后也没给出
    发表于 05-09 16:36

    怎样使用PyTorch Hub去加载YOLOv5模型

    使用 PyTorch Hub 加载自定义 20 类VOC训练的YOLOv5s 模型'best.pt'。TensorRT、ONNX 和 OpenVINO
    发表于 07-22 16:02

    通过Cortex来非常方便的部署PyTorch模型

    的工作。那么,问题是如何将 RoBERTa 部署为一个 JSON API,而不需要手动滚动所有这些自定义基础设施? PyTorch 模型与 Cortex 一起投入生产你可以使用 Co
    发表于 11-01 15:25

    Pytorch模型转换为DeepViewRT模型时出错怎么解决?

    我最终可以在 i.MX 8M Plus 处理器上部署 .rtm 模型。 我遵循了 本指南,我 Pytorch 模型转换为 ONNX 模型
    发表于 06-09 06:42

    ONNX模型转换为中间表示(IR)后,精度下降了怎么解决?

    ONNX 模型转换为 IR。 与使用 PyTorch 运行 ONNX 模型相比,Ran IR
    发表于 08-15 08:28

    如何将PyTorch模型OpenVINO trade结合使用?

    无法确定如何转换 PyTorch 掩码 R-CNN 模型以配合OpenVINO™使用。
    发表于 08-15 07:04

    无法使用MYRIAD在OpenVINO trade中运行YOLOv7自定义模型怎么解决?

    无法确定如何将 YOLOv7 模型的重量(.pt 文件)转换为OpenVINO™中间表示 (IR) 并推断有 MYRIAD 的 IR
    发表于 08-15 08:29

    如何将Detectron2和Layout-LM模型转换为OpenVINO中间表示(IR)和使用CPU插件进行推断?

    无法确定如何将 Detectron2* 和 Layout-LM* 模型转换为OpenVINO™中间表示 (IR) 和使用 CPU 插件进行推断。
    发表于 08-15 06:23

    pytorch模型转换需要注意的事项有哪些?

    和记录张量上的操作,不会记录任何控制流操作。 为什么不能是GPU模型? 答:BMNETP的编译过程不支持。 如何将GPU模型转成CPU模型? 答:在加载
    发表于 09-18 08:05

    使用OpenVINO™ 部署PaddleSeg模型库中的DeepLabV3+模型

          01 概述     本文是OpenVINO 工具套件与百度飞桨PaddlePaddle模型转换/部署系列的第二部。这篇文章专注于展示如何将百度飞桨PaddelSeg项目
    的头像 发表于 11-22 14:58 9067次阅读
    使用<b class='flag-5'>OpenVINO</b>™ 部署PaddleSeg<b class='flag-5'>模型</b>库中的DeepLabV3+<b class='flag-5'>模型</b>

    OpenVINO模型优化实测:PC/NB当AI辨识引擎没问题!

    这次我们将会自制一个CNN分类器,并透过OpenVINO模型转换程序转换成IR模型,并进行模型效能与正确率分析。依据Intel官方网站的说
    的头像 发表于 12-09 16:13 1684次阅读

    训练Pytorch模型使用OpenVINO™优化并部署在AI爱克斯开发板

    本文章将依次介绍如何将 Pytorch训练模型经过一系列变换变成 OpenVINO
    的头像 发表于 05-26 10:23 636次阅读
    自<b class='flag-5'>训练</b><b class='flag-5'>Pytorch</b><b class='flag-5'>模型</b>使用<b class='flag-5'>OpenVINO</b>™优化并部署在AI爱克斯开发板

    没有“中间商赚差价”, OpenVINO™ 直接支持 PyTorch 模型对象

    随着 OpenVINO 2023.0 版本的发布,OpenVINO 工具库中预置了全新的 PyTorch 前端,为开发者们提供了一条全新的 PyTorch
    的头像 发表于 06-27 16:39 428次阅读
    没有“中间商赚差价”, <b class='flag-5'>OpenVINO</b>™ 直接支持 <b class='flag-5'>PyTorch</b> <b class='flag-5'>模型</b>对象

    使用OpenVINO优化并部署训练好的YOLOv7模型

    在《英特尔锐炫 显卡+ oneAPI 和 OpenVINO 实现英特尔 视频 AI 计算盒训推一体-上篇》一文中,我们详细介绍基于英特尔 独立显卡搭建 YOLOv7 模型训练环境,并完成了 YOLOv7
    的头像 发表于 08-25 11:08 938次阅读
    使用<b class='flag-5'>OpenVINO</b>优化并部署<b class='flag-5'>训练</b>好的YOLOv7<b class='flag-5'>模型</b>