【OpenVINO+paddle】覆盖300多种飞桨算法-PPHub+PP2ONNX+IR部署三步走

这篇博客我提供了一个全新的openvino部署思路,并且通过这个思路您可以直接调用300多种飞桨算法系统地了解他们,并在在openvino的部署。同时您还可以部署的算子有哪些可以用的哪些是不能用的。
在这篇博客中我将演示从以mobilenet_v3_large_imagenet_ssld这个例子来演示如何部署。
所有代码和资源都挂载到aistudio的平台上,您可以直接打开下面的链接直接运行:
https://aistudio.baidu.com/aistudio/projectdetail/3596186?contributionType=1

注意:这篇博客主要是在python和jupyter notebook下的运行的。
参考:Raymond Lo的demo(博士、英特尔智慧边缘软件布道者)

当然先阶段来说只能通过这种麻烦的多步转化的方法,在3月15日OpenVINO发布的新版本中可以直接将飞桨模型进行转化,大部分模型哦度不需要进行转化了。

paddle-Hub

为什么说覆盖300多种算法呢?这就要先介绍一下paddle-Hub。
这是飞桨直接提供训练好模型的模块,总的来说有三个功能:
1、您可以直接下载调用这个模型
2、您可以下载这个模型的权重
3、您可以通过服务器调用模型

我们可以通过这个模块直接下载飞桨训练好的模型,大部分的模型都是可以下载训练好的冻结模型来使用,然后我们将会使用这些冻结模型进行
后面我们的模型转化。
这个是paddle-Hub的链接:
https://www.paddlepaddle.org.cn/hublist
下面是模型页面

您可以直接点开任意一个模型,如果您之前没有安装过这个模型,可以根据指导安装一下,后面我也会提供安装的代码。

关于API的调用这里我就不多说了,感兴趣的朋友可以直接根据我提供的链接深入了解,这里我只讲解怎么下载冻结模型,这是一个很简单的语句,就下面这句话,您在自己的电脑里面输入您想要下载模型的全程,规定好下载的名字即可,这个我会在下面的代码中演示,只需要简单了解就行。


参数
dirname: 存在模型的目录名称
model_filename: 模型文件名称,默认为__model__
params_filename: 参数文件名称,默认为__params__(仅当combined为True时生效)
combined: 是否将参数保存到统一的一个文件中

paddle2ONNX

这里我们需要做的工作是将我们下载好的动态模型导出ONNX,想要更加深入了解导出细节可以参考我的这篇文章,等会我直接在代码中讲解:
https://aistudio.baidu.com/aistudio/projectdetail/3459413?contributionType=1

静态模型的导出也不难,只需要下面这段代码,等会详细讲:

!paddle2onnx \--model_dir u2netp \--model_filename __model__ \--params_filename __params__ \--save_file u2netp_static.onnx \--opset_version 12

ONNX转IR

这里我们只能使用OpenVINO的转化模块了,这里后面代码中演示了,难度也不大,只需要几句代码就可以的。

实操代码部分

首先毫无疑问需要引入我们所需要的库,这里的环境配置已经默认已经配置好了,如果没有配置好的朋友可以参考我的这一篇博客

import os, os.path
import sys
import json
import urllib.request
import cv2
import numpy as np
import time
from pathlib import Path
import torch
from fastseg import MobileV3Large
from IPython.display import Markdown, display
from scipy.special import softmax
from openvino.inference_engine import IENetwork, IECore, ExecutableNetwork
from IPython.display import Image

第二步是要安装好paddlehub等会我们需要用他下载模型

! pip install xlrd==1.2.0
! pip install --upgrade paddlehub

引入了paddle hub,您可以尝试通过输入模型到name=“模型”,只要这个模型是可以在hub上找到的并且已经上传了就可以下载他们的静态模型pdmodel、pdiparams。

import paddlehub as hubmodel = hub.Module(name="mobilenet_v3_large_imagenet_ssld")
model.save_inference_model(dirname="paddlehub_model1/", model_filename="paddlehub_model1/inference.pdmodel", params_filename="paddlehub_model1/inference.pdiparams")
image_classes = model.label_list

