ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如QQ,Qzone,微信,天天P图等。
NCNN github网址:https://github.com/tencent/ncnn
(1)下载编译源码
git clone https://github.com/Tencent/ncnn
下载完成后,需要对源码进行编译
cd ncnn
mkdir build && cd build
cmake ..
make -j
make install
执行完毕后我们可以看到
Install the project...
-- Install configuration: "release"
-- Installing: /home/cheng/code/ncnn/build/install/lib/libncnn.a
-- Installing: /home/cheng/code/ncnn/build/install/include/blob.h
-- Installing: /home/cheng/code/ncnn/build/install/include/cpu.h
-- Installing: /home/cheng/code/ncnn/build/install/include/layer.h
-- Installing: /home/cheng/code/ncnn/build/install/include/mat.h
-- Installing: /home/cheng/code/ncnn/build/install/include/net.h
-- Installing:/home/cheng/code/ncnn/build/install/include/opencv.h
-- Installing:/home/cheng/code/ncnn/build/install/include/platform.h
我们进入 ncnn/build/tools 目录下,可以看到已经生成了 caffe2ncnn 可ncnn2mem这两个可执行文件。
这两个可执行文件的作用是将caffe模型生成ncnn 模型,并且对模型进行加密。
可以看到
cd ncnn/build/tools
ll
total 3024
drwxrwxr-x 3 cheng cheng 4096 7月 27 15:36 ./
drwxrwxr-x 6 cheng cheng 4096 7月 27 15:36 ../
-rwxrwxr-x 1 cheng cheng 833720 7月 27 15:36 caffe2ncnn*
-rw-rw-r-- 1 cheng cheng 1102486 7月 27 15:36 caffe.pb.cc
-rw-rw-r-- 1 cheng cheng 894690 7月 27 15:36 caffe.pb.h
drwxrwxr-x 4 cheng cheng 4096 7月 27 15:36 CMakeFiles/
-rw-rw-r-- 1 cheng cheng 1018 7月 27 15:36 cmake_install.cmake
-rw-rw-r-- 1 cheng cheng 9353 7月 27 15:36 Makefile
-rwxrwxr-x 1 cheng cheng 228032 7月 27 15:36 ncnn2mem*
(2)将caffe下网络模型转换为NCNN模型
在测试的过程中需要caffemodel以及deploy.prototxt,所以在将caffe模型转换为NCNN模型的时候,同样也需要caffemodel以及deploy.prototxt这两个文件,为了方便,我们用AlexNet为例讲解。
alexnet 的 deploy.prototxt 可以在这里下载
https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet
alexnet 的 caffemodel 可以在这里下载
http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel
由于NCNN提供的转换工具只支持转换新版的caffe模型,所以需要利用caffe自带的工具将旧版的caffe模型转换为新版的caffe模型后,在将新版本的模型转换为NCNN模型.
①旧版caffe模型转新版caffe模型
执行如下命令.[要记得修改路径]
~/caffe/build/tools/upgrade_net_proto_text deploy.prototxtnew_deplpy.prototxt
~/caffe/build/tools/upgrade_net_proto_binary bvlc_alexnet.caffemodelnew_bvlc_alexnet.caffemodel
上面的命令需要根据自己的caffe位置进行修改,且deploy.prototxtbvlc_alexnet.caffemodel需要在当前目录下。
执行后,就可以生成新的caffe模型.
因为我们每次检测一张图片,所以要对新生成的new_deploy.prototxt进行修改:第一个 dim 设为 1
layer {
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim:1 dim: 3 dim: 227 dim: 227 } }
}
②新版caffe模型转ncnn模型
在ncnn/build/tools目录下
./caffe2ncnn new_deplpy.prototxt new_bvlc_alexnet.caffemodelalexnet.param alexnet.bin
执行上面命令后就可以生成NCNN模型需要的param 与bin 文件.
ll
total 717492
drwxrwxr-x 3 4096 7月 27 16:13 ./
drwxrwxr-x 6 cheng cheng 4096 7月 27 15:36 ../
-rw-rw-r-- 1 cheng cheng 243860928 7月 27 16:13 alexnet.bin
-rw-rw-r-- 1 cheng cheng 1583 7月 27 16:13 alexnet.param
-rw-rw-r-- 1 cheng cheng 243862414 7月 27 09:28 bvlc_alexnet.caffemodel
-rwxrwxr-x 1 cheng cheng 833720 7月 27 15:36 caffe2ncnn*
-rw-rw-r-- 1 r cheng cheng 1102486 7月 27 15:36 caffe.pb.cc
-rw-rw-r-- 1 cheng cheng 894690 7月 27 15:36 caffe.pb.h
drwxrwxr-x 4 cheng cheng 4096 7月 27 15:36 CMakeFiles/
-rw-rw-r-- 1 cheng cheng 1018 7月 27 15:36 cmake_install.cmake
-rw-rw-r-- 1 cheng cheng 3629 6月 6 21:40 deploy.prototxt
-rw-rw-r-- 1 cheng cheng 9353 7月 27 15:36 Makefile
-rwxrwxr-x 1 cheng cheng 228032 7月 27 15:36 ncnn2mem*
-rw-rw-r-- 1 cheng cheng 243862660 7月 27 16:03 new_bvlc_alexnet.caffemodel
-rw-r--r-- 1 cheng cheng 3662 7月 27 16:03 new_deplpy.prototxt
(3)对模型参数加密
得到的alexnet.param是明文可见的,往往发布的过程需要对这些文件进行加密,NCNN提供了对应的加密工具,ncnn2mem,
./ncnn2mem alexnet.param alexnet.bin alexnet.id.h alexnet.mem.h
最后可以生成 alexnet.param.bin 这样的二进制加密文件。
对于加密文件的读取也和原来不同,在源码中,非加密param读取方式为:
ncnn::Net net;
net.load_param("alexnet.param");
net.load_model("alexnet.bin");
加密param.bin读取方式为:
ncnn::Net net;
net.load_param_bin("alexnet.param.bin");
net.load_model("alexnet.bin");
(4)编译NCNN例程
前面介绍了如何将caffe模型转为NCNN模型并且加密,最后来编译NCNN的例程,这样可以更直观的运行或者理解NCNN。
首先需要进入ncnn/examples目录,新建一个makefile,内容如下,不支持opencv3。ncnn和opencv的路径根据自己情况修改。
NCNN = /home/cheng /code/ncnn
OPENCV = /home/cheng/install-OpenCV/Ubuntu/2.4/opencv/opencv-2.4.10
INCPATH = -I${NCNN}/build/install/include \
-I${OPENCV}/modules/objdetect/include \
-I${OPENCV}/modules/highgui/include \
-I${OPENCV}/modules/imgproc/include\
-I${OPENCV}/modules/core/include
LIBS = -lopencv_core -lopencv_highgui -lopencv_imgproc \
-fopenmp-pthread
LIBPATH = -L${OPENCV}/build/lib
%:%.cpp
$(CXX) $(INCPATH)$(LIBPATH) $^ ${NCNN}/build/install/lib/libncnn.a $(LIBS) -o $@
test.jpg 为保存的待识别的图像,保存在和squeezenet.cpp同目录下,执行命令编译就可以看到识别结果。
g++ squeezenet.cpp –o test
./test test.jpg