轻量化的yolov8部署到安卓Android手机端
一、pytorch环境配置和yolov8源码安装
首先在电脑上需要配置好pytorch环境,和yolov8源码的下载
然后针对yolov8做自己的轻量化改进
二、下载Android Studio和ncnn-android-yolov8
1. Android Studio官网链接:
下载 Android Studio 和应用工具 - Android 开发者 | Android Developers
自行配置AS环境和JDK
我参考了这个:Android Studio 开发环境快速搭建(超详细)_配置android 开发环境-CSDN博客
(1)JDK下载:
官网站:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
同意协议后,下载相应版本的JDK
(2)配置JDK及JAVA的环境
打开计算机的属性/高级设置/环境变量/,

配置JAVA_HOME:
变量名:JAVA_HOME
变量值:JDK安装目录(复制jdk的路径,也就是我们前面安装JDK时设置的路径)
具体见那个链接


(3)安装cmake
注意安装的是cmake3.10版本。

手机安卓版本选择相应的安卓版本,我的是荣耀70,直接下载sdk,对应的是安卓14。

2. 下载ncnn-android-yolov8项目:
https://github.com/FeiGeChuanShu/ncnn-android-yolov8
3. 下载opencv-mobile和ncnn-android-vulkan
- opencv-mobile:https://github.com/nihui/opencv-mobile
- ncnn-android-vulkan:Releases · Tencent/ncnn · GitHub
将上面下载好的两个压缩包解压后放入该位置:ncnn-android-yolov8\app\src\main\jni\ 下

4.配置CMakeLists.txt文件
位置:ncnn-android-yolov8\app\src\main\jni\ ,
利用Android Studio打开CMakeLists.txt.,然后把下面的路径更改为自己下载的:

三、将自定义的数据集和改进后的模型windows训练好的pt文件转为onnx文件
具体在Ultralytics/demo.py 代码里面也有体现
# 将模型导出为 ONNX 格式from ultralytics import YOLOmodel = YOLO("best.pt")success = model.export(format="onnx", simplify=True, opset=12)
注意:
在安卓端使用demo项目在转换前需要对项目源码作出一些修改,修改具体见下面步骤。
待修改的内容在ncnn-android-yolov8-main/doc/中有显示,如使用检测任务则修改c2f.jpg和Detect.jpg两张图片上的内容。

也即在windows把ultralytics项目中的下列函数修改为:
文件路径:ultralytics/ultralytics/nn/modules/block.py
class C2f(nn.Module): # ...def forward(self, x):# 全部替换为x = self.cv1(x)x = [x, x[:, self.c:, ...]]x.extend(m(x[-1]) for m in self.m)x.pop(1)return self.cv2(torch.cat(x, 1))
文件路径:ultralytics/ultralytics/nn/modules/head.py
class Detect(nn.Module):# ...def forward(self, x):"""Concatenates and returns predicted bounding boxes and class probabilities."""shape = x[0].shape # BCHWfor i in range(self.nl):x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1)if self.training:return xelif self.dynamic or self.shape != shape:self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))self.shape = shape# 中间部分注释掉,return语句替换为return torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).permute(0, 2, 1)
!记得保留原本的代码,这两处修改仅在格式转换时进行,如果想要重新训练,需要使用原本的代码。修改完成再执行模型格式转换的代码。
得到的文件类型为onnx格式,还需进一步转换为ncnn格式。使用一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine 即可
转换后会得到两个文件,分别以bin和param做后缀。使用yolov8模型已不再需要对param文件修改。两个文件即最终集成到android端的模型文件,
放到\ncnn-android-yolov8-main\ncnn-android-yolov8\app\src\main\assets

四 准备部署Android Studio项目
demo项目解读:
yolo.cpp和yolo.h:负责加载模型,执行预测任务,返回数据结果。
ndkcamera.cpp和ndkcamera.h:负责摄像头相关以及实时绘制预测矩形框。
yolov8ncnn.cpp:JNI方法直接对应的C++文件,负责整合上述两部分。
目前修改的部分均在yolo.cpp和yolov8ncnn.cpp两个文件中,可以以实时摄像的方式使用模型。
1. 修改yolo.cpp文件
在ncnn-android-yolov8\app\src\main\jni\ 下,修改为你自己数据集的类别数量

