169 lines
4.6 KiB
Markdown
169 lines
4.6 KiB
Markdown
# Caffe模型转换示例
|
||
|
||
本文档以 lenet_caffe 为例,介绍如何使用 Netrans 对 Caffe 模型进行转换。
|
||
|
||
Netrans 支持所有的 Caffe 模型。
|
||
|
||
## 安装Netrans
|
||
1. 先确定您的 Netrans 下载目录,使用以下命令将 Netrans 加入系统配置文件。记得使用您真实的 Netrans下载目录 替换下行命令中的文字。
|
||
```bash
|
||
export NETRANS_PATH=Netrans下载目录/bin
|
||
```
|
||
2. 安装 netrans_py
|
||
```bash
|
||
cd netrans_py
|
||
pip3 install -e .
|
||
```
|
||
|
||
## 数据准备
|
||
转换 Caffe 模型时,模型工程目录应包含以下文件:
|
||
- 以 .prototxt 结尾的模型结构定义文件
|
||
- 以 .caffemode 结尾的模型权重文件
|
||
- dataset.txt 包含数据路径的文本文件(支持图像和NPY格式)
|
||
|
||
我们的示例 已经完成数据准备,可以使用下面命令进入目录执行。
|
||
|
||
```bash
|
||
cd netrans/
|
||
cd examples/caffe
|
||
```
|
||
|
||
此时目录如下:
|
||
```bash
|
||
lenet_caffe/
|
||
├── 0.jpg # 校准数据
|
||
├── dataset.txt # 指定数据地址的文件
|
||
├── lenet_caffe.caffemodel # caffe 模型权重
|
||
└── lenet_caffe.prototxt # caffe 模型结构
|
||
```
|
||
|
||
## 使用 nertans_cli 命令行工具
|
||
使用 netrans_cli 之前,请先使用以下命令将 命令行脚本 拷贝至当前目录。
|
||
```bash
|
||
cp ../../netrans_cli/*sh ./
|
||
```
|
||
此时目录如下:
|
||
```bash
|
||
caffe/
|
||
├── example.py
|
||
├── export.sh
|
||
├── gen_inputmeta.sh
|
||
├── import_model.sh
|
||
├── infer.sh
|
||
├── lenet_caffe
|
||
│ ├── 0.jpg
|
||
│ ├── dataset.txt
|
||
│ ├── lenet_caffe.caffemodel
|
||
│ └── lenet_caffe.prototxt
|
||
└── quantize.sh
|
||
```
|
||
### 模型导入
|
||
```bash
|
||
./import_model.sh lenet_caffe
|
||
```
|
||
|
||
该步骤会生成 .json 结尾的网络结构文件和 .data 结尾的权重数据文件。
|
||
|
||
此时 lenet_caffe 的目录结构如下:
|
||
```bash
|
||
lenet_caffe/
|
||
├── 0.jpg
|
||
├── dataset.txt
|
||
├── lenet_caffe.caffemodel
|
||
├── lenet_caffe.data
|
||
├── lenet_caffe.json
|
||
└── lenet_caffe.prototxt
|
||
```
|
||
|
||
### 配置文件生成
|
||
数据在推理前一般会经过预处理,为了确保模型可以正确的输入数据,需要生产对应的配置文件。
|
||
|
||
```bash
|
||
./gen_inputmeta.sh lenet_caffe
|
||
```
|
||
|
||
此时 lenet_caffe 的目录结构如下:
|
||
```bash
|
||
lenet_caffe/
|
||
├── 0.jpg
|
||
├── dataset.txt
|
||
├── lenet_caffe.caffemodel
|
||
├── lenet_caffe.data
|
||
├── lenet_caffe_inputmeta.yml
|
||
├── lenet_caffe.json
|
||
└── lenet_caffe.prototxt
|
||
```
|
||
|
||
### 模型量化
|
||
为了优化模型的推理效率,加快模型的推理速度,我们使用下行命令对模型进行量化处理。
|
||
量化模型需要两个参数,目录(模型)名字和量化类型。量化类型包括:float,int16, int8 和 uint8。
|
||
|
||
```bash
|
||
./quantize.sh lenet_caffe uint8
|
||
|
||
```
|
||
|
||
此时 lenet_caffe 的目录结构如下:
|
||
```bash
|
||
lenet_caffe/
|
||
├── 0.jpg
|
||
├── dataset.txt
|
||
├── lenet_caffe_asymmetric_affine.quantize
|
||
├── lenet_caffe.caffemodel
|
||
├── lenet_caffe.data
|
||
├── lenet_caffe_inputmeta.yml
|
||
├── lenet_caffe.json
|
||
└── lenet_caffe.prototxt
|
||
```
|
||
### 模型导出
|
||
最后我们使用 export.sh 将模型导出到nbg格式并生成应用程序工程。量化模型需要两个参数,目录(模型)名字和量化类型。量化类型包括:float,int16, int8 和 uint8。量化类型应于 quantize.sh 使用的一致。
|
||
|
||
```bash
|
||
./export.sh lenet_caffe uint8
|
||
```
|
||
此时 lenet_caffe 的目录结构如下:
|
||
|
||
```bash
|
||
lenet_caffe/
|
||
├── 0.jpg
|
||
├── dataset.txt
|
||
├── lenet_caffe_asymmetric_affine.quantize
|
||
├── lenet_caffe.caffemodel
|
||
├── lenet_caffe.data
|
||
├── lenet_caffe_inputmeta.yml
|
||
├── lenet_caffe.json
|
||
├── lenet_caffe.prototxt
|
||
└── wksp
|
||
└── asymmetric_affine
|
||
├── BUILD
|
||
├── dump_core_graph.json
|
||
├── graph.json
|
||
├── lenetcaffeasymmetricaffine.2012.vcxproj
|
||
├── lenet_caffe_asymmetric_affine.export.data
|
||
├── lenetcaffeasymmetricaffine.vcxproj
|
||
├── main.c
|
||
├── makefile.linux
|
||
├── network_binary.nb
|
||
├── vnn_global.h
|
||
├── vnn_lenetcaffeasymmetricaffine.c
|
||
├── vnn_lenetcaffeasymmetricaffine.h
|
||
├── vnn_post_process.c
|
||
├── vnn_post_process.h
|
||
├── vnn_pre_process.c
|
||
└── vnn_pre_process.h
|
||
```
|
||
## 使用 netrans_py python api
|
||
本文档提供基于 python api 实现的python脚本,请先使用以下命令将 api脚本 拷贝至当前目录。
|
||
|
||
### 准备示例脚本
|
||
```bash
|
||
cp ../../netrans_py/example.py ./
|
||
|
||
```
|
||
|
||
### 运行示例脚本
|
||
|
||
```bash
|
||
python3 example.py lenet_caffe -q uint8
|
||
```
|