未验证 提交 7412ed25 编写于 作者: S SunAhong1993 提交者: GitHub

Create add_caffe_custom_layer.py

上级 8bfd436e
## 如何转换Caffe自定义Layer
本文档介绍如何将Caffe自定义Layer转换为PaddlePaddle模型中的对应实现, 用户可根据自己需要添加代码实现自定义层从而支持模型的完整转换
***步骤一 下载代码***
此处涉及修改源码应先卸载x2paddle并且下载源码主要有以下两步完成
```
pip uninstall x2paddle
pip install git+https://github.com/PaddlePaddle/X2Paddle.git@develop
```
***步骤二 编译caffe.proto***
该步骤依赖protobuf编译器其安装过程有以下两种方式
> 选择一pip install protobuf
> 选择二使用[官方源码](https://github.com/protocolbuffers/protobuf)进行编译
使用脚本./tools/compile.sh将caffe.proto包含所需的自定义Layer信息编译成我们所需的目标语言Python
使用方式
```
bash ./toos/compile.sh /home/root/caffe/src/caffe/proto
# /home/root/caffe/src/caffe/proto为caffe.proto的存放路径,生成的caffe_pb2.py也将保存在该路径下
```
***步骤三 添加自定义Layer的实现代码***
- 进入./x2paddle/op_mapper/caffe_custom_layer创建.py文件例如mylayer.py
- 仿照./x2paddle/op_mapper/caffe_custom_layer中的其他文件在mylayer.py中主要需要实现3个函数下面以roipooling.py为例分析代码
1. `def roipooling_shape(input_shape, pooled_w=None, pooled_h=None)`
参数
1. input_shapelist):其中每个元素代表该层每个输入数据的shape为必须传入的参数
2. pooled_wint):代表ROI Pooling的kernel的宽其命名与.prototxt中roi_pooling_param中的key一致
3. pooled_hint):代表ROI Pooling的kernel的高其命名与.prototxt中roi_pooling_param中的key一致
功能计算出进行ROI Pooling后的shape
返回一个list其中每个元素代表每个输出数据的shape由于ROI Pooling的输出数据只有一个所以其list长度为1
2. `def roipooling_layer(inputs, input_shape=None, name=None, pooled_w=None, pooled_h=None, spatial_scale=None)`
参数
1. inputslist):其中每个元素代表该层每个输入数据为必须传入的参数
2. input_shapelist):其中每个元素代表该层每个输入数据的shape为必须传入的参数
3. namestr):ROI Pooling层的名字为必须传入的参数
4. pooled_wint):代表ROI Pooling的kernel的宽其命名与.prototxt中roi_pooling_param中的key一致
5. pooled_hint):代表ROI Pooling的kernel的高其命名与.prototxt中roi_pooling_param中的key一致
6. spatial_scalefloat):用于将ROI坐标从输入比例转换为池化时使用的比例其命名与.prototxt中roi_pooling_param中的key一致
功能运用PaddlePaddle完成组网来实现`roipooling_layer`的功能
返回一个Variable为组网后的结果
3. `def roipooling_weights(name, data=None)`
参数
1. namestr):ROI Pooling层的名字为必须传入的参数
2. datalist):由Caffe模型.caffemodel获得的关于roipooling的参数roipooling的参数为None
功能为每个参数例如kernelbias等命名同时若Caffe中该层参数与PaddlePaddle中参数的格式不一致则变换操作也在该函数中实现
返回一个list包含每个参数的名字
- 在roipooling.py中注册`roipooling`主要运用下述代码实现
```
register(kind='ROIPooling', shape=roipooling_shape, layer=roipooling_layer, weights=roipooling_weights)
# kind为在model.prototxt中roipooling的type
```
- ./x2paddle/op_mapper/caffe_custom_layer/\_\_init\_\_.py中引入该层的使用
```
from . import roipooling
```
***步骤四 运行转换代码***
```
# 在X2Paddle目录下安装x2paddle
python setup.py install
# 运行转换代码
x2paddle --framework=caffe
--prototxt=deploy.proto
--weight=deploy.caffemodel
--save_dir=pd_model
--caffe_proto=/home/root/caffe/src/caffe/proto/caffe_pb2.py
```
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册