开发心电疾病分类的深度学习模型并部署运行于ARM虚拟硬件平台(AVH)

目录

一、ARM虚拟硬件平台介绍

二、心电疾病分类模型介绍

三、部署流程

3.1 基于百度云平台订阅虚拟硬件镜像

3.2 安装编译相关组件

3.1 数据加载

3.2  模型转换

方式一: tensorflow模型转换为onnx模型,onnx模型转换为TVM模型

方式二: tensorflow模型转换为tensorflow lite模型,tflite模型转换为tvm模型

3)两种方式部署的差异

3.3 环境变量配置

3.4 模型编译

3.5 模型运行

四、部署测试效果

方式一:tf->onnx->tvm

方式二:tf-tflite->tvm

五、问题QA

六、总结

七、参考文档


一、ARM虚拟硬件平台介绍

Arm 虚拟硬件平台 AVH(Arm Virtual Hardware),是ARM公司推出的虚拟硬件开发方式,通过在云平台中虚拟化流行的物联网开发套件、ARM的处理器和系统,从而扩展并加速了物联网软件开发。--通俗的讲:我们可以通过云平台来远程部署和运行程序在该硬件上(该硬件称为虚拟硬件),在该虚拟硬件平台上可以连接众多arm合作的硬件板。因此可以让我们在开发产品的前期得以在不同的硬件上进行模拟验证。

虚拟硬件平台的架构:

图中红色圈住的地方为本文所采用的开发方式:也即是基于百度云以及AVH FVP models。 

包含的硬件:

cortex-m55 、cortex-m85等。本文基于cortex-m55进行验证。

二、心电疾病分类模型介绍

   心电图(ECG)是诊断心脏疾病的关键工具,本文介绍基于心电数据进行疾病的分类的模型,该模型分类输出为7种。输入数据为10s的心电数据维数1x3600,输出维度为1x7。 模型基于TensorFlow框架训练,结构为CNN网络架构,模型训练保存输出为pb格式(model.pb)

三、部署流程

3.1 基于百度云平台订阅虚拟硬件镜像

 參考文档2进行订阅。

3.2 安装编译相关组件

1)离线下载并上传到百度云安装这些组件 

cpackget add ARM.CMSIS.5.9.0.pack

cpackget add ARM::CMSIS-DSP@1.15.0

cpackget add ARM::CMSIS-NN@4.1.0

cpackget add ARM::V2M_MPS3_SSE_300_BSP@1.4.0

cpackget add ARM::V2M_MPS3_SSE_310_BSP@1.3.0

cpackget add Keil::ARM_Compiler@1.7.2

 

参考文档2,官方提供了相对比较完整的pack包汇总的文件包,只要把这个文件下载下来,并传输到云服务器指定位置,即可自动识别,完成pack包的安装。

wget https://Arm-workshop.bj.bcebos.com/packs.tar.bz2

 

 

 

2)执行命令

  配置cmsis 

# download cmsis-toolbox
cmsis_toolbox_name="cmsis-toolbox-linux-amd64"
cmsis_toolbox_version="2.2.1"
cmsis_toolbox_url="https://github.com/Open-CMSIS-Pack/cmsis-toolbox/releases/download/${cmsis_toolbox_version}/${cmsis_toolbox_name}.tar.gz"
wget ${cmsis_toolbox_url}
tar -vxf ${cmsis_toolbox_name}.tar.gz
rm ${cmsis_toolbox_name}.tar.gz# copy to opt
mv ${cmsis_toolbox_name} ctools
rm -rf /opt/ctools
mv ctools /opt

配置tvm和onnx 

echo 'export PATH=/home/ubuntu/.local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
pip install --upgrade pip
pip install opencv-python
pip install apache-tvm
pip install onnx

3.1 数据加载

 1)编写python文件加载心电数据,并将数据转换为input.h文件,输出数据类别数组转换为output.h文件。

2)执行转换数据程序

#Windows执行
python3 convert_ECGData.py   data/TestX_eu_MLIII.csv#linux  python3 ./convert_ECGData.py ./data/TestX_eu_MLIII.csv

2)执行 label转换程序,将标签序列转换为label.h头文件

# windows执行
python  convert_labels.py  data/TestY_eu_MLIII.csv#linux: python3  ./convert_labels.py  ./data/TestY_eu_MLIII.csv

3.2  模型转换

方式一: tensorflow模型转换为onnx模型,onnx模型转换为TVM模型

pip install tf2onnx

 1)执行以下程序进行tf到onnx模型转换:

