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

保姆级教程:将训练好的YOLOv5s模型(PyTorch 1.7)打包成安卓/鸿蒙APP

从YOLOv5模型到移动端应用全流程实战指南1. 环境准备与模型导出在开始将YOLOv5模型部署到移动端之前确保你的开发环境已经准备就绪。对于PyTorch 1.7用户需要特别注意版本兼容性问题。以下是推荐的环境配置操作系统Windows 10或macOS Big Sur及以上Python环境Python 3.8与PyTorch 1.7兼容性最佳PyTorch版本1.7.0CPU或GPU版本均可但导出时需使用CPUYOLOv5代码库v6.0分支Android开发环境Android Studio 4.1.3或更高版本注意PyTorch移动端库版本必须与训练环境的PyTorch版本严格匹配这是后续步骤成功的关键前提。模型导出的第一步是将训练好的.pt权重文件转换为TorchScript格式。YOLOv5提供了export.py脚本但需要进行一些定制化修改# 修改后的export.py关键部分 try_export def export_torchscript(model, im, file, optimize, prefixcolorstr(TorchScript:)): f file.with_suffix(.torchscript) fl file.with_suffix(.torchscript.pt) ts torch.jit.trace(model, im, strictFalse) d {shape: im.shape, stride: int(max(model.stride)), names: model.names} extra_files {config.txt: json.dumps(d)} (optimize_for_mobile(ts) if optimize else ts)._save_for_lite_interpreter(str(fl)) return f, None执行以下命令完成导出python export.py --weights yolov5s.pt --optimize --device cpu --include torchscript导出过程中常见的三个陷阱及解决方案GPU导出失败必须添加--device cpu参数移动端优化仅支持CPU形状不匹配错误确保输入图像的尺寸与训练时一致算子不支持警告可能需要简化模型结构或使用PyTorch支持的算子2. Android项目配置与依赖管理Android Studio项目的正确配置是整个流程中最容易出错的环节。我们从官方demo项目开始逐步构建自己的应用。2.1 项目初始化首先克隆PyTorch官方demo仓库git clone https://github.com/pytorch/android-demo-app.git关键配置文件的修改要点build.gradle (Module: app):android { defaultConfig { applicationId com.example.yolov5app minSdkVersion 24 # 必须≥24以保证PyTorch库兼容性 targetSdkVersion 31 } } dependencies { implementation org.pytorch:pytorch_android:1.7.0 implementation org.pytorch:pytorch_android_torchvision:1.7.0 implementation com.android.support:appcompat-v7:28.0.0 }重要提示如果你的PyTorch版本是1.10需要使用pytorch_android_lite而非pytorch_android这是许多开发者容易混淆的地方。2.2 资源文件处理将导出的模型文件放置到正确位置app/src/main/assets/ ├── yolov5s.torchscript.pt ├── classes.txt └── test_images/ ├── test1.jpg └── test2.pngclasses.txt文件应包含你的类别标签每行一个类别person car dog ...3. 代码适配与功能实现3.1 主活动(MainActivity)修改核心修改集中在MainActivity.java文件中主要涉及模型加载和预处理逻辑// 模型加载部分 try { mModule PyTorchAndroid.loadModuleFromAsset(getAssets(), yolov5s.torchscript.pt); mClasses new ArrayList(); BufferedReader br new BufferedReader( new InputStreamReader(getAssets().open(classes.txt))); String line; while ((line br.readLine()) ! null) { mClasses.add(line); } } catch (IOException e) { Log.e(ObjectDetection, Error loading assets, e); finish(); }3.2 图像预处理适配YOLOv5的输入需要特定的归一化处理这与常规PyTorch模型不同float[] mean {0.485f, 0.456f, 0.406f}; float[] std {0.229f, 0.456f, 0.225f}; Tensor inputTensor TensorImageUtils.bitmapToFloat32Tensor( resizedBitmap, mean, std, MemoryFormat.CHANNELS_LAST);3.3 后处理实现YOLOv5的输出需要特定的解码过程float[] outputs outputTensor.getDataAsFloatArray(); ListResult results new ArrayList(); // 解码逻辑 for (int i 0; i outputs.length; i 85) { float confidence outputs[i 4]; if (confidence 0.5f) { // 置信度阈值 int classIndex 0; float maxClassProb 0; for (int j 0; j 80; j) { float prob outputs[i 5 j] * confidence; if (prob maxClassProb) { maxClassProb prob; classIndex j; } } if (maxClassProb 0.25f) { // 类别概率阈值 float x outputs[i]; float y outputs[i 1]; float width outputs[i 2]; float height outputs[i 3]; results.add(new Result(x, y, width, height, classIndex, maxClassProb)); } } }4. 测试与优化技巧4.1 虚拟机选择策略不同的Android模拟器性能差异显著以下是实测数据对比模拟器型号启动时间推理速度(FPS)内存占用兼容性Nexus 5X25s8-101.2GB优秀Nexus 635s5-71.8GB一般Pixel 330s9-111.5GB优秀实测发现Nexus 5X在PyTorch移动端应用中表现最为稳定而Nexus 6经常出现闪退问题。4.2 真机调试要点当部署到华为鸿蒙设备时需要特别注意开启开发者选项中的USB调试和安装未知来源应用权限如果应用崩溃检查鸿蒙系统的纯净模式是否已关闭使用ADB命令安装APK时添加-g参数授予所有权限adb install -g app-debug.apk4.3 性能优化技巧提升移动端推理速度的几种有效方法模型量化quantized_model torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtypetorch.qint8)输入尺寸调整将640x640降至320x320可使速度提升3-4倍线程控制在Android中合理设置推理线程数PyTorchAndroid.setNumThreads(4); // 根据CPU核心数调整5. 高级功能扩展5.1 实时视频处理实现摄像头实时检测需要优化帧处理流程private void analyzeFrame(Image image) { // 转换为Bitmap Bitmap bitmap imageToBitmap(image); // 异步处理避免阻塞UI线程 mBackgroundHandler.post(() - { // 预处理 Bitmap resized Bitmap.createScaledBitmap(bitmap, 640, 640, true); // 推理 Tensor input TensorImageUtils.bitmapToFloat32Tensor( resized, MEAN, STD, MemoryFormat.CHANNELS_LAST); Tensor output mModule.forward(IValue.from(input)).toTensor(); // 后处理 processResult(output); // 更新UI runOnUiThread(() - updateDetectionView()); }); }5.2 多模型切换动态加载不同模型实现功能切换public void loadModel(String modelName) { new Thread(() - { try { Module newModule PyTorchAndroid.loadModuleFromAsset( getAssets(), modelName .torchscript.pt); synchronized (this) { if (mModule ! null) { mModule.destroy(); } mModule newModule; } } catch (IOException e) { Log.e(ModelSwitch, Error loading model, e); } }).start(); }5.3 结果可视化增强改进检测结果的可视化效果private void drawDetectionResult(Canvas canvas, ListResult results) { Paint boxPaint new Paint(); boxPaint.setColor(Color.RED); boxPaint.setStyle(Paint.Style.STROKE); boxPaint.setStrokeWidth(4f); Paint textPaint new Paint(); textPaint.setColor(Color.WHITE); textPaint.setTextSize(48f); textPaint.setFakeBoldText(true); for (Result result : results) { // 绘制边界框 canvas.drawRect(result.rect, boxPaint); // 绘制标签和置信度 String label String.format(%s %.2f, mClasses.get(result.classIndex), result.score); canvas.drawText(label, result.rect.left, result.rect.top - 10, textPaint); } }6. 常见问题解决方案在实际部署过程中开发者常会遇到以下典型问题模型加载失败检查assets目录是否正确验证模型文件是否完整确保PyTorch版本匹配图像尺寸不匹配// 确保输入尺寸与模型期望一致 Bitmap resized Bitmap.createScaledBitmap( originalBitmap, 640, 640, true);内存泄漏处理Override protected void onDestroy() { if (mModule ! null) { mModule.destroy(); } super.onDestroy(); }鸿蒙系统兼容性问题在AndroidManifest.xml中添加uses-feature android:nameandroid.hardware.camera / uses-permission android:nameandroid.permission.CAMERA /性能调优参数参数名称推荐值说明输入尺寸320x320平衡速度和精度置信度阈值0.5过滤低质量检测NMS阈值0.45控制重叠框合并线程数4多核CPU优化7. 项目构建与发布7.1 生成签名APK发布前的最后步骤是构建正式版APK在Android Studio中选择Build Generate Signed Bundle/APK创建或选择已有的密钥库选择发布版本类型Release启用ProGuard代码混淆可选但推荐7.2 版本兼容性测试确保应用在不同设备上正常运行Android版本覆盖至少测试Android 8.0到12.0鸿蒙版本验证测试鸿蒙2.0和3.0屏幕尺寸适配小屏(5)、中屏(6)和大屏(7)设备7.3 性能基准测试使用Android Profiler监控关键指标指标合格标准优化建议内存占用200MB减少Bitmap缓存冷启动时间1.5s延迟初始化重型资源推理延迟150ms量化模型、减小输入尺寸电池消耗5%/h优化后台任务调度// 在Application类中添加性能监控 public class MyApp extends Application { Override public void onCreate() { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectAll() .penaltyLog() .build()); } }

