1.概述android
ncnn 是一個爲手機端極致優化的高性能神經網絡前向計算框架。ncnn 從設計之初深入考慮手機端的部署和使用。無第三方依賴,跨平臺,手機端 cpu 的速度快於目前全部已知的開源框架。基於 ncnn,開發者可以將深度學習算法輕鬆移植到手機端高效執行,開發出人工智能 APP,將 AI 帶到你的指尖。ncnn 目前已在騰訊多款應用中使用,如QQ,Qzone,微信,每天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,不支持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
本文分享自微信公衆號 - AI MOOC人工智能平臺(AIMOOC_XLAB)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。