模型转换工具合集与 pytorch2caffe

文章目录

  • 模型转换工具
  • pytorch2caffe
    • 尝试一(失败)
    • 尝试二(失败)
    • 尝试三(成功)

模型转换工具

github地址: https://github.com/ysh329/deep-learning-model-convertor
模型转换的部分截图如下:
模型转换工具合集与 pytorch2caffe_第1张图片
海思自己的在线转换工具应该是使用了微软的MMdnn(https://github.com/Microsoft/MMdnn)

pytorch2caffe

尝试一(失败)

网上很多人都用的是https://github.com/longcw/pytorch2caffe
可惜pytorch版本要求低于0.4,实在是太老了,模型都加载不起来。
虽然最后失败了,但是我也把大致步骤写出来,给大家一个参考。

1.使用源码安装pytorch0.2 (实在是找不到0.2–CPU版本的安装包)

2.import torch 出现如下问题

ImportError: /usr/local/share/anaconda2/envs/onnx_env/lib/python2.7/site-packages/torch/_C.so: undefined symbol: _ZN3MPI8Datatype4FreeEv

在https://github.com/pytorch/pytorch/issues/2680里搜索,有人说有一个临时的解决办法是LD_PRELOAD=/usr/lib/libmpi_cxx.so python

这时候就需要源码编译 openmpi,编译前记得加上选项--enable-mpi-cxx,这样才会有 libmpi_cxx.so 文件。

最后打开python
LD_PRELOAD=/usr/local/openmpi/lib/libmpi_cxx.so python

加载pytorch
import torch

成功
3.最后加载模型的时候,一部分没办法加载成功。放弃!

尝试二(失败)

思路:pytorch->ONNX->Caffe
pytorch可以方便的转到ONNX(成功)
ONNX模型简化https://github.com/daquexian/onnx-simplifier(成功)
ONNX2Caffehttps://github.com/MTlab/onnx2caffe(失败)

尝试三(成功)

依然是使用pytorch2caffe的工具
https://github.com/woodsgao/pytorch2caffe
https://github.com/xxradon/PytorchToCaffe
安装了pytorch1.0

转换示例代码:

import torch
from torchvision.models import resnet
from pytorch2caffe import pytorch2caffe

name='resnet18'
resnet18=resnet.resnet18()
resnet18.eval()
dummy_input=torch.ones([1,3,224,224])
pytorch2caffe.trans_net(resnet18, dummy_input, name)
pytorch2caffe.save_prototxt('{}.prototxt'.format(name))
pytorch2caffe.save_caffemodel('{}.caffemodel'.format(name))

如果你的模型太大的话,可能需要的内存也特别大

有时候转换不一定很成功,需要手动调整 prototxt,这时候也需要简单调整一下caffemodel
代码如下:

import caffe
import caffe_pb2

AFTER_MODIFY_DEPLOY_NET = "yourpath/after_modify_deploy.prototxt"
BEFORE_MODIFY_CAFFEMODEL = "yourpath/before_modify.caffemodel"
AFTER_MODIFY_CAFFEMODEL = "yourpath/after_modify.caffemodel"

#根据prototxt修改caffemodel
net = caffe.Net(AFTER_MODIFY_DEPLOY_NET, BEFORE_MODIFY_CAFFEMODEL,caffe.TEST)
net.save(AFTER_MODIFY_CAFFEMODEL )


print("加载修改前后的caffemodel")
model = caffe_pb2.NetParameter()
f=open(BEFORE_MODIFY_CAFFEMODEL, 'rb')
model.ParseFromString(f.read())
f.close()
layers_name = [layer.name for layer in model.layers]
print("修改前",layers_name)
model2 = caffe_pb2.NetParameter()
f=open(AFTER_MODIFY_CAFFEMODEL , 'rb')
model2.ParseFromString(f.read())
f.close()
layers2_name = [layer.name for layer in model2.layer]
print("修改后",layers2_name)

实在不行还可以试试手动转换:
https://www.pythonf.cn/read/126990
https://blog.csdn.net/vvnzhang2095/article/details/91439924

你可能感兴趣的:(#,海思NNIE与深度学习,pytorch,caffe,深度学习)