onnx2caffe的一些经验

1 背景

因为上海思的npu,CNN部分需要转换为caffe

2 环境

2.1 onnx转换环境

python:3.6
pytorch:1.4
onnx:1.7

2.2 caffe转换环境

python:2.7
onnx:1.7
caffe:1.0

3 步骤

3.1 pytorch2onnx

转换后用onnx的推理一下,验证转换的onnx是否正确

3.2 onnx瘦身

onnxsimplifier

pip install onnx-simplifier
python -m onnxsim srcXXX.onnx dstXXX.onnx

3.3 onnx2caffe

4 经验

4.1 opset_version=11

torch1.4版本,在torch.onnx.export可以选择opset_version=11,可以解决后面很多问题

// torch.onnx.export
torch.onnx.export(..., opset_version=11)

4.2 model.module

如果torch在训练的时候使用了nn.DataParallel,模型加载的时候也要用nn.DataParallel加载权重,在export的时候使用model.module。否则onnx导出的结果不正确(也有其他的办法处理权重)

model = nn.DataParallel(model)
torch.onnx.export(model.module, ...)

4.3 op:mul在转换时的问题

MT的轮子在onnx2caffe将mul转换为eltwise使用elstwise_param是PROD。在需要给某一层乘以一个固定的数时,这样的转换会报错,找不到其中一个bottom层,mul在转换的时候会将固定的数转换为一个layer(下面修改前中的 bottom: “135”)
注意:后面的解决办法只是在遇到这个问题的时候使用,不具有普遍适用性

4.3.1 解决方法:将mul层手动修改为Scale层

修改前

layer {
  name: "136"
  type: "Eltwise"
  bottom: "134"
  bottom: "135"
  top: "136"
  eltwise_param {
    operation: PROD
  }
}

修改后

layer {
  name: "136"
  type: "Scale"
  bottom: "134"
  top: "136"
  param {
    lr_mult: 0
  }
  scale_param {
    filler {
      type: "constant"
      value: 0.1
    }
  }
}
4.3.2 解决方法: 修改MT的轮子(TODO)

1.将mul的转换增加一个分支专门处理Scale的情况

_ONNX_NODE_REGISTRY = {
    ...
    "Mul": _convert_Mul
    ...
    }    

2.应该是可以参照BatchNorm的scale层处理

4.4 op:Sub在转换时的问题

4.4.1 解决方法1:增加和Add相同的Sub层,手动修改参数

_weightloader.py和_operators.py

_ONNX_NODE_REGISTRY = {
    ...
    "Add": _convert_Add,
    "Sub": _convert_Add,
    ...
    }

*.prototxt(转换后的caffetxt)
修改前

layer {
  name: "128"
  type: "Eltwise"
  bottom: "124"
  bottom: "127"
  top: "128"
  eltwise_param {
    operation: SUM
  }
}

修改后

layer {
  name: "128"
  type: "Eltwise"
  bottom: "124"
  bottom: "127"
  top: "128"
  eltwise_param {
    operation: SUM
    coeff: 1
    coeff: -1
  }
}
4.4.2 解决方法2:修改MT的轮子(TODO)

增加Sub层的处理函数

_ONNX_NODE_REGISTRY = {
    ...
    "Sub": _convert_Sub
    ...
    }

4.5 op:Squeeze在转换时的问题

Squeeze没有参数,可以在训练代码直接去掉该op(仅限op是CNN的最后一层,中间层当然不能去掉)

4.6 onnx瘦身

onnxsimplifier非常重要

pip install onnx-simplifier
python -m onnxsim org.onnx org_sim.onnx 

5 TODO

5.1 pytorch2caffe
直接转换,github上有轮子
5.2 caffe修改的时候还有更简单的方法

TODO的问题没时间整(万恶的美帝限制了菊花,把海思搞的风雨飘摇,要备货其他的npu了,有空再搞这个,或者 pr给MT)

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
安装onnx2caffe可以按照以下步骤进行操作。首先,确保你已经安装了cuda和cudnn,并按照Readme上的方法安装了yolov5_caffe。然后,你可以使用开源提供的方法来安装caffe环境以及onnx转caffe的脚本\[1\]。你可以通过以下步骤来完成安装: 1. 编译caffe:使用以下命令编译caffe: ``` make -j8 make pycaffe -j8 ``` 2. 下载onnx2caffe的轮子:你可以从https://github.com/Wulingtian/yolov5_onnx2caffe 下载onnx2caffe的轮子。这个版本是针对yolov5改过的,支持upsample和transpose的转换\[2\]。 3. 安装onnxsimplifier:使用以下命令安装onnxsimplifier: ``` pip install onnx-simplifier ``` 4. 运行onnx2caffe转换脚本:使用以下命令运行onnx2caffe转换脚本: ``` python -m onnx2caffe srcXXX.onnx dstXXX.onnx ``` 在转换过程中,如果遇到不支持的类型或报错,你可以根据具体情况进行修改和添加。通常报错是由于类型不支持或者pytorch的函数参数与caffe不一致导致的,你可以根据报错信息进行相应的修改\[2\]。 希望这些步骤对你有帮助! #### 引用[.reference_title] - *1* [onnx转caffe环境搭建及转换](https://blog.csdn.net/u010497704/article/details/125327929)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [yolov5:onnx2caffe](https://blog.csdn.net/qq_37516798/article/details/122611039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [onnx2caffe的一些经验](https://blog.csdn.net/Ray_Tang_/article/details/111880353)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值