• Android 导入ncnn-android-yolov8-seg : 实现人体识别和人像分割


    1. 前言

    上篇文章我们在Android中使用OpenCV实现了人脸识别,这篇文章我们使用OpenCV+YOLOv8+NCNN 来实现人像分割的功能。

    首先来看下效果,这里会识别出人体,并会用蓝色的框框出来,并会有标签标注识别出的物体是什么,概率是多少。
    识别出的人像,会覆盖上一层粉红色,其实就是识别出了整个人体轮廓了。

    在这里插入图片描述

    2. YOLOv8是什么

    YOLOv8 是来自 Ultralytics2023年最新的基于 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框架中,并在手机端进行高效执行。因此,NCNNYOLO可以相互结合使用,以实现更快速、更高效的目标检测。

    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.NullPointerException
    	at 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)
    	...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这是因为我们还没有配置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
    
    • 1
    • 2
    • 3
    • 4

    5.3 配置 NDK DANDROID_STL

    appbuild.gradle中,externalNativeBuildcmake代码块中,可以添加如下代码

    arguments "-DANDROID_STL=c++_shared"
    
    • 1

    总体代码如下

    externalNativeBuild {
        cmake {
            cppFlags "-std=c++11 -frtti -fexceptions"
            abiFilters 'arm64-v8a'
            arguments "-DANDROID_STL=c++_shared"
        }
    }   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.4 解决报错 unknown argument

    我们再同步一下项目,可以发现报如下错误,使用ndk16ndk20都会出现这个报错。

    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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    5.4.1 解决方式一

    这里我们全局搜索-static-openmp,将其都删除。

    在这里插入图片描述

    5.4.2 解决方式二

    使用高版本的NDK,比如NDK 25.1.8937393

    # 设置cmake路径,这里的路径要改成你的实际cmake路径
    cmake.dir=C\:\\Developer\\Android_SDK\\cmake\\3.10.2.4988404
    # 设置ndk路径,这里的路径要改成你的实际ndk路径
    ndk.dir=C\:\\Developer\\Android_SDK\\ndk\\25.1.8937393
    
    • 1
    • 2
    • 3
    • 4
    5.4.3 重新编译运行

    接着重新编译一下 C++ Projects
    在这里插入图片描述
    然后,点击运行,发现项目正常运行起来了。
    在这里插入图片描述

    6. 接入OpenCV+YOLOv8+NCNN

    然后我们可以在自己的项目中接入OpenCV+YOLOv8+NCNN了,但是看了下源码,我们可以发现ncnn-android-yolov8-seg这个项目里的相机是用的c/c++,但是在我们项目中,使用的Java层的Camera API来实现的API

    在这里插入图片描述

    要想在自己项目里集成ncnn,那就需要把ncnn-android-yolov8-seg里的核心代码给抽离,然后对接到JavaCamera API中。

    那需要怎么做呢 ?

    下一篇文章来实现一下

    详见 : Android 在自己的项目接入OpenCV+YOLOv8+NCNN,实现人像分割-CSDN博客

  • 相关阅读:
    5.代理设计模式
    TCP/IP的基础知识
    嵌入式编程实现记录开发板启动次数
    golang基础复合类型—map
    深入理解synchronized关键字
    python安装selselenium,chromedriver,秒杀脚本教程
    【华为机试真题 JAVA】最大嵌套括号深度-100
    牛血清白蛋白/人血清白蛋白/卵清白蛋白/小鼠血清白蛋白纳米粒改性Angiopep血管肽(2022已更新)
    Mendeley在linux中无法打开APPimage
    经典算法-枚举法(百钱买百鸡问题)
  • 原文地址:https://blog.csdn.net/EthanCo/article/details/133383640