相关文章:

保姆级教程:将训练好的YOLOv5s模型(PyTorch 1.7)打包成安卓/鸿蒙APP

从YOLOv5模型到移动端应用:全流程实战指南 1. 环境准备与模型导出 在开始将YOLOv5模型部署到移动端之前,确保你的开发环境已经准备就绪。对于PyTorch 1.7用户,需要特别注意版本兼容性问题。以下是推荐的环境配置: 操作系统&#x…...

实测好用降AI工具盘点 2026高性价比首选

前言 刚完成毕业答辩的过来人真心建议,别再跟论文AI检测死磕了!我当初对着检测报告上飘红的高风险提示熬了好几个通宵,自己改了三版,导师扫了两眼就说“AI痕迹太重,回去重改”。那段时间我把市面上能找到的降AI工具试了…...

论完善代码版本信息构建AI在精工产业与智能设备短板—东方仙盟

出众的现代 AI时至今日,人工智能发展日新月异。在 UI 设计、网页开发、纯软件系统搭建等不依托实体硬件的领域,AI 表现已然成熟。常规信息化工作,AI 皆可独立完成,效率出众,为日常开发与设计减负良多。精工硬件领域 AI…...

会计学论文降AI工具怎么选?财务审计方向高效降重指南

又到了毕业答辩的关键期,不少会计专业的同学都在发愁论文AI率不达标:财务分析部分的数据解读、审计研究的案例推导用AI辅助写完,一检测全是高风险,改了好几遍还是过不了学校的审核。我身边不少师弟师妹踩过工具的坑,要…...