python -m tf2onnx.convert --saved-model save/CNN --output  onnx/cnn_model.onnx

 2)重命令onnx模型

读取onnx模型输入名称

 查到輸入名称为input_1

INPUT_NODE_NAME="input_1"
sudo python rename_onnx_model.py --model  cnn_model.onnx \--origin_names ${INPUT_NODE_NAME} \--new_names x \--save_file cnn_model.onnx

3)onnx模型转换为tvm模型

TVM_TARGET="cortex-m55"
sudo python3 -m tvm.driver.tvmc compile --target=cmsis-nn,c \--target-cmsis-nn-mcpu=$TVM_TARGET \--target-c-mcpu=$TVM_TARGET \--runtime=crt \--executor=aot \--executor-aot-interface-api=c \--executor-aot-unpacked-api=1 \--pass-config tir.usmp.enable=1 \--pass-config tir.usmp.algorithm=hill_climb \--pass-config tir.disable_storage_rewrite=1 \--pass-config tir.disable_vectorize=1 \cnn_model.onnx \--output-format=mlf \--model-format=onnx \--input-shapes x:[1,3600] \--module-name=cls \--output=cls.tar

 结果:

4)解压tvm模型文件

sudo mkdir -p "${PWD}/cls"
sudo tar -xvf cls.tar -C "${PWD}/cls"

方式二: tensorflow模型转换为tensorflow lite模型,tflite模型转换为tvm模型

1)安装tflite包:

pip install pyserial==3.5 tflite=-2.1

2)查询tflite模型的输入和输出

3)更改main.c文件

4) tflite 转换为tvm

TVM_TARGET="cortex-m55"python3 -m tvm.driver.tvmc compile --target=cmsis-nn,c \--target-cmsis-nn-mcpu=$TVM_TARGET \--target-c-mcpu=$TVM_TARGET \--runtime=crt \--executor=aot \--executor-aot-interface-api=c \--executor-aot-unpacked-api=1 \--pass-config tir.usmp.enable=1 \--pass-config tir.usmp.algorithm=hill_climb \--pass-config tir.disable_storage_rewrite=1 \--pass-config tir.disable_vectorize=1 \model.tflite \--output-format=mlf \--model-format=tflite \--input-shapes serving_default_input_1:[1,3600] \--module-name=cls\--output=cls.tar

3)两种方式部署的差异

 支持TF、Pytorch、onnx转换为tvm。因此前一种方式比第二种方式多了一步转换步骤。

3.3 环境变量配置

3.4 模型编译

RUN_DEVICE_NAME="M55"
cbuild object_classification+PaddleClas$RUN_DEVICE_NAME.cprj

生成:tmp(makefile相关文件)out文件(目标文件axf)

 

3.5 模型运行

VHT_Platform="FVP_Corstone_SSE-300"
$VHT_Platform  -C cpu0.CFGDTCMSZ=15 \-C cpu0.CFGITCMSZ=15 \-C mps3_board.uart0.out_file=\"-\" \-C mps3_board.uart0.shutdown_tag=\"EXITTHESIM\" \-C mps3_board.visualisation.disable-visualisation=1 \-C mps3_board.telnetterminal0.start_telnet=0 \-C mps3_board.telnetterminal1.start_telnet=0 \-C mps3_board.telnetterminal2.start_telnet=0 \-C mps3_board.telnetterminal5.start_telnet=0 \"out/ECG_classification/PaddleClas$RUN_DEVICE_NAME/ECG_classification.axf" \--stat

四、部署测试效果

方式一:tf->onnx->tvm

方式二:tf-tflite->tvm

对比运行时间,方式二快一些,相差 7s

五、问题QA

1)出现package"tflite.Model" is not installed. Hint:"pip installtlcpack[tvmc]"

解决方式:

 安装:pip install pyserial==3.5 tflite=-2.1

参考【3】

2)找不到路径或写入文件失败

添加权限:sudo chmod -R 777 tmp

3)license error

Error: license error: License checkout for feature SG_Simulator with version 11.19 has been denied by Flex back-end. Error code: -10
Feature has expired.
Feature:       SG_Simulator
Expire date:   31-mar-2024
License path:  /opt/data.dat:/opt/arm/licenses/license.dat:
FlexNet Licensing error:-10,32License checkout for feature FM_Simulator with version 11.19 has been denied by Flex back-end. Error code: -5
No such feature exists.
Feature:       FM_Simulator
License path:  /opt/data.dat:/opt/arm/licenses/license.dat:
FlexNet Licensing error:-5,357License checkout for feature SG_Simulator with version 11.19 has been denied by Flex back-end. Error code: -10
Feature has expired.
Feature:       SG_Simulator
Expire date:   31-mar-2024
License path:  /opt/data.dat:/opt/arm/licenses/license.dat:
FlexNet Licensing error:-10,32
In file: /tmp/plgbuild/abs_build/1228881_61942/trunk/work/fastsim/Framework/scx/SCXSimulationEngine.cpp:3276