这是我下载的一个人体骨骼模型

这里如果您已经根据我的上篇博客配置好环境了,就可以直接使用,如果没有就需要使用pip install paddle2onnx 安装好库,这里就是输入需要转化的模型名称和对应的文件夹,然后输出模型的onnx的名称就可以开始转化。

! paddle2onnx --model_dir paddlehub_model1/ \--model_filename inference.pdmodel \--params_filename inference.pdiparams \--save_file model.onnx \--opset_version 11

这是转化成功后的结果

这里我们定义两个自定义的函数来帮助我们处理图像,第一个函数如您所见,是用来读取图像并处理成RGB图像,第二个是因为这里模型的原因,我们引入一层softmax来处理结果的。如果您使用的是其他则不必在意这段


def image_preprocess_mobilenetv3(img_path):img = cv2.imread(img_path)img = cv2.resize(img, (224,224), interpolation=cv2.INTER_LANCZOS4)img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img = np.transpose(img, [2,0,1]) / 255img = np.expand_dims(img, 0)img_mean = np.array([0.485, 0.456,0.406]).reshape((3,1,1))img_std = np.array([0.229, 0.224, 0.225]).reshape((3,1,1))img -= img_meanimg /= img_stdreturn img.astype(np.float32)def top_k(result, image_classes, topk=5):softmax_result = softmax(result)top_indices = np.argsort(-softmax_result)[:topk]#print(top_indices)top_softmax = softmax_result[top_indices]for index, softmax_probability in zip(top_indices, top_softmax):print(f"Class Name: {image_classes[index]}, Probability: {softmax_probability:.5f}")
IMAGE_WIDTH = 1024  # 建议图形的宽度是: 2048, 1024 or 512.
# 按照正方形的变长来设置
IMAGE_HEIGHT = 1024 if IMAGE_WIDTH == 2048 else 512
# 这里执行的将我们的onnx模型转化成为IR模型的树枝定义,您需要提前定义好相关的配置参数
mo_command = f"""mo--input_model "model.onnx"--input_shape "[1,3, {IMAGE_HEIGHT}, {IMAGE_WIDTH}]"--mean_values="[123.675, 116.28 , 103.53]"--scale_values="[58.395, 57.12 , 57.375]"--data_type FP16--output_dir "model/""""
mo_command = " ".join(mo_command.split())
print("Model Optimizer command to convert the ONNX model to OpenVINO:")
display(Markdown(f"`{mo_command}`"))

开始转化

    print("Exporting ONNX model to IR... This may take a few minutes.")mo_result = %sx $mo_commandprint("\n".join(mo_result))
ie = IECore()
net = ie.read_network(model="model/model.xml")
#MobileNetV3_large_x1_0filename = "1.jpeg"
test_image = image_preprocess_mobilenetv3(filename) # Pdmodel可能是动态模型,这将根据输入进行重塑
input_key = list(net.input_info.items())[0][0] # 'inputs'
net.reshape({input_key: test_image.shape})#l将模型加载到CPU
exec_net = ie.load_network(net, 'CPU')
assert isinstance(exec_net, ExecutableNetwork)#执行推理步骤
output = exec_net.infer({input_key: test_image})
result_ie = list(output.values())[0][0]#展示图形分类的最有可能的五个种类。top_k(result_ie, image_classes)
Image(filename=filename) 

识别的图片是一张火柴,这是结果