修改调用的模型名格式 :

修改节点名称:
先查看自己onnx的节点名称,网站查看: https://netron.app/


修改文件,对应上图中的输入和输出的名称

修改为自己的类别名称:

2 修改strings.xml文件
增加item,添加移动端模型选择文件:
<item>bestXXX</item>
bestXXX是你训练出来的模型的名称

3 修改yolov8ncnn.cpp文件
对应修改如下:

上图红框中的名称要和你导出来的bin和param中的文件名称对应 ,有多个模型,可以多放几个
4.修改build.gradle
在build.gradle 修改依赖的gradle插件版本为7.2.0

在ncnn-android-yolov8-main\ncnn-android-yolov8\gradle\wrapper\gradle-wrapper.properties中:
修改使用的gradle版本为7.4-all版本。

重新sync项目
5.部署效果
手机打开->开发者模式,开启USB调试权限,手机和电脑用USB连接,允许调试
运行Android Studio项目到手机上
另外app默认先打开的是前置摄像头,通过分析代码,可以知道,将MainActivity.java的40的facing的初始值从0改成1可以让app默认先打开后置摄像头。
相关文章:
轻量化的yolov8部署到安卓Android手机端
一、pytorch环境配置和yolov8源码安装 首先在电脑上需要配置好pytorch环境,和yolov8源码的下载 然后针对yolov8做自己的轻量化改进 二、下载Android Studio和ncnn-android-yolov8 1. Android Studio官网链接: 下载 Android Studio 和应用工具 - And…...
分块矩阵的定义、计算
目录 一、定义 二、分块矩阵的加减乘法 三、考点 一、定义 分块,顾名思义,将整个矩阵分成几部分,如下图所示 二、分块矩阵的加减乘法 三、考点 分块矩阵的考点不多,一般来说,有一种: 求分块矩阵的转置…...
NAND系统性能提升常见方案
随着NAND的发展,针对NAND系统性能提升,业内目前主要的做法有以下几种方案: 1.提升总线频率和优化AC时序: 提高NAND闪存接口的工作频率可以显著加快数据传输速度。通过不断改进工艺和技术,缩短了信号稳定时间、降低了延…...
集简云动作管理平台上线:创建强大且可分享的AI助手(GPTs)
OpenAI的GPT Store于昨天上线,用户可以找到好用的GPTs,也可以将自己的GPTs分享到GPT Store中。未来(预计今年1季度)甚至可以从GPTs Store中获取利润分成。 要创建强大的GPTs离不开调用外部的软件工具,比如查询CRM/ERP软…...
机器人制作开源方案 | 基于混合现实的可移动机械臂平台
作者:董泽宇 李肖兵 叶彤 李秉宸 吴雅霏 单位:广西大学 电气工程学院 指导老师:李勇 雷圆媛 为应对特殊条件下不便于实地进行移动式操作的问题,本作品设计了一套基于混合现实的可移动机械臂操作控制系统。该系统分为人机交互、机…...
JavaScript基础03
1 - 循环 1.1 for循环 语法结构 for(初始化变量; 条件表达式; 操作表达式 ){//循环体 } 名称作用初始化变量通常被用于初始化一个计数器,该表达式可以使用 var 关键字声明新的变量,这个变量帮我们来记录次数。条件表达式用于确定每一次循环是否能被执行…...
CMake入门教程【实战篇】使用开源库cmake-modules简化项目开发与维护
文章目录 简介项目地址项目特点使用方式模块使用模块说明示例结论简介 本教程介绍了rpavlik/cmake-modules,一个CMake模块集合,旨在简化和优化CMakeLists.txt文件的编写和维护工作。该集合尤其对虚拟现实和物理模拟包的开发者有用,同时也包含通用实用模块和针对旧版CMake的…...
基于TOP204的开关电源电路图
图为TOP204的典型应用电路。该电源的技术特点是输入电压为交流85~265V;输出电压为15V2%;额定输出功率为30W;输出电压纹波不大于50mV;线性调整率为2%;效率为85%。电路中&a…...
CES 2024上的AI亮点
以下是CES 2024前两天AI方面亮点: 一个AI助手,取代你的智能手机应用程序的rabbit.tech人工智能驱动的捆绑式鞋子被称为“Moonwalkers”,可以让你走得更快 FitXR Slam的VR和健身创新WeHead的人工智能能给ChatGPT一张脸世界上第一个高清触觉游…...
Canopen学习笔记——sync同步报文增加数据域(同步计数器)
1.Canfestival同步报文sync的设置 在OD表中的配置如下: 如果0x1006索引的同步报文循环周期时间设置为0则禁用同步报文,这里要注意的就是,上面第一张图也提到了,时间单位是us。第二张图,我的0x1006就设置为0xF4240,也就…...
CRLF检测工具汇总
目录 漏洞介绍 详细请看 工具介绍 Oralyzer 介绍 主要功能...
vue、element-ui使用el-tooltip判断文本是否溢出
1.需求:需要实现文本单行显示,超出时,使用省略号,划过该文本时使用tooltip显示全部文本。需要考虑数据是由接口动态获取,只有溢出文本鼠标滑过时显示全部文本,没有溢出的则不需要。 2.实现: 第…...
高防dns服务器租用有哪些应用场景?-速盾cdn
高防DNS服务器租用可以应用于以下场景: 网站安全防护:高防DNS服务器可以提供强大的防御能力,抵御DDoS攻击、DNS劫持、泛洪攻击等威胁,保证网站的稳定运行和安全性。 网络游戏:网络游戏通常面临大量用户同时访问和数据…...
使用 Goroutine 和 Channel 来实现更复杂的并发模式,如并发任务执行、并发数据处理,如何做?
使用 Goroutine 和 Channel 来实现更复杂的并发模式是 Go 语言的强大特性之一。 下面分别介绍如何实现并发任务执行和并发数据处理: 并发任务执行: 假设您有一些任务需要并发地执行,您可以使用 Goroutine 来同时执行这些任务,然…...
7个向量数据库对比:Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant
本文简要总结了当今市场上正在积极开发的7个向量数据库,Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant 的详细比较。 我们已经接近在搜索引擎体验的基础层面上涉及机器学习:在多维多模态空间中编码对象。这与传统的关键字查找不同(…...
【正点原子】STM32电机应用控制学习笔记——8.FOC简介
FOC是适用于无刷电机的,而像有刷电机,舵机,步进电机是不适用FOC的。FOC是电机应用控制难度最大的部分了。 一.FOC简介(了解) 1.介绍 FOC(Filed Oriented Control)即磁场定向控制,…...
Salesforce财务状况分析
纵观Salesforce发展史和十几年财报中的信息,Salesforce从中小企业CRM服务的蓝海市场切入,但受限于中小企业的生命周期价值和每用户平均收入小且获客成本和流失率不对等,蓝海同时也是死海。 Salesforce通过收购逐渐补足品牌和产品两块短板&am…...
服务器管理平台开发(2)- 设计数据库表
数据库表设计 本篇文章主要对数据管理平台数据库表设计进行介绍,包括单库多表设计、SQL语句、视图构造等 1、整体设计 设备品牌、序列号、型号等使用业务主表进行记录,逻辑磁盘、PCI设备可能出现1对N的情况,分别使用PCI设备表、Mac地址表、逻…...
Python基础知识:整理13 利用pyecharts生成折线图
首先需要安装第三方包pyecharts 1 基础折线图 # 导包,导入Line功能构建折线图对象 from pyecharts.charts import Line # 折线图 from pyecharts.options import TitleOpts # 标题 from pyecharts.options import LegendOpts # 图例 from pyecharts.options im…...
java项目之家政服务中介网(ssm)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的家政服务中介网。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 管理员:首页、个人中…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
