NCNN网络入门及安装

1、概述

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

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

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,内容如下,不支持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

你可能感兴趣的:(深度学习)