Darknet yolo 在 android studio上的移植和實現
阿新 • • 發佈:2019-01-29
假期無事 跑了一下darknetyolo 看起來效果不錯 經過一系列不懈優化 終於跑到1秒內了
主要步驟
安裝NDK版本的android studio
其實現在 android studio已經非常完善了 NDK也不需要什麼特別的設定 直接用即可
建立一個NDK過程
這裡自己搞定吧 下一步的事情
新增darknet對應檔案
新增Cmake路徑和配置
我這邊參考 Makefile 新增如下
#C Flag set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-unknown-pragmas -Wfatal-errors -fPIC") set(CMAKE_LD_FLAGS "${CMAKE_LD_FLAGS} -lm -pthread -fopenmp") #Cmakefilelist file(GLOB darknet_files "src/main/cpp/darknet/src/*.c") set(DARKNET_SRC_LISTS ${darknet_files} src/main/cpp/darknetlib.c ) add_library( # Sets the name of the library. darknetlib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). ${DARKNET_SRC_LISTS} )
新增JNI介面
新增完成後需要編寫中間層JNI呼叫完成對接也就是 darknetlib.c這個檔案初期我做的比較簡單沒有傳遞 bitmap 先傳遞了 檔案path 然後呼叫官方程式程式碼如下很簡單
jdouble JNICALL Java_com_example_chenty_demoyolo_Yolo_testyolo(JNIEnv *env, jobject obj, jstring imgfile) { double time; const char *imgfile_str = (*env)->GetStringUTFChars(env, imgfile, 0); char *datacfg_str = "/sdcard/yolo/cfg/voc.data"; char *cfgfile_str = "/sdcard/yolo/cfg/tiny-yolo-voc.cfg"; char *weightfile_str = "/sdcard/yolo/weights/tiny-yolo-voc.weights"; //char *imgfile_str = "/sdcard/yolo/data/dog.jpg"; char *outimgfile_str = "/sdcard/yolo/out"; time = test_detector(datacfg_str, cfgfile_str, weightfile_str, imgfile_str, 0.2f, 0.5f, outimgfile_str, 0); (*env)->ReleaseStringUTFChars(env, imgfile, imgfile_str); return time; }
此處函式傳遞進來的是需要轉換檔案的路徑 然後執行深度網路 返回值我修改了下返回的是執行時間
Java部分
下面對java層進行新增和修改 和普通Jni差不多
public void yoloDetect(){ new Thread(new Runnable() { public void run() { double runtime = testyolo(srcimgpath); Log.i(TAG, "yolo run time " + runtime); Message msg = new Message(); msg.what = DETECT_FINISH; msg.obj = runtime; mHandler.sendMessage(msg); } }).start(); } public native double testyolo(String imgfile);
打包模型和釋放
為了更加便於使用打包了模型檔案 並將模型直接拷貝到SD卡這部分是android常規
public void exactresClick(View v){
view_status.setText("exact model, please wait");
copyFilesFassets(this, "cfg", "/sdcard/yolo/cfg");
copyFilesFassets(this, "data", "/sdcard/yolo/data");
copyFilesFassets(this, "weights", "/sdcard/yolo/weights");
view_status.setText("exact model finish");
}
執行結果還是比較滿意的
在 小米6上可以跑到1秒左右一張的速度 因為沒有使用neon 應該還有優化的空間
apk下載 https://pan.baidu.com/s/1qZbIdXU
CODE:
續YoloV3