AD23新手必看:从画完PCB到嘉立创成功下单Gerber,保姆级避坑指南

AD23新手必看:从画完PCB到嘉立创成功下单Gerber,保姆级避坑指南 第一次用Altium Designer 23完成PCB设计后,面对Gerber文件导出和嘉立创下单的复杂流程,很多新手都会感到手足无措。本文将从实际经验出发,带你一步步避开…...

.9017R 座充充电管理 IC

概述 .9017R 是恒流/恒压座充充电管理芯片,主要应用于单节锂电池充电。应用电路无需外接检测电阻,其内部为MOSFET 结构,因此也无需外接反向二极管。 .9017R 在大功率和高环境温度下可以自动调节充电电流以限制芯片温度。它的充电电压固定在4.…...

BMS工程师必看:用南京集澈DVC1006做外部被动均衡,这几点时序和奇偶机制千万别搞错

BMS工程师实战指南:DVC1006被动均衡设计的五大关键陷阱与解决方案 在新能源汽车和储能系统井喷式发展的今天,电池管理系统(BMS)的可靠性直接决定了整个电池包的安全边界。作为国内AFE芯片的标杆产品,南京集澈DVC1006凭借其高集成度与稳定性&…...

影刀RPA 企业级专题篇:自动化系统中的日志平台与链路追踪设计实践

