NCNN 模型压缩简单入门及安装

转自:https://www.ziiai.com/blog/194

1.概述

ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如QQ,Qzone,微信,天天P图等。

 2.功能

•支持卷积神经网络,支持多输入和多分支结构,可计算部分分支

•无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架

•纯 C++ 实现,跨平台,支持 android ios 等

•ARM NEON 汇编级良心优化,计算速度极快

•精细的内存管理和数据结构设计,内存占用极低

•支持多核并行计算加速,ARM big.LITTLE cpu 调度优化

•整体库体积小于 500K,并可轻松精简到小于 300K

•可扩展的模型设计,支持 8bit 量化和半精度浮点存储,可导入 caffe 模型

•支持直接内存零拷贝引用加载网络模型

•可注册自定义层实现并扩展

•恩,很强就是了,不怕被塞卷

3.在Ubuntu上安装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,内容如下,最重要的是,NCNN例程序只支持opencv2,不支持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

就可以看到识别结果。

NCNN github网址:https://github.com/tencent/ncnn

猜你喜欢

转载自blog.csdn.net/haima1998/article/details/89713712
今日推荐