文章目录
- 1 准备Android项目文件
- 1.1 解压文件
- 1.2 放置ncnn模型文件
- 1.3 放置ncnn和opencv的android文件
- 1.4 修改CMakeLists.txt文件
- 2 手机连接电脑并编译软件
- 2.1 编译软件
- 2.2 更新配置及布局
- 2.3 编译
- 2.4 连接手机
- 3 自己数据集训练模型的部署
- 4 参考
1 准备Android项目文件
1.1 解压文件
下载项目文件ncnn-android-yolov8-seg.zip,并解压。
1.2 放置ncnn模型文件
ncnn-android-yolov8-seg\app\src\main\assets中放入ncnn文件(即模型 的param和bin文件)
修改param和bin文件名为yolov8n-seg.param,yolov8-seg.bin, yolov8sseg.param, yolov8s-seg.bin
1.3 放置ncnn和opencv的android文件
(1) 放置ncnn的安卓文件
https://github.com/Tencent/ncnn/releases
下载ncnn-YYYYMMDD-android-vulkan.zip
我们使用ncnn-20230223-android-vulkan.zip
解压ncnn-YYYYMMDD-android-vulkan.zip后
放置到app/src/main/jni 并修改app/src/main/jni/CMakeLists.txt中的ncnn_DIR
(2) 放置opencv的安卓文件
https://github.com/nihui/opencv-mobile
下载opencv-mobile-XYZ-android.zip
我们使用opencv-mobile-4.6.0-android.zip
解压opencv-mobile-XYZ-android.zip后放置到app/src/main/jni并修改 app/src/main/jni/CMakeLists.txt中的 OpenCV_DIR
1.4 修改CMakeLists.txt文件
ncnn-android-yolov8-seg\app\src\main\jni下面
project(yolov8ncnn)cmake_minimum_required(VERSION 3.10)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 yolo.cpp ndkcamera.cpp)target_link_libraries(yolov8ncnn ncnn ${OpenCV_LIBS} camera2ndk mediandk)
2 手机连接电脑并编译软件
任意投屏软件即可
以小米10手机为例
(1)设置开发者模式 设置->我的设备->全部参数 点击MIUI版本三次
(2)设置USB调试和安装 设置->更多设置->开发者选项 打开USB调试;USB安装
(3)手机通过USB数据线(或WiFi)连接电脑
(4)编译和调试 打开已经存在的项目,选择build.gradle
(5)导出签名apk Build->Generate Signed APK
2.1 编译软件
build,gradle(project)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {repositories {google()mavenCentral() // 替换 jcenter}dependencies {classpath 'com.android.tools.build:gradle:7.2.2' // 更新到兼容版本}
}allprojects {repositories {google()mavenCentral() // 替换 jcenter}
}
build,gradle(app)
apply plugin: 'com.android.application'android {// 使用较新的编译版本compileSdkVersion 33 // 更新到最新的 SDK 版本// buildToolsVersion 可省略,Gradle 会自动选择defaultConfig {applicationId "com.tencent.yolov8ncnn"archivesBaseName = "$applicationId"minSdkVersion 24 // 保持最低支持 SDK 版本targetSdkVersion 33 // 确保与最新规范兼容}externalNativeBuild {cmake {version "3.10.2" // 保持当前的 CMake 版本path file('src/main/jni/CMakeLists.txt') // 指定 CMake 文件路径}}// 使用较新的 AndroidX 库dependencies {implementation 'androidx.core:core:1.9.0'implementation 'androidx.appcompat:appcompat:1.5.1'}// 指定 NDK 版本ndkVersion '24.0.8215888'
}
gradle.properties
## For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
#
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx1024m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
#
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
#Tue Nov 19 12:54:21 CST 2024
systemProp.http.proxyHost=
systemProp.http.proxyPort=80
android.useAndroidX=true
android.enableJetifier=true
gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
local.properties
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Tue Nov 19 11:53:56 CST 2024
sdk.dir=D\:\\software_code\\android\\sdk
cmake.dir=D\:\\software_code\\android\\sdk\\cmake\\3.10.2.4988404
settings.gradle
include ':app'
2.2 更新配置及布局
升级gradle
修改AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.tencent.yolov8ncnn"android:versionCode="1"android:versionName="1.1"><!-- 权限声明 --><uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.camera2.full" /><!-- 应用声明 --><application android:label="@string/app_name"><!-- 活动声明 --><activityandroid:name="MainActivity"android:label="@string/app_name"android:screenOrientation="portrait"android:exported="true"><!-- 意图过滤器 --><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>
在com.tencent.yolov8ncnn.MainActivity重新import
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
2.3 编译
2.4 连接手机
我当前使用usb进行连接
点击run,在手机安装后,并获取权限
结果如图
3 自己数据集训练模型的部署
1)使用YOLOv8模型训练自己的数据集
2)ncnn模型文件的替换
3)修改yolo.cpp文件中的class_names yolo.cpp文件generate_proposals函数中
const int num_class = 80;
改为自己数据集中的类别数
4 参考
https://github.com/Tencent/ncnn
https://github.com/nihui/opencv-mobile
https://github.com/FeiGeChuanShu/ncnn-android-yolov8