文章目录
- 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">
<!-- 活动声明 -->
<activity
android: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