Error: license error: Simulation Engine module unavailable!
In file: /tmp/plgbuild/abs_build/1228881_61942/trunk/work/fastsim/Framework/scx/SCXSimulationEngine.cpp:2875
ERROR: uncaught exception occurred. Exception message follows:
Error: Wrong version of armctmodel. Version 11.19.25 (API Version 1.2) of the Portfolio was used to build the model. Please use identical major.minor versions of the Portfolio and the Tools.

解决方式:重新订阅新版镜像

4) 出现.x =input 错误

/home/ubuntu/ECG_classification/main.c:20:4: error: field designator 'x' does not refer to any field in type 'struct tvmgen_cls_inputs'
                .x = input,
                 ^
/home/ubuntu/ECG_classification/main.c:23:4: error: field designator 'output' does not refer to any field in type 'struct tvmgen_cls_outputs'
                .output = output,
                 ^
2 errors generated.
ninja: build stopped: subcommand failed.
error cbuild: error executing 'cmake' build
 

解决方式:更改结构体变量和模型输入输出名称一致 

六、总结

该文章完成了深度学习模型的训练、验证、模型导出,模型转换、模型部署以及相关环境配置,最终编译和运行成功。通过ARM虚拟硬件平台进行软件程序的验证是一个很好的选择。未来可以进一步尝试其它的硬件部署以验证模型的性能。

七、参考文档

【1】Virtual Hardware – Software Development Without Hardware – Arm®

【2】iot-demo

【3】1. microTVM CLI Tool — tvm 0.17.dev0 documentation

【4】Paddle-examples-for-AVH 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/16539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

注册表Windows兼容性设置(AppCompatFlags)

属性 - 兼容性 EXE文件属性中有兼容性标签,当有些老版本软件不能正常运行时经常会调整这里的设置。 image.png 上面的所有选项都写在注册表中,其中“更改所有用户的设置”保存在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppC…

html5各行各业官网模板源码下载(2)

文章目录 1.来源2.源码模板2.1 HTML5好看的旅行网站模板源码2.2 HTML5自适应医院叫号大屏模板源码2.3 HTML5好看的高科技登录页面模板源码2.4 HTML5宠物美容服务公司网站模板源码2.5 HTML5创意品牌广告设计公司网站模板源码2.6 HTML5实现室内设计模板源码2.7 HTML5黄金首饰网站…

踏青而行、奔赴山海 | 2024中创算力户外徒步团建

春意藏,夏初长。风暧人间草木香,为了丰富中创员工的业余生活,增加全体员工亲近大自然的机会。回归自然、愉悦身心,5月15日,中创算力组织开展了户外徒步团建。 一群志同道合的人,一起奔跑在理想的路上。彼此…

前端JS怎么更换颜色:探索JavaScript中的色彩变换魔法

前端JS怎么更换颜色:探索JavaScript中的色彩变换魔法 在前端开发中,JavaScript(JS)扮演着至关重要的角色,其中一项常见的任务便是动态地更改网页元素的颜色。这个过程看似简单,实则蕴含着丰富的技巧和深度…

metersphere相关笔记

1. 修改密码: password字段为密码得到md5值,假设更新为123456,则password为e10adc3949ba59abbe56e057f20f883e docker exec -it mysql bash #进入mysql容器 mysql -uroot -pPassword123mysql use metersphere #切换到meterspheres数据库…

Activiti7_使用

Activiti7_使用 一、Activiti7二、绘制工作流三、通过代码部署流程,再对流程进行实例化,完整运行一遍流程即可四、在springbooot中使用 一、Activiti7 为了实现后端的咨询流转功能,学习Activiti7,记录下使用的过程及遇到的问题 二…

openwrt 官方版 安装配置 AdGuard Home + smartdns 告别广告烦扰 教程 软路由实测 系列五

1 安装 adguard home opkg update opkg install adguardhome #启动 /etc/init.d/adguardhome start /etc/init.d/adguardhome enable #查看 rootOpenWrt:~# ps| grep AdGuardHome5101 root 1233m S /usr/bin/AdGuardHome -c /etc/adguardhome.yaml -w /var/adguardhom…

