当你训练了一个Pytorch的模型或者在某处找到了一个ONNX模型,又需要将其转化为Keras模型或者tensorflow lite进行部署时,可以使用两种方式:

1. ONNX提供的onnx_tf( https://github.com/onnx/onnx-tensorflow )

该种方式具有的优点的是支持的算法更为的丰富,转换成功率更高,不过缺点会出现很多无用的transpose操作导致模型运行速度较慢。

2. github社区的开源项目onnx2tflite( https://github.com/MPolaris/onnx2tflite )

该项目具有以下优点

  • 高一致性。相比于ONNX模型的输出,每一位的平均误差小于1e-5。
  • 更快的运行速度。相比于onnx_tf输出的模型,运行速度快30%。
  • 自动通道变换。能够将NCWH格式的通道变换为tensorflow的NWHC格式。
  • 支持模型量化。继承了tensorflow lite量化工具,支持模型权重量化以及整体uint8量化,模型更小、运行速度更快。
  • 代码更友好。个人认为我的代码逻辑较为清晰,更方便开发者进行更改。

目前该项目以及支持并验证了以下模型

  • SSD
  • UNet
  • HRNet
  • MoveNet
  • YOLO 系列,V3\V4\V5\V6\V7,以及YOLOX均已支持
  • torchvision种所有的分类模型、以及部分分割模型
  • 一些常规的2D卷积神经网络

3. 一个Pytorch模型的转换小例子

# git clone https://github.com/MPolaris/onnx2tflite
# cd onnx2tflite
# pip install -r requirements.txt
import torch
import torchvision
_input = torch.randn(1, 3, 224, 224)
model = torchvision.models.mobilenet_v2(True)
# use default settings is ok
torch.onnx.export(model, _input, './mobilenetV2.onnx', opset_version=11)# or opset_version=13
from converter import onnx_converter
onnx_converter(
    onnx_model_path = "./mobilenetV2.onnx",
    need_simplify = True,
    output_path = "./",
    target_formats = ['tflite'], # or ['keras'], ['keras', 'tflite']
    weight_quant = False,
    int8_model = False,
    int8_mean = None,
    int8_std = None,
    image_root = None

目前onnx2tflite工具还在持续更新,希望大家能够给这个项目一个star,在使用过程中遇到什么问题欢迎提issue和pr。

现在很多算法都是用pytorch框架训练的,但是在移动端部署很多又使用TensorFlow lite,因此需要将pytorch模型转换TensorFlow lite。 将pytorch模型TensorFlow lite的流程是pytorch->onnx->tensorflow->tensorflow lite,本文记录一下踩坑的过程。 1、pytorchonnx 这一步比较简单,使用pytorch自带接口就行。不过有一点需要注意的,就是opset版本,可能会影响后续的转换。 由于pytorch的输入是NCHW,ONNX也是NCHW,再使用onnx-tftflite时,输入也是NCHW,所以在某些需要以NHWC为输入的算子上(如conv),就会在该算子的前后分别多出一个transpose算子(第一个用于NCHW->NHWC,第二个用于NHWC->NCHW),这也是onnx-tf转换的生硬之处,多出的算子会对推理速度有一些影响。导出onnx文件注意下opset version,需要设置为与onnx兼容的版本,理论上是可以向下兼容至7。 .view()在 Pytorch 中,经常会对某个具体的 Tensor 做变换的处理。但在 PyTorch 转换ONNX 的过程中,例如 fea = fea.view(1, -1, 1, 1)ONNX 会错误将 view 的纬度扩张变成 Reshape 节点,如下图所示但是在 Reshape 节点转换Tensorflow 的时候,Reshape 节点就变成了 Where 节点和若干节点的组... 背景:最近在做目标检测,其中用到的yolov5模型,框架是pytorch,由于想要把模型部署到移动端,因此需要模型格式的转换,思路如题目:pt > ONNX > CoreML > tflite 官方GitHub链接ultralytics的yolov5. 转换时遇到了问题,将原始模型文件.pt化为onnx和torchscript都成功了 但化为coreml时失败了,由于各种原因,这是最不能失败的一个,我需要它,失败原因如下 官方的issue里有这个问题,可是并无luan用,经过多方搜 model.ckpt.meta :保存Tensorflow计算图结构,可以理解为神经网络的网络结构 model.ckpt :保存Tensorflow程序中每一个变量的取值,变量是模型中可训练的部分 checkpoint :保存一个目录下所有模型文件列表 .pb 模型文件 pb是protocolbuffer的缩写。TensorFlow训练模型后存成的pb文件,是一种表示模型(神经网络)结构的二进制文件,不带有源代码,也. 一文掌握Pytorch-onnx-tensorrt模型转换pytorchonnx pytorchonnx 对于实际部署的需求,很多时候pytorch是不满足的,所以需要成其他模型格式来加快推理。常用的就是onnxonnx天然支持很多框架模型转换, 如Pytorch,tf,darknet,caffe等。而pytorch也给我们提供了对应的接口,就是torch.onnx.export。下面具体到每一步。 首先,环境和依赖:onnx包,cuda和cudnn,我用的版本号分别是1.7.0, 10.1 参考链接: https://github.com/bermanmaxim/jaccardSegment/blob/master/ckpt_to_dd.py 一. tensorflow模型pytorch模型 import tensorflow as tf import deepdish as dd import argparse import os import numpy as np def ...