影刀RPA 企业级专题篇:自动化系统中的日志平台与链路追踪设计实践 作者:林焱 很多自动化系统在小规模阶段。 其实不太依赖“日志体系”。 流程跑起来。 失败了看一下控制台。 基本就够用了。 但当系统进入企业级规模以后。 日志会从“辅助功能”…...

软件许可优化,别被销售忽悠了,看看这几家到底谁管用

以前我们公司被Adobe审计过一次,赔了不少钱。之后老板让我专门研究软件许可优化这件事。市面上这几家都聊过、试过,我把真实感受跟你说说。先说你可能不太熟的:(gofarlic)这家是国内武汉的,一开始我也有点怀…...

RuoYi-Vue-Plus项目实战:用WebSocket实现‘服务端通知’功能,我踩了这些坑

RuoYi-Vue-Plus实战:WebSocket服务端通知功能深度解析与避坑指南 在当今企业级应用开发中,实时通信已成为提升用户体验的关键要素。当产品经理提出"后台操作成功时前端实时弹窗提示"的需求时,作为技术负责人的你该如何选择技术方案…...

告别环境报错:用Docker 10分钟在本地/服务器部署YOLOv8完整开发环境

告别环境报错:用Docker 10分钟在本地/服务器部署YOLOv8完整开发环境 在计算机视觉领域,YOLOv8作为当前最先进的目标检测模型之一,其强大的性能和易用性吸引了大量开发者和研究者。然而,传统的手动搭建开发环境过程往往令人望而生畏…...

LuaJIT字节码逆向难题:LJD如何帮你恢复可读源码

LuaJIT字节码逆向难题:LJD如何帮你恢复可读源码 【免费下载链接】luajit-decompiler https://gitlab.com/znixian/luajit-decompiler 项目地址: https://gitcode.com/gh_mirrors/lu/luajit-decompiler 面对编译后的LuaJIT字节码文件,你是否曾困惑…...

初创公司技术选型时为何将Taotoken作为大模型统一接入层

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创公司技术选型时为何将Taotoken作为大模型统一接入层 对于初创公司的技术负责人而言,在构建基于大模型的应用时&…...

HS2-HF Patch:如何用5分钟为HoneySelect2实现完整汉化与MOD整合

HS2-HF Patch:如何用5分钟为HoneySelect2实现完整汉化与MOD整合 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是HoneySelect2玩家的终…...

私有化视频会议平台/视频高清直播点播EasyDSS构建智慧校园音视频协作新生态

在教育数字化转型的关键阶段,智慧校园对音视频协作系统的需求,已从基础的远程沟通,升级为安全可控、体验流畅、管理智能的一体化解决方案。视频直播点播平台EasyDSS凭借技术创新与场景深耕,成为智慧校园建设的核心支撑&#xff0c…...

使用 Taotoken 管理多个 API Key 并设置访问权限与审计

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用 Taotoken 管理多个 API Key 并设置访问权限与审计 在开发和集成大模型应用时,一个常见的需求是为不同的应用、环境…...

PaddleOCR训练集制作避坑指南:从text_renderer合成到roLabelImg标注的全链路解析

PaddleOCR训练集制作全流程实战:从数据合成到模型调优的完整方法论 在工业级OCR项目落地过程中,数据集质量往往比模型架构更能决定最终效果上限。不同于学术界的标准benchmark竞赛,真实业务场景面临字体缺失、背景干扰、版式多变等复杂挑战。…...

别再傻傻分不清了!GIS新手必看:WGS84和UTM到底怎么选?附QGIS/ArcGIS实操对比

GIS坐标系选择指南:WGS84与UTM的核心差异与实战决策 刚接触地理信息系统(GIS)时,坐标系的选择往往令人困惑。为什么同样的位置数据,在不同坐标系下显示的数值完全不同?为什么测量同一个区域的面积会得到差异巨大的结果&#xff1f…...

通过 curl 命令直接测试 taotoken 大模型接口的响应

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过 curl 命令直接测试 taotoken 大模型接口的响应 在开发或调试大模型应用时,有时我们希望绕过 SDK,直接…...

