1. 前言
上篇文章我們在Android
中使用OpenCV
實(shí)現(xiàn)了人臉識(shí)別,這篇文章我們使用OpenCV+YOLOv8+NCNN
來實(shí)現(xiàn)人像分割的功能。
首先來看下效果,這里會(huì)識(shí)別出人體,并會(huì)用藍(lán)色的框框出來,并會(huì)有標(biāo)簽標(biāo)注識(shí)別出的物體是什么,概率是多少。
識(shí)別出的人像,會(huì)覆蓋上一層粉紅色,其實(shí)就是識(shí)別出了整個(gè)人體輪廓了。
2. YOLOv8是什么
YOLOv8
是來自 Ultralytics
的2023
年最新的基于 YOLO
的對象檢測模型系列,提供了先進(jìn)的性能。
要了解YOLOv8
,就要先看一下YOLO (you only look once)
的誕生歷史,這部分具體詳見 童心未泯的 YOLO 之父,Joseph Redmon 笑傲 CV 江湖記,這里就不過多介紹了,我們只需要知道,YOLO
只需要瀏覽一次就可以識(shí)別出圖中的物體的類別和位置,并且能夠進(jìn)行圖像分割。
3. NCNN是什么
ncnn
是一個(gè)為手機(jī)端極致優(yōu)化的高性能神經(jīng)網(wǎng)絡(luò)前向計(jì)算框架。 ncnn
從設(shè)計(jì)之初深刻考慮手機(jī)端的部署和使用。 無第三方依賴,跨平臺(tái),手機(jī)端 cpu
的速度快于目前所有已知的開源框架。 基于 ncnn
,開發(fā)者能夠?qū)⑸疃葘W(xué)習(xí)算法輕松移植到手機(jī)端高效執(zhí)行, 開發(fā)出人工智能 APP ,將 AI 帶到你的指尖。 ncnn
目前已在騰訊多款應(yīng)用中使用,如:QQ,Qzone,微信,天天 P 圖
等。
NCNN
目前已經(jīng)支持大部分的CNN
網(wǎng)絡(luò),包括YOLO
。這意味著YOLO
算法可以集成到NCNN
框架中,并在手機(jī)端進(jìn)行高效執(zhí)行。因此,NCNN
和YOLO
可以相互結(jié)合使用,以實(shí)現(xiàn)更快速、更高效的目標(biāo)檢測。
4. OpenCV是什么
OpenCV
是一個(gè)跨平臺(tái)計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,它輕量級而且高效,由一系列 C
函數(shù)和少量 C++
類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB
等語言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。在本篇文章中,OpenCV
主要是以圖像轉(zhuǎn)化與傳遞的作用引入的。
5. 運(yùn)行ncnn-android-yolov8-seg
那么,怎么在Android中如何使用OpenCV+YOLOv8+NCNN
呢 ?
首先,我們可以在Github
上找到這個(gè)庫 : Digital2Slave/ncnn-android-yolov8-seg,內(nèi)部已經(jīng)使用OpenCV+YOLOv8+NCNN
,來實(shí)現(xiàn)人像分割功能了,這里我們可以來導(dǎo)入這個(gè)項(xiàng)目,運(yùn)行一下看下效果。
5.1 導(dǎo)入ncnn-android-yolov8-seg
我們下載好Digital2Slave/ncnn-android-yolov8-seg的代碼后,使用Android Studio 3.6
導(dǎo)入項(xiàng)目。
這個(gè)時(shí)候,會(huì)提示報(bào)錯(cuò)
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)
...
這是因?yàn)槲覀冞€沒有配置NDK
路徑
5.2 配置CMake和NDK路徑
local.properties
添加如下代碼
# 設(shè)置cmake路徑,這里的路徑要改成你的實(shí)際cmake路徑
cmake.dir=C\:\\Developer\\Android_SDK\\cmake\\3.10.2.4988404
# 設(shè)置ndk路徑,這里的路徑要改成你的實(shí)際ndk路徑
ndk.dir=C\:\\Developer\\Android_SDK\\ndk\\20.0.5594570
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 解決報(bào)錯(cuò) unknown argument
我們再同步一下項(xiàng)目,可以發(fā)現(xiàn)報(bào)如下錯(cuò)誤,使用ndk16
到ndk20
都會(huì)出現(xiàn)這個(gè)報(bào)錯(cuò)。
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.
5.4.1 解決方式一
這里我們?nèi)炙阉?code>-static-openmp,將其都刪除。
5.4.2 解決方式二
使用高版本的NDK
,比如NDK 25.1.8937393
# 設(shè)置cmake路徑,這里的路徑要改成你的實(shí)際cmake路徑
cmake.dir=C\:\\Developer\\Android_SDK\\cmake\\3.10.2.4988404
# 設(shè)置ndk路徑,這里的路徑要改成你的實(shí)際ndk路徑
ndk.dir=C\:\\Developer\\Android_SDK\\ndk\\25.1.8937393
5.4.3 重新編譯運(yùn)行
接著重新編譯一下 C++ Projects
然后,點(diǎn)擊運(yùn)行,發(fā)現(xiàn)項(xiàng)目正常運(yùn)行起來了。
6. 接入OpenCV+YOLOv8+NCNN
然后我們可以在自己的項(xiàng)目中接入OpenCV+YOLOv8+NCNN
了,但是看了下源碼,我們可以發(fā)現(xiàn)ncnn-android-yolov8-seg
這個(gè)項(xiàng)目里的相機(jī)是用的c/c++
,但是在我們項(xiàng)目中,使用的Java
層的Camera API
來實(shí)現(xiàn)的API
。
要想在自己項(xiàng)目里集成ncnn
,那就需要把ncnn-android-yolov8-seg
里的核心代碼給抽離,然后對接到Java
的Camera API
中。
那需要怎么做呢 ?
下一篇文章來實(shí)現(xiàn)一下文章來源:http://www.zghlxwxcb.cn/news/detail-765562.html
詳見 : Android 在自己的項(xiàng)目接入OpenCV+YOLOv8+NCNN,實(shí)現(xiàn)人像分割-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-765562.html
到了這里,關(guān)于Android 導(dǎo)入ncnn-android-yolov8-seg : 實(shí)現(xiàn)人體識(shí)別和人像分割的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!