首页 > 其他分享 >模型部署:pytorch转onnx部署实践(下)

模型部署:pytorch转onnx部署实践(下)

时间:2022-10-10 11:31:07浏览次数:72  
标签:部署 onnx 代码 opencv pytorch 输入 onnxruntime



模型部署:pytorch转onnx部署实践(下)_池化



公众号IDComputerVisionGzq

学习群扫码在主页获取加入方式


模型部署:pytorch转onnx部署实践(下)_目标检测_02

计算机视觉研究院专栏


在深度学习模型部署时,从pytorch转换onnx的过程中,踩了一些坑。本文总结了这些踩坑记录,希望可以帮助其他人。



在上一次分享的时候,我们已经撰写了pth转onnx的过程及一些部署过程,今天我们继续分享整个部署过程遇到的坑及解决办法!

模型部署:pytorch转onnx部署实践(下)_池化_03

(点击上方图片就可以进入《模型部署:pytorch转onnx踩坑实录(上)》)

模型部署:pytorch转onnx部署实践(下)_池化_04

模型部署:pytorch转onnx部署实践(下)_计算机视觉_05

onnxruntime支持3维池化和3维卷积


在上次讲到opencv不支持3维池化,那么onnxruntime是否支持呢?接着编写了一个程序探索onnxruntime对3维池化的支持情况,代码和运行结果如下,可以看到程序报错了。

模型部署:pytorch转onnx部署实践(下)_计算机视觉_06

查看nn.MaxPool3d的说明文档,截图如下,可以看到它的输入和输出是5维张量,于是修改上面的代码,把输入调整到5维张量。

模型部署:pytorch转onnx部署实践(下)_目标检测_07

代码和运行结果如下,可以看到这时候onnxruntime库能正常读取onnx文件,并且它的输出结果跟pytorch的输出结果相等。

模型部署:pytorch转onnx部署实践(下)_池化_08


继续实验,把三维池化改作三维卷积,代码和运行结果如下,可以看到平均差异在小数点后11位,可以忽略不计。

模型部署:pytorch转onnx部署实践(下)_目标检测_09

在上次分享中讲到过opencv不支持3维池化,那时候的输入张量是4维的,如果把输入张量改成5维的,那么opencv是否就能进行3维池化计算呢?

为此,编写代码,验证这个想法。代码和运行结果如下,可以看到在cv2.dnn.blobFromImage这行代码出错了。

模型部署:pytorch转onnx部署实践(下)_计算机视觉_10

查看cv2.dnn.blobFromImage这个函数的说明文档,截图如下,可以看到它的输入image是4维的,这说明它不支持5维的输入。

模型部署:pytorch转onnx部署实践(下)_目标检测_11

经过这一系列的程序实验论证,可以看出onnxruntime库对onnx模型支持的更好。如果深度学习模型有3维池化或3维卷积层,那么在转换到onnx文件后,使用onnxruntime部署深度学习是一个不错的选择。并且,我看到一篇文章里面通过一系列实验,最后得出结论是onnxruntime库的推理速度最快。


模型部署:pytorch转onnx部署实践(下)_池化_04

模型部署:pytorch转onnx部署实践(下)_计算机视觉_05

onnx动态分辨率输入


不过我在做pytorch导出onnx文件时,还发现了一个问题。

在torch.export函数里有一个输入参数dynamic_axes,它表示动态的轴,即可变的维度。假如一个神经网络输入是动态分辨率的,那么需要定义dynamic_axes = {'input': {2: 'height', 3: 'width'}, 'output': {2: 'height', 3: 'width'}},接下来我编写一个程序来验证,代码和运行结果的截图如下:

模型部署:pytorch转onnx部署实践(下)_目标检测_14

可以看到,在生成onnx文件后,使用onnxruntime库读取,对输入blob的高增加10个像素单位,在run这一步出错了。使用opencv读取onnx文件,代码和运行结果的截图如下,可以看到依然出错了。

模型部署:pytorch转onnx部署实践(下)_计算机视觉_15

通过这个程序实验,让人怀疑torch.export函数的输入参数dynamic_axes是否真的支持动态分辨率输入的。

此外,DBNet的官方代码里提供了转换到onnx模型文件,于是我依然编写了一套使用opencv部署DBNet文字检测的程序,依然是包含C++和Python两个版本的代码。官方代码的模型是在ICDAR场景文本检测数据集上训练的,考虑到车牌里也含有文字,我把文章开头展示的汽车图片作为输入,程序检测结果如下,可以看到依然能检测到车牌的4个角点,只是不够准确。如果想要获得准确的角点定位,可以在车牌数据集上训练DBNet。

