当前位置:   article > 正文

Darknet yolo 在 android studio上的移植和实现_安卓移植yolo的分离代码

安卓移植yolo的分离代码
 

假期无事 跑了一下darknetyolo 看起来效果不错 经过一系列不懈优化 终于跑到1秒内了

主要步骤

安装NDK版本的android studio

其实现在 android studio已经非常完善了 NDK也不需要什么特别的设置 直接用即可

创建一个NDK过程

这里自己搞定吧 下一步的事情

添加darknet对应文件

添加Cmake路径和配置

我这边参考 Makefile 添加如下

  1. #C Flag
  2. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-unknown-pragmas -Wfatal-errors -fPIC")
  3. set(CMAKE_LD_FLAGS "${CMAKE_LD_FLAGS} -lm -pthread -fopenmp")
  4. #Cmakefilelist
  5. file(GLOB darknet_files "src/main/cpp/darknet/src/*.c")
  6. set(DARKNET_SRC_LISTS
  7. ${darknet_files}
  8. src/main/cpp/darknetlib.c
  9. )
  10. add_library( # Sets the name of the library.
  11. darknetlib
  12. # Sets the library as a shared library.
  13. SHARED
  14. # Provides a relative path to your source file(s).
  15. ${DARKNET_SRC_LISTS}
  16. )

添加JNI接口

添加完成后需要编写中间层JNI调用完成对接也就是 darknetlib.c这个文件初期我做的比较简单没有传递 bitmap 先传递了 文件path 然后调用官方程序代码如下很简单

  1. jdouble
  2. JNICALL
  3. Java_com_example_chenty_demoyolo_Yolo_testyolo(JNIEnv *env, jobject obj, jstring imgfile)
  4. {
  5. double time;
  6. const char *imgfile_str = (*env)->GetStringUTFChars(env, imgfile, 0);
  7. char *datacfg_str = "/sdcard/yolo/cfg/voc.data";
  8. char *cfgfile_str = "/sdcard/yolo/cfg/tiny-yolo-voc.cfg";
  9. char *weightfile_str = "/sdcard/yolo/weights/tiny-yolo-voc.weights";
  10. //char *imgfile_str = "/sdcard/yolo/data/dog.jpg";
  11. char *outimgfile_str = "/sdcard/yolo/out";
  12. time = test_detector(datacfg_str, cfgfile_str,
  13. weightfile_str, imgfile_str,
  14. 0.2f, 0.5f, outimgfile_str, 0);
  15. (*env)->ReleaseStringUTFChars(env, imgfile, imgfile_str);
  16. return time;
  17. }

此处函数传递进来的是需要转换文件的路径 然后执行深度网络 返回值我修改了下返回的是执行时间

Java部分

下面对java层进行添加和修改 和普通Jni差不多

  1. public void yoloDetect(){
  2. new Thread(new Runnable() {
  3. public void run() {
  4. double runtime = testyolo(srcimgpath);
  5. Log.i(TAG, "yolo run time " + runtime);
  6. Message msg = new Message();
  7. msg.what = DETECT_FINISH;
  8. msg.obj = runtime;
  9. mHandler.sendMessage(msg);
  10. }
  11. }).start();
  12. }
  13. public native double testyolo(String imgfile);

打包模型和释放

为了更加便于使用打包了模型文件 并将模型直接拷贝到SD卡这部分是android常规

  1. public void exactresClick(View v){
  2. view_status.setText("exact model, please wait");
  3. copyFilesFassets(this, "cfg", "/sdcard/yolo/cfg");
  4. copyFilesFassets(this, "data", "/sdcard/yolo/data");
  5. copyFilesFassets(this, "weights", "/sdcard/yolo/weights");
  6. view_status.setText("exact model finish");
  7. }

执行结果还是比较满意的

在 小米6上可以跑到1秒左右一张的速度 因为没有使用neon 应该还有优化的空间

apk下载 https://pan.baidu.com/s/1qZbIdXU

CODE:

https://github.com/chentyjpm/DarknetDemoInAndroid/

续YoloV3

https://blog.csdn.net/chentyjpm/article/details/81744570

 



查看原文:http://www.chenty.com/?p=158

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/297921
推荐阅读
相关标签
  

闽ICP备14008679号