前言
最近刚写完论文,终于能做自己喜欢的东西了。 希望。 我以前学过一段时间安卓,觉得移动端的APP开发和电脑上的软件,比如Qt,有很大的区别,APP开发更开心,实用价值也更大。
Yolov3是一种非常好的深度学习目标检测算法,一旦Yolov3与安卓相遇,Yolov3不仅可以开发实验室,还可以开发很多有趣的App:
例如使用Yolov3识别游戏中的角色,或者辅助游戏
行人检测识别
食物检测识别
.
本文主要内容:基于NCNN库实现安卓端Yolov3深度学习目标检测
说明一下,本文并不是将darknet yolov3直接移植到安卓中,而是在性能的基础上采用ncnn库
NNN库编译
人工智能建设
安卓端opencv配置
传递JNI Java C参数
开发环境
Ubuntu 18.04
安卓studio 3.2,with安卓ndk r16b
ncnn
“APP效果图”
1.png
需要APP主页、动态申请权限
2.png
在APP主页,大Darknet徽标,背景是纯黑的,帅吗
3.png
第二个接口选择图像,目标检测经典图像
4.png
5.png
6.png
您可以在此设定多线程、线程数
7.png
这是检测结果,检测识别了汽车Car
8.png
各项可以点击查看详细内容
9.png
绘制的检查结果
安卓端Yolov3的实现
NNN库编译
NCNN库是面向移动平台加速发展的开源深度神经网络计算库。
https://github.com/Tencent/ncnn
开源工程已经编译了安卓平台的静态库,可以直接使用。 但是,考虑到实际开发编译环境的差异,最好自己编译一次。
image.png
编译详细步骤:
image.png
image.png
image.png
具体步骤请参照官方网站。 现在,我想谈谈我踩过的洞:
安卓ndk版本
ndk版本不是很新,容易出现错误!
安装Android SDK时,默认情况下ndk安装在sdk/ndk-bundle目录中。 您可以在androidstudiosdkmanager/SDK工具中找到具体的版本号。
安卓SDK目录
安卓ndk目录
除了使用Android SDK附带的ndk外,还可以手动下载Android ndk并将其解压缩到一个目录中。
image.png
image.png
在Ubuntu中,可以通过配置Android ndk来编译nccn库,如图所示。
image.png
image.png
image.png
目前,安卓手机支持64位,因此通常会编译两个版本的lib
版本
平台平台
armeabi-v7a
arm 32位库
arm64-v8a
arm 64位库
opencv部署
需要下载oepncv for android sdk
image.png
image.png
lign="center">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动态链接库。
此篇主要是工程配置,后续再写代码实现...