当前位置: 首页 > news >正文

【YOLOv8】安卓端部署-2-项目实战

文章目录

  • 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

相关文章:

【YOLOv8】安卓端部署-2-项目实战

文章目录 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…...

第二十四章 Spring之源码阅读——AOP篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...

Linux配置MySQL自动备份

Linux配置MySQL自动备份 配置MySQL的自动备份首先要编辑一个备份脚本然后配置开启Linux定时任务即可&#xff0c;下面是具体配置 1、配置备份脚本并测试执行 1.1 编写备份脚本 #这里创建脚本名为mysql_backups.sh mkdir ~/mysqlmulu touch ~/mysqlmulu/mysql_backups.sh#!/…...

qt 之 QDockWidget设置不可拖动

在Qt中&#xff0c;可以通过设置QDockWidget的属性来禁止它被拖动。你可以使用QDockWidget::setFeatures方法并传递QDockWidget::DockWidgetMovable作为参数来禁用拖动功能。 以下是一个简单的示例代码&#xff0c;展示了如何设置QDockWidget为不可拖动&#xff1a; #include …...

【Java知识】Java性能测试工具JMeter

一文带你了解什么是JMeter 概述JMeter的主要功能&#xff1a;JMeter的工作原理&#xff1a;JMeter的应用场景&#xff1a;JMeter的组件介绍&#xff1a; 实践说明JMeter实践基本步骤&#xff1a;JMeter实践关键点&#xff1a; JMeter支持哪些参数化技术&#xff1f;常见插件及其…...

Git 安装

一、下载安装包 Git官网 https://git-scm.com/ Git 阿里镜像 二、安装 点击安装包运行&#xff0c;基本上一路 next 就行。 使用许可声明 选择安装目录 选择组件&#xff0c;默认勾选就行 选择开始菜单文件夹&#xff0c;默认就行 选择 Git 的默认编译器&#xff0c;默认 V…...

【Python】FastAPI:Token认证

FastAPI&#xff1a;Token认证 本教程通过 FastAPI 实现用户登录和基于 JWT&#xff08;JSON Web Token&#xff09; 的认证与授权&#xff0c;适合初学者到进阶用户。教程特别关注 Depends、OAuth2PasswordBearer 等非基础操作的详细讲解&#xff0c;帮助你全面掌握相关技术。…...

【FAQ】HarmonyOS SDK 闭源开放能力 —ArkUI

1.问题描述&#xff1a; App启动的时候会有个弹框&#xff0c;询问用户是否需要进去隐私模式&#xff0c;在该隐私模式下&#xff0c;App不能获取任何用户信息。当前鸿蒙App级别是否有隐私模式&#xff1f; 解决方案&#xff1a; 当前实现隐私模式都是三方应用自己实现&…...

ubuntu没有了有线网络如何修复

今天打开ubuntu之后发现有线网络连接没有了&#xff0c;如下图&#xff0c;此时是修复好之后的&#xff0c;“有线”部分存在&#xff0c;出现问题时是不存在的 此时只需要修改NetworkManager.conf配置文件&#xff0c;将managedfalse更改为managedtrue,保存退出就可以了 sudo…...

渗透学习之windows基础

引路Windows基础之病毒编写&#xff08;完结&#xff09;_哔哩哔哩_bilibili windows基础&#xff08;2&#xff09; 21 ftp 23 tenlet 80 web 80-89 可能是web 443 ssl心脏滴血漏洞以及一些web漏洞测试 445 smb 1433 msspl 1521 oracle 2082/2083 cpanel 主机管理系…...

【Swift】运算符

文章目录 术语赋值运算符算数运算符基本四则算术运算符求余运算符一元负号运算符一元正号运算符 比较运算符三元运算符空合运算符区间运算符闭区间运算符半开区间运算符单侧区间运算符 逻辑运算符逻辑非运算符逻辑与运算符逻辑或运算符逻辑运算符组合计算 位运算符运算符优先级…...

minikube start --driver=docker 指定国内镜像

要在Ubuntu 22上使用Minikube并指定国内镜像&#xff0c;你可以根据以下步骤操作&#xff1a; 安装Minikube&#xff1a; 你可以通过阿里云提供的国内源来安装Minikube&#xff0c;这样可以避免访问国外源的问题。使用以下命令安装Minikube&#xff1a; curl -Lo minikube http…...

Quality minus junk论文阅读

Quality minus junk论文阅读 文章目录 Quality minus junk论文阅读 AbstractTheoretical FrameworkEmpirical AnalysisDataQuality scorePortfoliosEx ante quality forecasts fundamentals Results and DiscussionThe price of qualityUnderstanding the price of quality: th…...

Apache和HTTPS证书的生成与安装

摘要 介绍linux系统下使用openssl生成https证书&#xff0c;并将证书安装在apache服务器上&#xff0c;最终实现通过https访问服务器。这个过程涉及到openssl生成自签名证书&#xff08;适用于测试环境&#xff09;&#xff0c;修改apache配置&#xff0c;开放防火墙https端口…...

前端—Cursor编辑器

在当今快速发展的软件开发领域&#xff0c;效率和质量是衡量一个工具是否优秀的两个关键指标。今天&#xff0c;我要向大家推荐一款革命性的代码编辑器——Cursor&#xff0c;它集成了强大的AI功能&#xff0c;旨在提高开发者的编程效率。以下是Cursor编辑器的详细介绍和推荐理…...

【数据结构】【线性表】【练习】删除链表倒数第n个结点

目录 申明 题目 分析题目信息 解题思路 代码解析 技巧解析&#xff1a;创建虚拟头结点 时间复杂度分析 思考&#xff1a;能否只用一趟扫描实现&#xff1f; 双指针 双指针解题思路 代码解析 申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c…...

MySQL高级(四):索引

基础概念 什么是索引&#xff1f; 索引是一种数据结构&#xff0c;用于加速查询的过程。它类似于书本的目录&#xff0c;可以快速定位数据行。MySQL 索引主要是基于 B 树&#xff08;也有其他类型如哈希索引、全文索引等&#xff09;来实现的。 为什么使用索引&#xff1f; …...

hhdb数据库介绍(9-21)

计算节点参数说明 checkClusterBeforeDnSwitch 参数说明&#xff1a; PropertyValue参数值checkClusterBeforeDnSwitch是否可见否参数说明集群模式下触发数据节点高可用切换时&#xff0c;是否先判断集群所有成员正常再进行数据节点切换默认值falseReload是否生效是 参数设…...

React中组件通信的几种方式

在构建复杂的React应用时&#xff0c;组件之间的通信是至关重要的。从简单的父子组件通信到跨组件状态同步&#xff0c;不同组件之间的通信方式多种多样。 1. 父子组件通信 父子组件通信是 React 中最基本的通信方式之一。在这种模式下&#xff0c;数据是从父组件通过 props …...

python脚本实现csv中百度经纬度转84经纬度

数据准备 csv文件,带百度经纬度字段:bd09_x,bd09_y 目的 将百度经纬度转换为84经纬度,并在csv文件中添加两个字段:84_x,84_y python脚本 from ChangeCoordinate import ChangeCoordimport pandas as pd import numpy as npcoord = ChangeCoord()def bd09_to_wgs84...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...