模型部署:pytorch转onnx部署实践(下)_计算机视觉_16

使用opencv部署DBNet文字检测的程序发布在github上,程序依然是包含c++和python两种版本的实现,地址是:

​https://github.com/hpc203/dbnet-opencv-cpp-python​

后来,在github上传了一套程序,使用BiSeNet做人脸面部解析,里面包含了分别基于pytorch, opencv, onnxruntime三种库的程序实现,并且比较了在调用三种库的输入和输出的差异,结果发现调用 pytorch框架的输出和调用opencv和onnxruntime的输出都不同,而opencv和onnxruntime的输出相同(平均差异在小数点后10位),这又是一个pytorch转onnx时的一个坑。这套程序的地址是:

​https://github.com/hpc203/Face-Parsing-pytorch-opencv-onnxruntime​

模型部署:pytorch转onnx部署实践(下)_计算机视觉_17


© The Ending



计算机视觉研究院主要涉及深度学习领域,主要致力于人脸检测、人脸识别,多目标检测、目标跟踪、图像分割等研究方向。研究院接下来会不断分享最新的论文算法新框架,我们这次改革不同点就是,我们要着重”研究“。之后我们会针对相应领域分享实践过程,让大家真正体会摆脱理论的真实场景,培养爱动手编程爱动脑思考的习惯!

模型部署:pytorch转onnx部署实践(下)_计算机视觉_18

标签:部署,onnx,代码,opencv,pytorch,输入,onnxruntime
From: https://blog.51cto.com/u_15726357/5743055

相关文章

  • 数据守护集群部署(两节点实时主备)
    环境说明实例名PORT_NUMMAL_INST_DW_PORTMAL_HOSTMAL_PORTMAL_DW_PORTGRP1_013214133141192.168.44.1736114152141GRP1_023214233142192.168.44.......
  • sandbox 快速部署mysql
    MySQLSandboxisatoolthatinstallsoneormoreMySQLserverswithinseconds,easily,securely,andwithfullcontrol.Onceinstalled,thesandboxiseasilyus......
  • nginx+uwsgi 部署 django项目
    一、nginx:1.目录结构、常用命令和查杀进程:/usr/sbin/nginx:主程序/etc/nginx:存放配置文件/usr/share/nginx:存放静态文件/var/log/nginx:存放日志2.命令:servicenginxsta......
  • spring boot 工程热部署
    我的idea版本是:IntelliJIDEA2022.2.2(CommunityEdition)Build#IC-222.4167.29,builtonSeptember13,2022Runtimeversion:17.0.4+7-b469.53amd64VM:OpenJD......
  • zabbix监控部署keepalived高可用
    zabbix监控部署keepalived高可用目录一.脑裂1.对付HA系统“裂脑”的对策,目前达成共识的的大概有以下几条:二.脑裂产生的原因2.1一般来说,脑裂的发生,有以下几种原因:三.脑......
  • Docker 安装 Jenkins 并实现项目自动化部署
    Jenkins是一款开源的持续集成(DI)工具,广泛用于项目开发,能提供自动构建,测试,部署等功能。作为领先的开源自动化服务器,Jenkins提供了数百个插件来支持构建、部署和自动化任何......
  • @mysql 使用配置及多实例部署
    文章目录​​一、mysqld服务程序构成​​​​1.连接层​​​​2.SQL层​​​​3.存储引擎层​​​​二、mysql的多实例​​​​1.创建多个数据目录​​​​2.准备多个配置文......
  • @Splunk部署及数据监视使用|数据可视化展示
    文章目录​​1.splunk概述​​​​2.splunk的特点​​​​3.splunk安装​​​​4.Web使用splunk​​​​5.Splunk数据文件监控​​​​6.Splunk的服务器节点监视​​​​7.S......
  • @zabbix5.4部署安装(zabbix+grafana)
    文章目录​​zabbix部署安装​​​​1.系统环境优化​​​​2.配置安装源​​​​3.安装zabbix​​​​4.数据库初始化​​​​5.zabbix数据表格式导入​​​​6.zabbix配置......
  • 基于harbor的工程部署
    1.jenkins通知服务器去harbor拉取镜像,之前需要在服务器上确认以下信息。  2.在部署工程的服务器上编写shellharbor_addr=$1harbor_repo=$2project=$3version=$......