安卓部署:手机端Anchor-free的目标检测模型Nanodet
Nanodet
深度学习目标检测已经发展了许多年,从Two-stage到One-stage,从Anchor-base到Anchor-free,再到今年的用Transformer做目标检测,各种方法百花齐放,但是在移动端目标检测算法上,yolo系列和SSD等Anchor-base的模型一直占据着主导地位。这个项目的主要目的是希望能够开源一个移动端实时的Anchor-free检测模型,能够提供不亚于yolo系列的性能,而且同样方便训练和移植。 看了大佬的文章介绍,整个项目主要是基于轻量级,Anchor-free。网络模型选择的是ShuffleNetV2,可以对其他轻量级模型进行尝试(MobileNet系列,GhostNet,还有最近的EfficientNet)其实自己魔改一个也不错。 其次是损失函数,基于FCOS的轻量化(centerness分支在轻量级的模型上很难收敛) 解决:GFocalLoss完美去掉了FCOS系列的Centerness分支,而且在coco数据集上涨点显著。GFL的出现不仅去掉了难以训练的Centerness,而且还省去了这一分支上的大量卷积,减少了检测头的计算开销,非常适合移动端的轻量化部署。 目前也新出了GFLV2,应该对模型还有提升。还有ATSS,对于正负样本的选择,也比较影响在实时端的推理速度。
本人训练了一下其它数据集,发现效果也不错。 在此记录一下实际安卓操作步骤。 借鉴:https://github.com/nihui/ncnn-android-benchmark 致敬:https://github.com/RangiLyu/nanodet
首先第一步下载ncnn-android-vulkan.zip
链接:https://github.com/Tencent/ncnn/releases *android 静态库/动态库,支持 GPU
打开下载包,将这四个文件复制到nihui大佬项目的appsrcmainjni下 并更改你的CMakeLists.txt文件 主要是更改ncnn_DIR路径,将对应的ncnn版本更改为你下载的ncnn-android-vulkan.zip版本
project(nanodetncnn) cmake_minimum_required(VERSION 3.10) set(OpenCV_DIR ${ CMAKE_SOURCE_DIR}/opencv-mobile-4.5.1-android/sdk/native/jni) find_package(OpenCV REQUIRED core imgproc) set(ncnn_DIR ${ CMAKE_SOURCE_DIR}/202107202c4ae09/${ ANDROID_ABI}/lib/cmake/ncnn) find_package(ncnn REQUIRED) add_library(nanodetncnn SHARED nanodetncnn.cpp nanodet.cpp ndkcamera.cpp) target_link_libraries(nanodetncnn ncnn ${ OpenCV_LIBS} camera2ndk mediandk)
准备Android Studio 一路next
然后设置Android SDK 主要是勾选安卓版本 我的Android Studio是2019的 这里最多选择Android10.0 选择cmke NDK 务必选择上 不然无法编译。
在编译过程中可能出现问题:
这里推荐一个万能解决方法(但是很费时间): 打开C:UsersAdmin 删除**.gradle**文件 即可重新编译。 NDK路径设置: 即可打开原本项目进行编译 激动人心的时刻。 将安卓手机连接电脑,将手机设置为开发者模式,并打开USB调试 启动项目,等待安装。 手机里面出现nanodetncnn,完成!!!! 跑的基本模型,cpuFPS可以达到25左右,可以说效果非常不错。 接下来打算训练自己的数据集,也可以尝试下其他backbone或者方法,并进行ncnn推理移植到移动端,后续更新!!!