前言
最近論文剛剛寫(xiě)完,終于可以做一些自己喜歡的東西了奠蹬,Happy朝聋。之前學(xué)過(guò)一段時(shí)間Android, 感覺(jué)移動(dòng)端App開(kāi)發(fā)和PC上的軟件,比如Qt, 存在很大的不同罩润,App開(kāi)發(fā)更好玩一些玖翅,而且實(shí)用價(jià)值也比較大。
Yolov3是一個(gè)非常棒的深度學(xué)習(xí)目標(biāo)檢測(cè)算法割以,如果Yolov3與Android相遇金度,那yolov3就可以發(fā)揮更大的價(jià)值,而不僅僅停留在實(shí)驗(yàn)室严沥, 在此基礎(chǔ)上可以開(kāi)發(fā)出許多有趣的App:
- 比如采用Yolov3識(shí)別游戲中的角色,游戲輔助
- 行人檢測(cè)識(shí)別
- 食物檢測(cè)識(shí)別
......
本文主要內(nèi)容:基于NCNN庫(kù)實(shí)現(xiàn)Android端Yolov3深度學(xué)習(xí)目標(biāo)檢測(cè)
說(shuō)明一點(diǎn)猜极,本文不是直接將darknet yolov3移植到android上,考慮到性能采用ncnn庫(kù)
- NCNN庫(kù)編譯
- Android工程搭建
- Android端 opencv配置
- JNI Java C++參數(shù)傳遞
開(kāi)發(fā)環(huán)境
- Ubuntu 18.04
- Android Studio 3.2, with android ndk r16b
- ncnn
App效果圖
App主頁(yè)面消玄, 需要?jiǎng)討B(tài)申請(qǐng)權(quán)限
App主頁(yè)面跟伏, 一個(gè)大大的darknet logo,背景純黑色翩瓜,是不是很酷
第二個(gè)界面受扳, 選擇圖像, 目標(biāo)檢測(cè)經(jīng)典圖片
這里可以設(shè)置多線程兔跌,線程數(shù)量
這是檢測(cè)結(jié)果勘高, 檢測(cè)識(shí)別到汽車Car
每一項(xiàng)可以點(diǎn)擊進(jìn)去,查看詳情
繪制的檢測(cè)結(jié)果
Android端Yolov3實(shí)現(xiàn)
NCNN庫(kù)編譯
NCNN庫(kù)是騰訊優(yōu)圖的一個(gè)開(kāi)源深度神經(jīng)網(wǎng)絡(luò)計(jì)算庫(kù)坟桅,專為移動(dòng)平臺(tái)加速华望。
https://github.com/Tencent/ncnn
開(kāi)源工程已經(jīng)編譯好了Android平臺(tái)的靜態(tài)庫(kù),可以直接用仅乓。但是考慮到實(shí)際開(kāi)發(fā)編譯環(huán)境的不同赖舟,因此最好自己編譯一次。
編譯的詳細(xì)步驟:
具體步驟見(jiàn)官網(wǎng)夸楣,這里我就說(shuō)一下踩過(guò)的坑:
- Android NDK版本
ndk版本不要太新的宾抓,容易出BUG!!!
在安裝Android SDK時(shí)候,ndk默認(rèn)安裝在sdk/ndk-bundle目錄豫喧, 具體的版本號(hào)在Android studio SDK Manager/SDK Tools中可以查看洞慎。
除了使用Android SDK自帶的ndk之外,還可以手動(dòng)下載Android ndk, 解壓在一個(gè)目錄嘿棘。
在Ubuntu上只要配置好Android ndk就可以編譯好nccn庫(kù)劲腿,如圖:
目前Android手機(jī)普遍支持64bit, 所以一般編譯出兩個(gè)版本的lib
版本 | 平臺(tái) |
---|---|
armeabi-v7a | ARM 32bit庫(kù) |
arm64-v8a | ARM 64bit庫(kù) |
opencv的導(dǎo)入
需要下載oepncv for android sdk
在opencv sdk目錄中包含 java以及native
類型 | 作用 |
---|---|
java | opencv java類,接口 |
native | C++ 鏈接庫(kù) |
opencv中包含諸多編譯好的鏈接庫(kù):
類型 | 描述 |
---|---|
arm64-v8a | ARM 64bit |
armeabi | ARM 早期的二進(jìn)制接口ABI |
armeabi-v7a | ARM 32bit |
mips | others |
x86 | Intel x86 cpu架構(gòu) |
x86_x64 | Intel x86 64bit CPU |
一般的Android手機(jī)鸟妙,大多數(shù)使用這兩足以:
- armeabi-v7a
- arm64-v8a
動(dòng)態(tài)鏈接庫(kù)
本工程中焦人,在Java層以及C++層同時(shí)導(dǎo)入opencv庫(kù)
- Java層: 導(dǎo)入opencv-android-sdk/sdk/java 模塊
- C++層: 在CMakeList.txt中引入
Java層引入opencv
File->New->Import Module
導(dǎo)入之后挥吵,修改sdk版本,與 Module:app的版本保持一致花椭。然后在Project Structure中導(dǎo)入Module
C++層導(dǎo)入opencv
通過(guò)配置CMakeList.txt即可
最后忽匈,將so復(fù)制到android工程:
Android工程搭建
進(jìn)行android開(kāi)發(fā)采用的工具Android Studio, AS比較卡,吃內(nèi)存矿辽, 編譯時(shí)間巨慢丹允。Ubuntu系統(tǒng)還好些,比windows快很多袋倔。
因?yàn)镹CNN庫(kù)是C++實(shí)現(xiàn)的雕蔽,因此在創(chuàng)建Android工程時(shí)候務(wù)必選擇 include C++, C++版本一般選C++14, C++11即可。這是已經(jīng)完工之后的Android工程宾娜。
工程包含3個(gè)Module:
- app
- openCVLibrary343
- yolov3
其中app是創(chuàng)建工程自帶的批狐,一些啟動(dòng)界面包含于此;openCVLibrary343是在opencv官網(wǎng)下載的, opencv for android sdk, 里面包含大量Java opencv 類實(shí)現(xiàn)前塔,以及編譯好的動(dòng)態(tài)鏈接庫(kù) opencv_java3.so; yolov3模塊是自己新建的嚣艇,包含yolo目標(biāo)檢測(cè)算法的實(shí)現(xiàn)以及Java接口的封裝, 創(chuàng)建一個(gè)yolo模塊的目的是可以往不同工程中直接導(dǎo)入华弓,方便移植食零。
模塊的導(dǎo)入
NCNN庫(kù)引入
引入ncnn庫(kù)的目的是加載yolov3網(wǎng)絡(luò),網(wǎng)絡(luò)模型寂屏,進(jìn)行forword計(jì)算慌洪。
ncnn庫(kù)的導(dǎo)入比較簡(jiǎn)單:
- 將include復(fù)制到cpp目錄
- 將libncnn.a復(fù)制到armeabi-v7a, arm64-v8a
- 在CMakeList.txt中引入
此CMakeList.txt文件根據(jù)配置將生成libyolo.so動(dòng)態(tài)鏈接庫(kù)。
此篇主要是工程配置凑保,后續(xù)再寫(xiě)代碼實(shí)現(xiàn)...