前言
最近论文刚刚写完,终于可以做一些自己喜欢的东西了,Happy。之前学过一段时间Android, 感觉移动端App开发和PC上的软件,比如Qt, 存在很大的不同,App开发更好玩一些,而且实用价值也比较大。
Yolov3是一个非常棒的深度学习目标检测算法,如果Yolov3与Android相遇,那yolov3就可以发挥更大的价值,而不仅仅停留在实验室, 在此基础上可以开发出许多有趣的App:
比如采用Yolov3识别游戏中的角色,游戏辅助
行人检测识别
食物检测识别
......
本文主要内容:基于NCNN库实现Android端Yolov3深度学习目标检测
说明一点,本文不是直接将darknet yolov3移植到android上,考虑到性能采用ncnn库
NCNN库编译
Android工程搭建
Android端 opencv配置
JNI Java C++参数传递
开发环境
Ubuntu 18.04
Android Studio 3.2, with android ndk r16b
ncnn
App效果图
1.png
App主页面, 需要动态申请权限
2.png
App主页面, 一个大大的darknet logo,背景纯黑色,是不是很酷
3.png
第二个界面, 选择图像, 目标检测经典图片
4.png
5.png
6.png
这里可以设置多线程,线程数量
7.png
这是检测结果, 检测识别到汽车Car
8.png
每一项可以点击进去,查看详情
9.png
绘制的检测结果
Android端Yolov3实现
NCNN库编译
NCNN库是腾讯优图的一个开源深度神经网络计算库,专为移动平台加速。
https://github.com/Tencent/ncnn
开源工程已经编译好了Android平台的静态库,可以直接用。但是考虑到实际开发编译环境的不同,因此最好自己编译一次。
image.png
编译的详细步骤:
image.png
image.png
image.png
具体步骤见官网,这里我就说一下踩过的坑:
Android NDK版本
ndk版本不要太新的,容易出BUG!!!
在安装Android SDK时候,ndk默认安装在sdk/ndk-bundle目录, 具体的版本号在Android studio SDK Manager/SDK Tools中可以查看。
android sdk目录
android ndk目录
除了使用Android SDK自带的ndk之外,还可以手动下载Android ndk, 解压在一个目录。
image.png
image.png
在Ubuntu上只要配置好Android ndk就可以编译好nccn库,如图:
image.png
image.png
image.png
目前Android手机普遍支持64bit, 所以一般编译出两个版本的lib
版本
平台
armeabi-v7a
ARM 32bit库
arm64-v8a
ARM 64bit库
opencv的导入
需要下载oepncv for android sdk
image.png
image.png
image.png
在opencv sdk目录中包含 java以及native
类型
作用
java
opencv java类,接口
native
C++ 链接库
image.png
opencv中包含诸多编译好的链接库:
类型
描述
arm64-v8a
ARM 64bit
armeabi
ARM 早期的二进制接口ABI
armeabi-v7a
ARM 32bit
mips
others
x86
Intel x86 cpu架构
x86_x64
Intel x86 64bit CPU
一般的Android手机,大多数使用这两足以:
armeabi-v7a
arm64-v8a
动态链接库
image.png
本工程中,在Java层以及C++层同时导入opencv库
Java层: 导入opencv-android-sdk/sdk/java 模块
C++层: 在CMakeList.txt中引入
Java层引入opencv
File->New->Import Module
image.png
image.png
image.png
导入之后,修改sdk版本,与 Module:app的版本保持一致。然后在Project Structure中导入Module
image.png
image.png
image.png
image.png
image.png
C++层导入opencv
通过配置CMakeList.txt即可
image.png
image.png
image.png
最后,将so复制到android工程:
image.png
image.png
image.png
Android工程搭建
进行android开发采用的工具Android Studio, AS比较卡,吃内存, 编译时间巨慢。Ubuntu系统还好些,比windows快很多。
image.png
因为NCNN库是C++实现的,因此在创建Android工程时候务必选择 include C++, C++版本一般选C++14, C++11即可。这是已经完工之后的Android工程。
工程包含3个Module:
app
openCVLibrary343
yolov3
其中app是创建工程自带的,一些启动界面包含于此;openCVLibrary343是在opencv官网下载的, opencv for android sdk, 里面包含大量Java opencv 类实现,以及编译好的动态链接库 opencv_java3.so; yolov3模块是自己新建的,包含yolo目标检测算法的实现以及Java接口的封装, 创建一个yolo模块的目的是可以往不同工程中直接导入,方便移植。
image.png
模块的导入
image.png
NCNN库引入
引入ncnn库的目的是加载yolov3网络,网络模型,进行forword计算。
ncnn库的导入比较简单:
将include复制到cpp目录
将libncnn.a复制到armeabi-v7a, arm64-v8a
在CMakeList.txt中引入
image.png
image.png
image.png
image.png
image.png
此CMakeList.txt文件根据配置将生成libyolo.so动态链接库。
此篇主要是工程配置,后续再写代码实现...