NCNN简单入门及安装

so darling。
4个月前 阅读 113 点赞 1

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

| 1
评论 ( {{ comments.total }} )

还没有人发表评论...

{{ o.content }}
赞 {{ o.likes_count ? o.likes_count : '' }} 回复 {{ o.created_at }}