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

目录

一、ARM虚拟硬件平台介绍

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

三、部署流程

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

3.2 安装编译相关组件

3.3 数据加载

3.4  模型转换

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

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

两种方式部署的差异

3.5 环境变量配置

3.6 模型编译

3.7 模型运行

四、部署测试效果

方式一: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.3 数据加载

 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

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

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

#linux: python3  ./convert_labels.py  ./data/TestY_eu_MLIII.csv

3.4  模型转换

方式一: 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

两种方式部署的差异

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

3.5 环境变量配置

3.6 模型编译

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

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

 

3.7 模型运行

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 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【操作系统】发展与分类(手工操作、批处理、分时操作、实时操作)

2.操作系统发展与分类 思维导图 手工操作阶段(此阶段无操作系统) 需要人工干预 缺点: 1.用户独占全机,资源利用率低; 2.CPU等待手工操作,CPU利用不充分。 批处理阶段(操作系统开始出现&#x…

从零入门激光SLAM(二十一)——FAST-LIO2论文解析

FAST-LIO2: Fast Direct LiDAR-Inertial Odometry 论文地址:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9697912 代码:https://github.com/hku-mars/FAST_LIO 一、文章概述 1.问题导向 基于视觉传感器的高分辨率和高精度的实时密…

Excel 取出每组最后一行

Excel的前两列是两层的分组列,后两列是明细 ABCD1CM11112CM12123CM13134CM14145CM25156CM26167BM11218BM12229BM232310AM113111AM323212AM333313AM3434 现在要取出每小组的最后一行: ABCD1CM14142CM26163BM12224BM23235AM11316AM3434 使用 SPL XLL sp…

编译原理 期末复习笔记整理(上)

资料借鉴: 【编译原理】期末复习 零基础自学_哔哩哔哩_bilibili 编译原理笔记 第一章 引论 1.编译原理逻辑过程: 词法分析 语法分析 语义分析 中间代码生成 编译代码生成 2.词法分析 任务: 输入源程序,对…

SpringBootWeb 篇-深入了解 Mybatis 删除、新增、更新、查询的基础操作与 SQL 预编译解决 SQL 注入问题

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Mybatis 的基础操作 2.0 基础操作 - 环境准备 3.0 基础操作 - 删除操作 3.1 SQL 预编译 3.2 SQL 预编译的优势 3.3 参数占位符 4.0 基础操作 - 新增 4.1 主键返回…

不拍视频,不直播怎么在视频号卖货赚钱?开一个它就好了!

大家好,我是电商糖果 视频号这两年看着抖音卖货的热度越来越高,也想挤进电商圈。 于是它模仿抖音推出了自己的电商平台——视频号小店。 只要商家入驻视频号小店,就可以在视频号售卖商品。 具体怎么操作呢,需要拍视频&#xf…

Windows下mingw32编译ffmpeg5.1.4实现rtsp拉流

由于客户要求,要在Windows下使用mingw32编译,去ffmpeg.org下载需要编译的版本,使用msys2方法进行编译,使用QT5.10的编译器,基本上把网上的方法试了个遍,编译全部库总是报错出问题 查看了ffbuild文件夹中con…

JSP期末要点复习

一、JSP工作原理 1.客户端请求JSP页面:用户通过浏览器发送一个请求到服务器,请求一个特定的JSP页面。这个请求被服务器上的Web容器(如Apache Tomcat)接收。 2.JSP转换为Servlet:当JSP页面第一次被请求时&#xff0…

魅族应用市场驳回 安装包包含32位库,请处理32位库后再重新提交

问题出现 解决方法 打开HBuilerX找到项目的mainfest.json 取消cpu类型中armeabi-v7a的勾选。 armeabi-v7a 第7代及以上的ARM处理器(ARM32位),市面上大多数手机使用此CPU类型。 arm64-v8a 第8代、64位ARM处理器(ARM64位&#x…

用《让子弹飞》的话说,网易希望自己2024年又高又硬

5月23日港股盘后,网易披露了2024年第一季度的财务报告。报告期内,公司总营收达到268.52亿人民币,同比增长7.21%。归母净利润表现强劲,达76.34亿人民币,同比增长13.02%。 结合行业大环境背景来看,尽管去年Q…

Elasticsearch之入门与安装

Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来…

六西格玛培训公司:企业成长的“超级导师”——张驰咨询

六西格玛培训公司在企业中扮演着至关重要的角色,其作用主要体现在以下几个方面: 提升企业管理能力: 六西格玛管理将数据和事实作为驱动力,帮助企业将管理从理论转化为实际行动。 通过实施六西格玛管理,企业能够显著…

学习Java的日子 Day49 函数,DOM

Day48 1.流程控制语句 if else for for-in(遍历数组时,跟Java是否一样) While do while break 语句用于跳出循环 continue 用于跳过循环中的一个迭代 2.函数 2.1 JavaScript 函数语法 函数就是包裹在花括号中的代码块,前面使用了关键词 function funct…

信息系统项目管理师0133:工具与技术(8项目整合管理—8.8实施整体变更控制—8.8.2工具与技术)

点击查看专栏目录 文章目录 8.8.2 工具与技术8.8.2 工具与技术 专家判断实施整体变更控制过程中,应征求具备如下领域相关专业知识或接受过相关培训的个人或小组的意见,涉及领域包括:关于项目所在的行业以及项目关注的领域的技术知识;法律法规;法规与采购;配置管理;风险管…

HTTP 协议的基本格式和Fidder的简单使用

HTTP协议诞生于1996(开玩笑哈,诞生于1991年),http协议用于网页和手机app和服务器交互的场景。通过HTTP协议,客户端(例如网页浏览器或手机应用)可以向服务器发送请求,服务器则会响应这…

简单微信企业群消息推送接口

群管理 群发送接口 POST: JSONURL http://localhost:65029/m/wxapi/sendwxmsg{ "nr":"试", --消息 "at":"wxid_y0k4dv0xcav622,wxid_y0k4dv0xcav622",--群wxid "key":"F98F354F1671A2D21BC78C76B95E96EB",--群k…

振弦采集仪在岩土工程监测中的精度与可靠性评估

振弦采集仪在岩土工程监测中的精度与可靠性评估 河北稳控科技振弦采集仪是一种常用的岩土工程土体力学参数监测仪器,它主要用于测量岩土中的应力、应变和模量等力学参数。在岩土工程中,土体力学参数的精确测量对于工程设计、施工和监测都非常重要。因此…

python-编写函数判断一个三位数是否为水仙花数。

【问题描述】要求编写函数isflower(n)判断一个三位数n是否为水仙花数,如果是,则返回True,否则返回False。在主程序中要求调用该函数并输出三位数中所有的水仙花数。所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。例如…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十一)- 微服务(1)

微服务 1.认识微服务 SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系,如下: 2. 服务拆分 需求 : 把订单信息和用户信息一起返回 从订单模块向用户模块发起远程调用 , 把查到的结果一起返回 步骤 &…

类和对象03

六、继承 我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。 这个时候我们就可以考虑利用继承的技术,减少重复代码 6.1 继承的基础语法 例如我们看到很多网站中, 都有公共的头部,公共的底…