【OpenVINO+paddle】覆盖300多种飞桨算法-PPHub+PP2ONNX+IR部署三步走相关推荐

  1. 搞定面试算法系列 | 分治算法三步走

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 江子抑 转自 | 编程拯救世界 主要思想 分治算法,即分而治之:把一个复杂问题分成两个或更多的相同或相似子问题,直到最后子问题可以简 ...

  2. 经典运动估计算法之全搜索、三步搜索、四步搜索、菱形搜索

    全搜索算法 三步搜索算法 四步搜索算法 菱形搜索算法 由于搜索方法的不同,因此有多种运动估计算法,较为经典的运动估计搜索算法有全搜索法.三步搜索法.菱形搜索法以及四步搜索法等等.以下是几种运动估计搜索 ...

  3. 百度地图和百度飞桨招聘CV算法实习生

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 百度地图和百度飞桨招聘CV算法实习生 部门一:百度地图数据引擎部-计算机视觉算法实习生 [工作职责] 1.  ...

  4. 基于飞桨与OpenVINO 的智能机器人开发实践 | 开发者实战

    谈到机器人,我们首先要知道什么是机器人 这是从百度百科截取的我国科学家对于机器人的定义 机器人是一种自动化的机器,这种机器人具备一些人或生物相似的智能能力,如感知能力.规划能力.动作能力.协同能力.是 ...

  5. 为技术而聚,为AI而战,飞桨黑客马拉松第三期圆满收官!

    2022年7月4日PaddlePaddle Hackathon飞桨黑客马拉松(以下简称为"飞桨黑客松")第三期正式上线,开发者热情响应,历经三个月完美收官! 本期飞桨黑客松依然是码 ...

  6. 5分钟“调教”一只机器狗,百度飞桨已经简单到这地步了吗?

    金磊 梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI "调教"一只机器狗学会新技能需要多长时间? 仅需5分钟. 一个往左走的手势,它就乖乖地向左挪了挪:一个" ...

  7. 百度开源深度学习平台飞桨的核心技术及应用

    分享嘉宾:蓝翔 百度 资深研发工程师 编辑整理:张兰兰 人民银行 出品平台:DataFunTalk 导读:近期,DataFunSummit AI基础软件架构峰会以线上形式成功召开,其中深度学习框架论坛 ...

  8. 揭晓飞桨平台提速秘诀:INT8量化加速实现“事半功倍”

    为帮助广大企业和开发者更加便捷和快速地创建深度学习应用,百度飞桨正不断地提升平台的训练和推理能力,并与英特尔紧密合作,在至强® 平台集成的AI加速能力的支持下,以 INT8 量化方案,在不影响预测准确 ...

  9. 性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库

    允中 发自 凹非寺 量子位 编辑 | 公众号 QbitAI 假如问在深度学习实践中,最难的部分是什么?猜测80%的开发者都会说: "当然是调参啊." 为什么难呢?因为调参就像厨师根 ...

最新文章

  1. aws 堆栈模板_使用Arquillian和LocalStack脱机测试AWS云堆栈
  2. 多任务实现-协程(python 版)
  3. Android Audio代码分析2 - 函数getMinBufferSize
  4. botnet的追踪和追寻专题
  5. 【廖雪峰官方网站/Java教程】函数式编程
  6. WLAN射频、信道与帧分类
  7. 运动会管理系统java
  8. Neo4j的下载与安装
  9. c# 非阻塞算法_c# – 了解非阻塞线程同步和Thread.MemoryBarrier
  10. 神经网络学习小记录63——Keras 图像处理中注意力机制的代码详解与应用
  11. AndroidStudio:The number of method references in a .dex file cannot exceed 64K错误
  12. 数据库加密sqlite3
  13. ManyPixels 插画素材分享
  14. 我的世界java甘蔗机_萌新如何建造我的世界自动化甘蔗收割机攻略
  15. 资本寒冬,看咕咚、Keep、Feel们如何逆势而上
  16. 已解决:‘ascii‘ codec can‘t encode characters in position 18-20: ordinal not in range(128)
  17. 【IDEA】如何用IDEA测试接口
  18. vscode 中C++运行编译运行多文件问题总结
  19. 异或和同或运算之间的等价关系
  20. 2006年IT技术盘点及IT黑镜头

热门文章

  1. 如何实现css的页面背景图片透明化而不影响文字内容
  2. 上市公司章程设置反收购条款研究
  3. javatype与oftype的区别
  4. 2021-08-18 MessageBox的用法总结
  5. 南卡和索尼蓝牙耳机哪个好?两款高性价比音质蓝牙耳机对比测评
  6. 嵌入式开发人才的未来发展方向
  7. 虚拟化之路一:虚拟化概述
  8. 3970: 别动我,wa到你怀疑人生
  9. 2008升级到2012
  10. 新授粉方式的花授粉算法-附代码