README.md 3.8 KB
Newer Older
J
Jason 已提交
1 2 3
# caffe2fluid
[![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](LICENSE)

J
Jason 已提交
4
caffe2fluid用于将Caffe模型转换为PaddlePaddle模型,此外在[[doc](doc)]目录中整理了Caffe-PaddlePaddle的常用API对比分析。
J
Jason 已提交
5

J
Jason 已提交
6
## 环境依赖
J
Jason 已提交
7

J
Jason 已提交
8
> python >= 2.7  
J
Jason 已提交
9
> numpy  
S
SunAhong1993 已提交
10
> protobuf >= 3.6.0  
J
Jason 已提交
11
> future  
J
Jason 已提交
12

J
Jason 已提交
13
**caffe2fluid的运行仅依赖上述条件**  
J
Jason 已提交
14
但建议在环境中安装好caffe和paddlepaddle,便于转换模型后测试。环境安装可参考[安装文档](prepare.md)
J
Jason 已提交
15

J
Jason 已提交
16
## 使用方法
J
Jason 已提交
17

J
Jason 已提交
18
### 模型转换
J
Jason 已提交
19 20 21
1. Caffe模型转换为PaddlePaddle模型代码和参数文件(参数以numpy形式保存)

```
S
SunAhong1993 已提交
22
# alexnet.prototxt : caffe配置文件
S
SunAhong1993 已提交
23
# --def_path : caffe配置文件的保存路径
S
SunAhong1993 已提交
24
# --caffemodel : caffe模型的保存路径
J
Jason 已提交
25 26
# --data-output-path : 转换后模型参数保存路径
# --code-output-path : 转换后模型代码保存路径
S
SunAhong1993 已提交
27 28 29 30
python convert.py --def_path alexnet.prototxt \
		--caffemodel alexnet.caffemodel \
		--data-output-path alexnet.npy \
		--code-output-path alexnet.py
J
Jason 已提交
31 32
```

J
Jason 已提交
33
2. 可通过如下方式,将模型网络结构和参数均序列化保存为PaddlePaddle框架支持加载的模型格式
J
Jason 已提交
34
```
S
SunAhong1993 已提交
35 36
# --model-param-path : 指定序列化后的模型保存路径
python alexnet.py --npy_path alexnet.npy --model-param-path ./fluid_model
J
Jason 已提交
37
```
J
Jason 已提交
38
或者也可在保存时,指定保存模型的输出
J
Jason 已提交
39 40
```
# 模型的输出为fc8和prob层
S
SunAhong1993 已提交
41
python alexnet.py --npy_path alexnet.npy --model-param-path ./fluid --need-layers-name fc8,prob
J
Jason 已提交
42
```
J
Jason 已提交
43
模型的加载及预测可参考PaddlePaddle官方文档[加载预测模型](http://www.paddlepaddle.org/documentation/docs/zh/1.3/api_guides/low_level/inference.html#id4)
J
Jason 已提交
44

J
Jason 已提交
45
### 模型转换前后差异对比
J
Jason 已提交
46
模型转换后,可通过如下方式,逐层对比转换后的模型与原模型的计算结果差异(**运行环境依赖caffe和paddlepaddle**
J
Jason 已提交
47
```
S
SunAhong1993 已提交
48
# alexnet : caffe配置文件(.prototxt)中“name”的值
S
SunAhong1993 已提交
49 50 51 52
# ../../alexnet.prototxt : caffe配置文件路径
# ../../alexnet.caffemodel : caffe模型文件路径
# ../../alexnet.py : 转换后模型代码保存路径
# ../../alexnet.npy : 转换后模型参数保存路径
S
SunAhong1993 已提交
53
# ./data/65.jpeg : 需要测试的图像数据
J
Jason 已提交
54
cd examples/imagenet
S
SunAhong1993 已提交
55 56 57 58
bash tools/diff.sh alexnet ../../alexnet.prototxt \
			../../alexnet.caffemodel \
			../../alexnet.py \
			../../alexnet.npy \
S
SunAhong1993 已提交
59
			./data/65.jpeg
J
Jason 已提交
60
```
J
Jason 已提交
61

J
Jason 已提交
62
## 自定义层转换
J
Jason 已提交
63 64 65 66 67 68 69 70 71 72
在模型转换中遇到未支持的自定义层,用户可根据自己需要,添加代码实现自定义层,从而支持模型的完整转换,实现方式如下流程,
1.`kaffe/custom_layers`下实现自定义层,例如mylayer.py
> - 实现`shape_func(input_shape, [other_caffe_params])`,计算输出的大小
> - 实现`layer_func(input_shape, [other_caffe_params])`,构造一个PaddlePaddle Fluid层
> - 注册这两个函数 `register(kind=`MyType`, shape=shape_func, layer=layer_func)`
也可参考`kaffe/cusom_layers`下的其它自定义层实现

2. 添加`import mylayer``kaffe/custom_layers/__init__.py`

3. 准备你的pycaffe作为你的定制版本(与以前的env准备相同)
J
Jason 已提交
73
> 选择一:编译你自己的caffe.proto来代替proto/caffe.proto  
J
Jason 已提交
74 75 76 77 78 79 80 81
> 选择二:更换你的pycaffe到特定的版本

4. 按照之前步骤,将Caffe模型转换为PaddlePaddle模型

5. 配置环境变量
```
export CAFFE2FLUID_CUSTOM_LAYERS=/path/to/caffe2fluid/kaffe
```
J
Jason 已提交
82
## 模型测试
J
Jason 已提交
83
caffe2fluid在如下模型上通过测试
S
SunAhong1993 已提交
84 85 86 87 88
- [Lenet](https://github.com/ethereon/caffe-tensorflow/blob/master/examples/mnist)
- [ResNet(ResNet-50,ResNet-101,ResNet-152)](https://onedrive.live.com/?authkey=%21AAFW2-FVoxeVRck&id=4006CBB8476FF777%2117887&cid=4006CBB8476FF777)
- [GoogleNet](https://gist.github.com/jimmie33/7ea9f8ac0da259866b854460f4526034)
- [VGG](https://gist.github.com/ksimonyan/211839e770f7b538e2d8)
- [AlexNet](https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet)