模型部署:(五)安卓端部署Yolov8关键点检测项目全流程记录
模型部署:(五)安卓端部署Yolov8关键点检测项目全流程记录
- 0、先展示测试效果
- 1、模型下载并测试
- 2、使用pnnx对模型进行转换**
- 3、构建安卓项目
0、先展示测试效果
n级别检测模型CPU检测:
n级别检测模型GPU检测:
S级别检测模型CPU检测:
S级别检测模型GPU检测:
1、模型下载并测试
创建虚拟环境:
conda create -n yolov8_pose python=3.10
ncnn不支持scatterND算子。
解决思路:尝试先将模型解析为TorchScript(torchscript可以将深度学习中一些复杂的处理算子解析为由多个简单算子组合的复杂算子来完成计算),然后使用pnnx转为ncnn可以解析的模型。
pip install torch==2.0.0 torchvision==0.15.1 torchaudio==2.0.1 --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install ultralytics --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
安装的版本是:ultralytics==8.3.201
或者拉取github官方项目利用源码进行安装
https://github.com/ultralytics/ultralytics/tree/v8.3.201
下载到本地执行如下语句进行源码安装
pip install -e. --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install ncnn==1.0.20250916 --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
安装的版本是:ncnn==1.0.20250916
执行如下脚本:
其会自动下载ultralytics对应版本的模型文件
from ultralytics import YOLOmodel_n = YOLO("yolov8n-pose.pt") # 自动下载对应版本的预训练权重
model_s = YOLO("yolov8s-pose.pt") # 自动下载对应版本的预训练权重
model_m = YOLO("yolov8m-pose.pt") # 自动下载对应版本的预训练权重
model_l = YOLO("yolov8l-pose.pt") # 自动下载对应版本的预训练权重
model_x = YOLO("yolov8x-pose.pt") # 自动下载对应版本的预训练权重
# 模型测试
from ultralytics import YOLO# 加载模型
model = YOLO("yolov8n-pose.pt")
# 对单张图片推理
results = model("test.jpg", imgsz=640)
# 显示结果
results[0].show()
# 保存检测后的图像
results[0].save("pose_result.jpg")"""
# 会下载ultralytics对应版本的模型文件
wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s-seg.pt
"""
2、使用pnnx对模型进行转换**
导出NCNN模型
使用 yolo CLI
yolo export model=yolov8s-pose.pt format=ncnn # export official model
或者使用python脚本执行如下指令:
from ultralytics import YOLO# Load a model
model = YOLO('yolov8s-pose.pt') # load an official model# Export the model
model.export(format='ncnn')from ultralytics import YOLO# Load a model
model = YOLO('yolov8n-pose.pt') # load an official model# Export the model
model.export(format='ncnn')
注意:
上述指令执行后,其会先下载yolov8s-pose.pt模型,然后再下载所需的pnnx包文件需要访问外网,导致下载失败,我的解决方案是复制下载链接,科学上网下载,然后拷贝至根目录下,并在根目录下重新执行上述指令
https://github.com/pnnx/pnnx/releases/download/20250912/pnnx-20250912-linux.zip
得到经过转换的相关文件
3、构建安卓项目
我的android-studio版本如下所示:
android-studio-2022.2.1.19-windows
将上述转换得到的模型放置在目录D:\project\new-ncnn-android-yolov8-pose-main\app\src\main\assets目录下
按照如下步骤下载对应的ncnn与opencv-mobile相关文件,并拷贝至对应的目录下
如下所示:
并修改对应的CMakeLists.txt文件中,ncnn与opencv-mobile的文件路径,如下所示:
project(yolov8ncnn)cmake_minimum_required(VERSION 3.10)# opencv4 requires c++11
set(CMAKE_CXX_STANDARD 11)set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.6.0-android/sdk/native/jni)
find_package(OpenCV REQUIRED core imgproc)set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20230223-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
find_package(ncnn REQUIRED)add_library(yolov8ncnn SHARED yolov8ncnn.cpp yolov8.cpp ndkcamera.cpp yolov8pose.cpp)target_link_libraries(yolov8ncnn ncnn ${OpenCV_LIBS} camera2ndk mediandk)
根据自己实际需求调整local.properties文件中cmake、ndk、sdk的本地路径
cmake.dir=D\:\\Android_SDK\\Sdk\\cmake\\3.10.2.4988404
ndk.dir=D\:\\Android_SDK\\Sdk\\ndk\\24.0.8215888
sdk.dir=D\:\\Android_SDK\\Sdk
重构项目,然后打成apk包
在打包成apk时会出现报错,信息如下:
Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to unnamed module @56faf93f
我的解决方案是更换较高版本的AGP,如下所示:
再次重构项目并打apk包
测试效果如下所示: