NCNN簡單入門及安裝

1.概述android


ncnn 是一個爲手機端極致優化的高性能神經網絡前向計算框架。ncnn 從設計之初深入考慮手機端的部署和使用。無第三方依賴,跨平臺,手機端 cpu 的速度快於目前全部已知的開源框架。基於 ncnn,開發者可以將深度學習算法輕鬆移植到手機端高效執行,開發出人工智能 APP,將 AI 帶到你的指尖。ncnn 目前已在騰訊多款應用中使用,如QQQzone,微信,每天P圖等。ios

 

 2.功能git


•支持卷積神經網絡,支持多輸入和多分支結構,可計算部分分支github

•無任何第三方庫依賴,不依賴 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,不支持opencv3ncnnopencv的路徑根據本身狀況修改。


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

本文分享自微信公衆號 - AI MOOC人工智能平臺(AIMOOC_XLAB)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索