yolov3安卓实现_Android—yolov3目标检测移植

前言

最近论文刚刚写完,终于可以做一些自己喜欢的东西了,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动态链接库。

此篇主要是工程配置,后续再写代码实现...

你可能感兴趣的:(yolov3安卓实现)