caffe模型转ncnn模型


前言

  最近在使用腾讯的ncnn框架时,使用ubuntu系统把基于caffe框架的alexnet模型转换为了基于ncnn框架的alexnet模型,在此过程学到了很多,因此记录一下。

转模型步骤

  1、下载ncnn框架并编译,可参考该博客
  2、下载caffe框架(https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet)和权重文件(http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel),会得到caffe-master.zip和bvlc_alexnet.caffemodel。
  3、编译caffe框架:
  (1)进入caffe-master文件夹,打开终端,输入指令:

sudo cp Makefile.config.example Makefile.config

  此指令的作用是将Makefile.config.example文件复制一份并更名为Makefile.config,原因是编译caffe时需要Makefile.config文件,而Makefile.config.example只是caffe 给出的配置文件例子,不能用来编译caffe;
  (2)修改Makefile.config文件,根据自己需要修改即可,可参考链接修改Makefile.config修改;
  (3)在caffe-master文件夹下,打开终端,输入命令编译:

make all

   编译成功即可得到build文件夹。
  4、将caffe-master.zip解压,进入/modeles/bvlc_alexnet/文件夹,找到deploy.prototxt文件,下文主要会用到deploy.prototxt和bvlc_alexnet.caffemodel这两个文件。
  5、上步得到的文件是旧版的caffe模型,而ncnn只支持转换新版的caffe模型,所以需要将上步得到的文件转换成新版的,可用caffe框架自带的转换工具进行转换,转换操作如下:将上述两个文件复制到caffe-master/build/tools文件夹下;并在该文件夹下打开终端,使用如下两个命令:

upgrade_net_proto_text deploy.prototxt deploy_new.prototxt
upgrade_net_proto_binary bvlc_alexnet.caffemodel bvlc_alexnet_new.caffemodel

  6、此时得到了deploy_new.prototxt和bvlc_alexnet_new.caffemodel新版caffe文件,就可以将其转换成ncnn模型了,将这两个文件复制到ncnn/build/tools/caffe文件夹,并在该文件夹打开终端,使用命令:

caffe2ncnn deploy_new.prototxt bvlc_alexnet_new.caffemodel alexnet.param alexnet.bin

  7、此时就得到alexnet.param和alexnet.bin文件,这两个文件都是ncnn格式,.param可以理解为网络的配置文件,.bin可以理解为网络的参数(各种权重)文件,分别对应caffe的deploy_new.prototxt和bvlc_alexnet_new.caffemodel文件。
  8、仅使用alexnet.param和alexnet.bin文件进行部署就已经足够了,但是param文件中有可见的字符串,部署在终端后,可能会被篡改纯神经网络信息,因此可以使用ncnn2mem工具将普通模型文件转换为二进制表示形式。它将生成alexnet.param.bin和两个静态数组代码文件。操作如下:将第7步生成的alexnet.param和alexnet.bin文件复制到ncnn/build/tools文件夹,打开终端输入命令:

ncnn2mem alexnet.param alexnet.bin alexnet.id.h alexnet.mem.h

  就得到了解密后的文件alexnet.param.bin、alexnet.id.h、alexnet.mem.h。

测试

  转完成之后,测试如下:
  1、在ncnn/examples文件夹下新建文件alexnet.cpp,写下如下代码:
在这里插入图片描述
  2、修改该文件夹的CMakeLists.txt文件,加光标所在行,alexnet是存储代码的文件名;
在这里插入图片描述
  3、重新编译,进入ncnn/build文件夹,新建终端,敲如下命令:

cmake ..
make -j8

  4、进入ncnn/build/examples文件夹,新建终端,使用如下命令即可运行alexnet.cpp文件里的代码:

./alexnet

  5、运行结果如下:
在这里插入图片描述

bug

  我在编译过程中遇到的bug及解决方法:
   问题一: 在这里插入图片描述
  解决方法如图:
在这里插入图片描述

  Caffe-GPU编译问题解决方法参考链接

  问题二:

在这里插入图片描述

  这是由于没有配置环境变量,可用如下命令配置:

export PATH='$PATH:.'

  问题三:
在这里插入图片描述
  解决方法:
  将cuda的lib中的链接库复制到path目录下:
  sudo cp /usr/local/cuda-10.0/lib64/libcudart.so.10.0 /usr/local/lib/libcudart.so.10.0 && sudo ldconfig
  sudo cp /usr/local/cuda-10.0/lib64/libcublas.so.10.0 /usr/local/lib/libcublas.so.10.0 && sudo ldconfig
  sudo cp /usr/local/cuda-10.0/lib64/libcurand.so.10.0 /usr/local/lib/libcurand.so.10.0 && sudo ldconfig
  参考链接

总结

  1、caffe中,deploy.prototxt文件是在测试的时候用的,不是用来训练的。网络训练之后,用deploy文件和生成的模型共同来测试。
  2、caffe的运行提供三种接口:c++接口(命令行)、python接口和matlab接口。在C++接口中,caffe的c++主程序(caffe.cpp)放在根目录下的tools文件夹内,我们要使用的upgrade_net_proto_text和upgrade_net_proto_binary对应的cpp文件也在该文件夹中。经过编译后,这些文件都被编译成了可执行文件,放在了/build/tools/文件夹内。因此我们要执行caffe程序,需要在/build/tools/文件夹下执行。

  官方链接:https://blog.csdn.net/soralaro/article/details/81131615

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值