NCNN源碼編譯及Android Demo跑通

前幾天看到鵝廠放出了NCNN源碼,去GITHUB上搞下來,一堆CMAKE的腳本和幾段源碼,還有一個CAFFEMODEL和幾個不知名文件。README里是一堆吹牛逼的廢話,對編譯src、tools和example完全沒有指導(dǎo)意義??磥硪约好髁?。

其實編譯src里的東西不難,這里就寫一下在Linux系統(tǒng)下的源碼編譯過程和Android Demo跑通過程。(Windows用戶可以開啟Linux子系統(tǒng)然后一塊編譯,其實我就是受人鄙視的Windows用戶。??)

需要編譯的目標有4個(括號內(nèi)為所需工具):

1. src源碼(cmake make gcc g++)

2. Android/iOS所需的鏈接庫(cmake make gcc g++ zip NDK)

3. example源碼(gradle/ant NDK Android-SDK)

4. tools源碼(protobuf ncnn)

如果沒有protobuf,那么需要先去github上把Protobuf的源碼給搞下來,然后根據(jù)Protobuf安裝指南安裝這個工具。

安裝了protobuf以后上述工具基本上都已經(jīng)齊備。

編譯源碼SRC

進入src目錄,創(chuàng)建build目錄,然后執(zhí)行cmake,具體執(zhí)行順序如下

mkdir build

cd build

cmake ..

make

sudo make install

在build目錄下就可以得到一個大小1.4M不到的libncnn.a靜態(tài)庫

此外,默認的SRC編譯是不會把ncnn的完整屬性打入包內(nèi)的(少了一些方法),這時編譯tools中的轉(zhuǎn)換工具會出現(xiàn)錯誤。如果需要編譯加入這些方法,在cmake中……不知道咋辦,在cmake之后build目錄中有platform.h文件,把其中

#define NCNN_STDIO 0

#define NCNN_STRING 0

#define NCNN_OPENCV 0

改為

#define NCNN_STDIO 1

#define NCNN_STRING 1

#define NCNN_OPENCV 1

即可

編譯Android鏈接庫

這部分比較簡單,直接在ncnn的根目錄執(zhí)行

bash build.sh

bash package.sh

就行

在執(zhí)行完一堆編譯(編譯過程中如果沒有配置IOS專門的OC編譯器,IOS庫無法產(chǎn)出,不過沒關(guān)系,咱們說的是Android Demo跑通嘛。)后會得到:build-android-aarch64 build-android-armv7兩個文件夾

以及ncnn.framework.zip ncnn-android-lib.zip兩個壓縮包

我們只要把ncnn-android-lib.zip這個壓縮包搞出來就行了

編譯example源碼

Example里的squeezencnn是一個Ant工程,這里以WIndows編譯為例,Mac用戶雷同(Linux可以直接下載ant編譯工具,修改ant.properties然后編譯):

直接備份導(dǎo)入到Android Studio中,升級為Gradle工程(AS會自動創(chuàng)建build.gradle等文件)

咱們采用原始方法加入NDK支持:

經(jīng)過一系列等待,會告訴你NDK錯誤

在根目錄下創(chuàng)建

gradle.properties

內(nèi)容為

android.useDeprecatedNdk=true

修改根目錄中的build.gradle里gradle的版本到一個比較新的版本

修改app/build.gradle的內(nèi)容(AS會自動調(diào)整目錄結(jié)構(gòu))

主要修改兩項內(nèi)容,增加兩項內(nèi)容:

修改

compileSdkVersion 9

compileSdkVersion 14或者更高

修改

buildToolsVersion XXX

buildToolsVersion '24.0.2'或更高

增加

sourceSets {

? ?main {

? ? ? jniLibs.srcDirs = ['libs']

? ?}

}

增加

dependencies {

? ?compile fileTree(dir: 'libs', include: ['*.so'])

}

然后進入app/src/main/jni

修改

Android.mk中

NCNN_INSTALL_PATH到你編譯出的build-android-XXX目錄的install目錄下

修改Application.mk中

APP_ABI := all

APP_PLATFORM := android-14

然后在jni目錄下直接執(zhí)行

ndk-build

就會在上層目錄得到一個libs文件夾,里面包含了所有編譯輸出的so庫

我們把libs文件夾移動到app的目錄下

然后直接gradle build install

跑起來,應(yīng)該就沒問題了。

這是一個圖片分類的demo,啟動后會發(fā)現(xiàn)無論什么圖片都不能識別分類(顯示一個神秘路徑)

反查app\src\main目錄下的asserts中放的squeezenet_v1.1.bin文件內(nèi)容是一個路徑,synset_words.txt也是所以我們要用原始example目錄下

squeezenet_v1.1.bin

squeezenet_v1.1.param

以及

synset_words.txt

替換同名文件。

再次運行,就有結(jié)果了。。。雖然結(jié)果看起來不太理想,不過效果還不錯。。。


運行效果

編譯工具TOOLS

工具的編譯也非常簡單,去tools目錄下直接創(chuàng)建build文件夾然后:

cd build

cmake ..

make

sudo make install

即可得到caffe2ncnn和ncnn2mem這兩個工具,

caffe2ncnn接受2個、4個或者5個參數(shù)

依次是:

caffe的模型prototxt文件

caffe的模型caffemodel文件

輸出的

ncnn模型bin文件名

ncnn模型的param文件名

以及量化深度

支持(0,256,65536)三種,默認是0(完全)

結(jié)尾

從執(zhí)行的效果和代碼的快速瀏覽來看,NCNN的目標在于輕量級的更注重CPU運算優(yōu)化的方向(包括這兩天的更新都是在針對不同的硬件架構(gòu)進行代碼優(yōu)化),和TensorFlow on Android還是有一些差別的。感覺這個項目要成熟起來還有很長的路要走。

再增加一些其他平臺的模型轉(zhuǎn)換工具吧。

有空會寫代碼閱讀理解報告的。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容