轻量化的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的家政服务中介网。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 管理员:首页、个人中…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...