Cortex-Debug终极指南:5分钟掌握VSCode最强STM32调试工具

Cortex-Debug终极指南:5分钟掌握VSCode最强STM32调试工具 【免费下载链接】cortex-debug Visual Studio Code extension for enhancing debug capabilities for Cortex-M Microcontrollers 项目地址: https://gitcode.com/gh_mirrors/co/cortex-debug 还在为…...

终极免费跨平台方案:draw.io桌面版完美编辑Visio文件

终极免费跨平台方案:draw.io桌面版完美编辑Visio文件 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 还在为不同操作系统间的Visio文件兼容性而烦恼吗?当…...

Python核心基础

本文摘要:Python核心基础章节系统讲解了编程基础知识,主要包括:1.字面量的概念与写法,强调字符串必须使用引号包裹;2.变量与常量的定义与使用,介绍命名规则和三种命名风格;3.注释的两种形式&…...

发现FinalBurn Neo:解锁经典街机游戏的终极模拟方案

发现FinalBurn Neo:解锁经典街机游戏的终极模拟方案 【免费下载链接】FBNeo FinalBurn Neo - We are Team FBNeo. 项目地址: https://gitcode.com/gh_mirrors/fb/FBNeo 你是否曾想重温那些定义了游戏黄金时代的经典街机游戏,却苦于找不到合适的平…...

告别IBus!在Ubuntu 22.04上为Fcitx5安装搜狗输入法并设置自启动的完整流程

在Ubuntu 22.04上深度配置Fcitx5与搜狗输入法的现代输入方案 对于追求高效输入的Linux用户而言,输入法框架的选择往往决定了日常使用的流畅度体验。传统IBus框架虽然预装在大多数发行版中,但在中文输入场景下常显力不从心——词库更新滞后、云输入支持有…...

X86与ARM架构深度解析:从指令集到生态的全面对比

1. 项目概述:为什么我们需要重新审视X86与ARM最近几年,无论是选购新电脑、关注手机芯片,还是围观科技新闻,你肯定没少听到“X86”和“ARM”这两个词。苹果的Mac电脑全面转向自研的M系列芯片,让“ARM架构”从手机、平板…...

ZYNQ启动全解析:从BootROM到你的App,SD卡与QSPI Flash烧录究竟差在哪?

ZYNQ启动全解析:从BootROM到你的App,SD卡与QSPI Flash烧录究竟差在哪? 当一块ZYNQ开发板静静躺在桌面上,按下电源键的瞬间,芯片内部究竟发生了什么?为什么有的工程师选择SD卡启动,而另一些则坚…...

做网安的这几年,挖漏洞接私活赚的是我工资的3倍,这些门道没几人知道

前言 这是我做网络安全工程师(简称网安)的第9个年头,从我工作的第3年起,我就一直在开始尝试去接网安方面的私活,这6年平均下来,我接私活赚的钱几乎是我工资的3倍。 而很多人要么不敢去做,要么就…...

【限时解密】ElevenLabs未公开的马来文SSML扩展语法:支持“Johor-Riau变体”、“Kedah重音标记”及连读停顿控制

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs马来文语音合成的技术演进与本地化挑战 ElevenLabs自2022年推出多语言TTS服务以来,持续扩展其语音模型对东南亚语言的支持能力。马来文(Bahasa Melayu)作为…...

别再让治具压坏你的板子!手把手教你用TSK-64应力测试仪搞定ICT/FCT应力管控

从应力失控到精准管控:TSK-64测试仪在ICT/FCT产线的实战指南 当产线突然出现批量PCBA功能异常时,多数工程师的第一反应是检查焊接质量或元器件性能,却往往忽略了治具施加的机械应力这个"隐形杀手"。某汽车电子制造商曾因FCT治具压力…...

HTTP协议认识

什么是 Http 协议? 超文本传输协议,规定了浏览器与服务器通信的规则 Http 协议的特点? 面向连接、安全的协议(基于 TCP)基于请求响应模型的无状态的协议 按F12 一、状态码大类 状态码分类说明1xx响应中…...