云界洞见——基于移动云云数据库MySQL应用实践

目录 简介1 新手入门1.1 创建MySQL实例1.2 公网连接MySQL实例 2 操作指南2.1 创建数据库2.2 数据备份设置2.3 日志管理2.4 监控告警2.5 代码审计 3 应用场景4 总结 如今,大型企业如金融企业和银行等,在下一代的微服务架构转型要求下,需要基础…

渗透测试的测试流程与注意事项

软件测试流程 渗透测试是一种重要的软件测试技术,通过对系统进行模拟攻击和漏洞评估,帮助组织发现和修复潜在的安全风险,提高系统的安全性和稳定性。在进行渗透测试时,需要注意合法授权、技术能力、安全意识和报告质量等方面的问…

科学提效|AI融入零售业,未来零售的创新之旅

零售业正经历着由人工智能(AI)引领的转型浪潮。AI在零售和消费品(CPG)行业的应用前景广阔,它正以多种创新方式重塑行业的运作模式。且随着技术的不断进步,AI在零售业的应用将变得更加广泛和深入。AI不仅能够…

即刻起飞——基于Amazon Bedrock快速构建生成式AI应用

即刻起飞 —— 基于 Amazon Bedrock 快速构建生成式 AI 应用 1. 前言 在百模大战中,AI行业的发展正在经历前所未有的变革。这场竞争不仅推动了AI技术的快速发展,也揭示了AI行业的新趋势。这些趋势不仅影响着我们如何看待和使用AI,也预示着AI…

高频交易的回测算法

https://www.reddit.com/r/highfreqtrading/comments/1corjiw/opensourcing_highfrequency_trading_and/ 这个是关于高频交易的数据读取和回测文档,这个项目中数据的收集, https://hftbacktest.readthedocs.io/en/latest/tutorials/Data%20Preparation…

免费且非常火的日程管理软件:飞项

一、简介 1、在日常繁忙的工签中,是否事情一大堆却记不住?系统自带的日历用着却是不方便,不顺手,提醒不及时?待办、打卡、记事乱七八糟的混在一起,关键时候找不到?市面上的日程管理软件那么多&a…

springboot+jwt+shiro+vue+elementUI+axios+redis+mysql完成一个前后端分离的博客项目

目录 简易博客项目(springbootjwtshirovueelementUIaxiosredismysql)第一章 整合新建springboot,整合mybatisplus第一步 创建项目(第八步骤就行)数据库:1、 修改pom.xml2、修改配置文件3、创建数据库vueblog然后执行下面命令生成表 第二步 配置分页MybatisPlusConfig生成代码(d…

数据结构中的KMP算法及其改进算法

数据结构中的KMP算法及其改进算法 在计算机科学中,字符串匹配是一个基本且重要的问题。经典的暴力匹配算法虽然简单,但在最坏情况下的时间复杂度为O(mn),其中m是模式串的长度,n是文本串的长度。为了提高匹配效率,Knut…

最全的Redis常用命令

Redis是一个开源的内存数据结构存储系统,用作数据库、缓存和消息代理。它支持多种类型的数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets&#xff09…

Spring Boot 系统学习第三天:Spring依赖注入原理分析

1.概述 Spring中关于依赖注入的代码实现非常丰富,涉及大量类和组件之间的协作与交互。从原理上讲,任何一个框架都存在一条核心执行流程,只要抓住这条主流程,就能把握框架的整体代码结构,Spring也不例外。无论采用何种依…

什么是容器

容器是一种用于存储、管理和运行应用程序的技术。它可以将应用程序及其依赖项打包到一个独立的可移植容器中,以便在不同的环境中进行部署和运行。容器化技术可以提供一种轻量级、快速、可移植的应用程序部署解决方案。 容器的背后核心概念是隔离。容器使用操作系统…

YoloV8改进策略:注意力改进|HCANet全局与局部的注意力模块CAFM|二次创新|即插即用

文章目录 摘要用在自己的论文中,该如何描述原论文中的描述在自己论文中描述代码与详解官方结果改进方法测试结果总结摘要 在CAFM模型的基础上进行二次创新,我成功地开发了一个性能显著提升的改进版模型。这一创新不仅优化了特征提取和融合的方式,还极大地提高了模型的泛化能…

.NET CORE 屏蔽重复提交

加入session支持 public void ConfigureServices(IServiceCollection services) {// add session supportservices.Configure<CookiePolicyOptions>(options >{options.CheckConsentNeeded context > false;options.MinimumSameSitePolicy Microsoft.AspNetCore.…