前言:本文适合想要把深度学习模型部署到安卓手机上,但又不想学习java的开发者;复刻别人的整个项目,换成自己的模型,魔改他们的项目。
ps: 吐槽一下,当小厂的算法开发太苦啦,py/c++/java都要会,从爬虫收集数据->查文献->复现文献->各种边缘设备部署都要会,简直要全能啊。
先看成品,左边nanodet,右边直线检测结果
------------------
本文用到的模型
- 请跑通lanedetect,其中一个是原版C++实现的直线检测,另外一个是给安卓使用的C++代码。
- 本文的安卓项目
正文
- 下文统称nanodet为老项目,我们建立的项目为新项目
- 读者首先需要正确安装android studio(AS),并已经成功把别人的项目安卓到手机上;本文以nanodet项目为例。假设读者已经把他的nanodet部署到手机上了,接下来进行下一步。
- 打开AS创建一个新的native C++项目,工程名为tfjtest,直接下一步下一步,finish等待项目构建完成。
- 修改新项目下的gradle scripts:
- 复制老项目中的build.gradle(project)内的所有内容替换新项目中的build.gradle(projects).
- 复制老项目中的build.gradle(module)内的所有内容替换新项目中的build.gradle(module);
- gradle-wrapper.properties全部替换。
- setting.gradle全部替换。
- local.properties全部替换。
- 进入src/main中,把lanedetect提供的mlsd_with_max_sigmoid.mnn放入assets中,没有这文件夹就创建,下同;
- 进入src/main/cpp中,把nanodet它里面对应的mnn和opencv文件夹拷贝过来;进入mnn文件夹,用自己编译出来的 build_64/libMNN.so替换掉arm64-v8a/libMNN.so. build_32/libMNN.so替换掉armeabi-v7a/libMNN.so,用自己编译出来的MNN头文件替换掉原来的mnn/include。
- 编写自己的cmakelists.txt(按照我给的稍微修改)。
- 把我提供的lanedetect_mnn_android中的lane.cpp和lane.hpp放到当前文件下。
- 把旧项目中的jni_interface.cpp拷贝过来,这是java调用C++的接口文件,这里面主要修改的有:
Java_com_wzt_mnn_model_NanoDet_init 改为 Java_com_example_tfjtest_model_LaneDetect_init
- 这个意思是java/com/example/tfjtest/model/LaneDetect中有个init函数;同理修改
Java_com_wzt_mnn_model_NanoDet_detect改为Java_com_example_tfjtest_model_LaneDetect_detect;NanoDet改为LaneDetect;auto box_cls = env->FindClass("com/wzt/mnn/model/BoxInfo") 改为 auto line_cls = env->FindClass("com/example/tfjtest/model/LaneInfo");
- ; 以及
auto cid = env->GetMethodID(box_cls, "<init>", "(FFFFIF)V");改为auto cid = env->GetMethodID(line_cls, "<init>", "(FFFFFF)V");(FFFFFF)这个表示LaneInfo中的成员变脸的类型
- 。还有这个
jobject obj = env->NewObject(box_cls, cid, box.x1, box.y1, box.x2, box.y2, box.label, box.score);改为jobject obj = env->NewObject(line_cls, cid, line.x1, line.y1, line.x2, line.y2, line.lens, line.conf); 这是直线的类型
- 。读者可自行对照修改。
- 在com.example.tfjtest创建activity和model文件夹,把旧项目这里面的四个文件拖过来。MainActivity里主要修改阈值/调整阈值的那个bar/画直线图这些,读者可根据我的安卓项目做对应做修改。
- welcome activity里修改个模型名称。
- model下的两个文件修改为我安卓工程中的文件。
- 构建工程!!!!
若有问题,你可以单独构建两个本文提供的两个安卓项目直线检测和nanodet,相信你一定可以的 : >
最后,祝读者一次成功~!
更新
完成直线检测ncnn安卓部署:
- 参考的目标检测ncnn安卓项目: https://github.com/nihui/ncnn-android-nanodet
- 我魔改的直线检测安卓项目:https://github.com/TnoobT/lanedetect_android_ncnn
- 直线检测ncnn C++版本:https://github.com/TnoobT/lanedetect_ncnn
( 在我的天玑8100手机上,ncnn fps 11左右,mnn fps 5左右)