1. 前言
上篇文章我们在Android
中使用OpenCV
实现了人脸识别,这篇文章我们使用OpenCV+YOLOv8+NCNN
来实现人像分割的功能。
首先来看下效果,这里会识别出人体,并会用蓝色的框框出来,并会有标签标注识别出的物体是什么,概率是多少。
识别出的人像,会覆盖上一层粉红色,其实就是识别出了整个人体轮廓了。
2. YOLOv8是什么
YOLOv8
是来自 Ultralytics
的2023
年最新的基于 YOLO
的对象检测模型系列,提供了先进的性能。
要了解YOLOv8
,就要先看一下YOLO (you only look once)
的诞生历史,这部分具体详见 童心未泯的 YOLO 之父,Joseph Redmon 笑傲 CV 江湖记,这里就不过多介绍了,我们只需要知道,YOLO
只需要浏览一次就可以识别出图中的物体的类别和位置,并且能够进行图像分割。
3. NCNN是什么
ncnn
是一个为手机端极致优化的高性能神经网络前向计算框架。 ncnn
从设计之初深刻考虑手机端的部署和使用。 无第三方依赖,跨平台,手机端 cpu
的速度快于目前所有已知的开源框架。 基于 ncnn
,开发者能够将深度学习算法轻松移植到手机端高效执行, 开发出人工智能 APP ,将 AI 带到你的指尖。 ncnn
目前已在腾讯多款应用中使用,如:QQ,Qzone,微信,天天 P 图
等。
NCNN
目前已经支持大部分的CNN
网络,包括YOLO
。这意味着YOLO
算法可以集成到NCNN
框架中,并在手机端进行高效执行。因此,NCNN
和YOLO
可以相互结合使用,以实现更快速、更高效的目标检测。
4. OpenCV是什么
OpenCV
是一个跨平台计算机视觉和机器学习软件库,它轻量级而且高效,由一系列 C
函数和少量 C++
类构成,同时提供了Python、Ruby、MATLAB
等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。在本篇文章中,OpenCV
主要是以图像转化与传递的作用引入的。
5. 运行ncnn-android-yolov8-seg
那么,怎么在Android中如何使用OpenCV+YOLOv8+NCNN
呢 ?
首先,我们可以在Github
上找到这个库 : Digital2Slave/ncnn-android-yolov8-seg,内部已经使用OpenCV+YOLOv8+NCNN
,来实现人像分割功能了,这里我们可以来导入这个项目,运行一下看下效果。
5.1 导入ncnn-android-yolov8-seg
我们下载好Digital2Slave/ncnn-android-yolov8-seg的代码后,使用Android Studio 3.6
导入项目。
这个时候,会提示报错
Caused by: java.lang.NullPointerExceptionat com.google.common.base.Preconditions.checkNotNull(Preconditions.java:787)at com.android.build.gradle.internal.ndk.NdkHandler.getPlatformVersion(NdkHandler.java:159)at com.android.build.gradle.internal.ndk.NdkHandler.supports64Bits(NdkHandler.java:332)at com.android.build.gradle.internal.ndk.NdkHandler.getSupportedAbis(NdkHandler.java:404)...
这是因为我们还没有配置NDK
路径
5.2 配置CMake和NDK路径
local.properties
添加如下代码
# 设置cmake路径,这里的路径要改成你的实际cmake路径
cmake.dir=C\:\\Developer\\Android_SDK\\cmake\\3.10.2.4988404
# 设置ndk路径,这里的路径要改成你的实际ndk路径
ndk.dir=C\:\\Developer\\Android_SDK\\ndk\\20.0.5594570
这里会有ndk
版本的问题,需要使用Ndk16
到Ndk20
的版本,高版本的Ndk
会有兼容性问题。
如果使用高版本的
NDK
版本,需要加上fopenmp
5.3 配置 NDK DANDROID_STL
在app
的build.gradle
中,externalNativeBuild
的cmake
代码块中,可以添加如下代码
arguments "-DANDROID_STL=c++_shared"
总体代码如下
externalNativeBuild {cmake {cppFlags "-std=c++11 -frtti -fexceptions"abiFilters 'arm64-v8a'arguments "-DANDROID_STL=c++_shared"}
}
5.4 解决报错 unknown argument
我们再同步一下项目,可以发现报如下错误
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.Error while executing process C:\Developer\Android_SDK\cmake\3.10.2.4988404\bin\cmake.exe with arguments {--build E:\WorkSpace\Demo\Tnn\New\ncnn-android-yolov8-seg\app\.externalNativeBuild\cmake\debug\arm64-v8a --target yolov8ncnn}
...
clang++.exe: error: unknown argument: '-static-openmp'
ninja: build stopped: subcommand failed.
这里我们全局搜索-static-openmp
,将其都删除。
接着重新编译一下 C++ Projects
然后,点击运行,发现项目正常运行起来了。
6. 接入OpenCV+YOLOv8+NCNN
然后我们可以在自己的项目中接入OpenCV+YOLOv8+NCNN
了,但是看了下源码,我们可以发现ncnn-android-yolov8-seg
这个项目里的相机是用的c/c++
,但是在我们项目中,使用的Java
层的Camera API
来实现的API
。
要想在自己项目里集成ncnn
,那就需要把ncnn-android-yolov8-seg
里的核心代码给抽离,然后对接到Java
的Camera API
中。
那需要怎么做呢 ?
下一篇文章来实现一下
详见 : Android 在自己的项目接入OpenCV+YOLOv8+NCNN,实现人像分割-CSDN博客