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

news2024/11/16 3:40:04

目录

一、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.coloradmin.cn/o/1700867.html

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

相关文章

分子对接 molecular docking

https://www.sciencedirect.com/science/article/pii/S094471132400374X?via%3Dihub GitHub - beikwx/SailVina: SailVina重构增强版 Molecular docking Download the PTPRB protein structure on the PDB database (RCSB PDB: Homepage). Select the high-resolution PTP…

Dubbo生态之sentinel限流

1. 限流算法 我们知道,在分布式架构中,当服务请求量过大时,容易对服务器造成不可预知的压力,因此,我们在客户端请求的时候,进行限流,起到一个保护的作用 常见的限流算法有: 计数器限流&#x…

Mixed-precision计算原理(FP32+FP16)

原文: https://lightning.ai/pages/community/tutorial/accelerating-large-language-models-with-mixed-precision-techniques/ This approach allows for efficient training while maintaining the accuracy and stability of the neural network. In more det…

C++第二十弹---深入理解STL中vector的使用

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、vector的介绍 2、vector的使用 2.1、构造函数和赋值重载 2.1.1、构造函数的介绍 2.1.2、代码演示 2.2、容量操作 2.3、遍历 2.4、增删…

RH850F1KM-S4-100Pin_ R7F7016453AFP MCAL PWM 配置

1、PWM组件包含的子配置项 PwmGeneralPwmDemEventParameterRefsPwmConfigurationOfOptApiServicesPwmChannelConfigSet2、PwmGeneral 2.1、PwmPowerStateConfig 2.1.1、PwmPowerState 该参数的每个实例描述PWM HW支持的不同功率状态。它应该由硬件供应商定义,并由PWMDriver用…

HoneyTrap蜜罐系统实践操作@FreeBSD

HoneyTrap介绍 HoneyTrap是一个可扩展的开源系统,用于运行、监控和管理蜜罐。 HoneyTrap蜜罐系统通过在网络中部署感应节点,实时感知周边网络环境,并将感应节点的日志进行实时存储和可视化分析,从而实现对网络环境中威胁情况的感…

BUUCTF-WEB3

[极客大挑战 2019]Knife1 1.打开附件链接 一句话木马eval($_POST["Syc"]); 2.中国蚁剑 用中国蚁剑连接 在根目录下找到一个名为flag的文件 3.得到flag [极客大挑战 2019]Upload1

STM32Cubemx HAL库 移植FreeRTOS源码

本篇文章主要是使用STM32Cubemx生成Keil工程,然后在移植FreeRTOS源码,最后测试使用。 一、FreeRTOS简介 Free 和 RTOS,Free 就是免费的、自由的、不受约束的意思,RTOS 全称是 Real Time Operating System,中文名就是实…

大数据开发面试题【Spark篇】

115、Spark的任务执行流程 driver和executor,结构式一主多从模式, driver:spark的驱动节点,用于执行spark任务中的main方法,负责实际代码的执行工作;主要负责:将代码逻辑转换为任务、在executo…

Java对象不再使用时,为什么要赋值为 null ?

在Java中,将不再使用的对象赋值为null的目的主要是为了帮助垃圾收集器(更快地释放内存。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222&…

短剧平台开发中的常见误区及避坑指南,别再走弯路

1. 误区一:只注重外观,忽视技术基础 在短剧平台开发中,一个常见的误区是过于注重产品的外观设计,而忽视了技术基础的重要性。团队往往会投入大量精力和资源来打造吸引人的UI和炫酷的特效,但忽略了系统架构、性能优化和…

不能错过的AI知识学习神器「Mo卡片」

1. 「Mo卡片」——知识点的另一种承载方式 1.1 产品特点 📱一款专为渴望理解和掌握人工智能知识的小伙伴量身打造的轻量级 App。 🏷AI 知识卡片集 Mo卡片内置了 26 套卡片集,总计 1387 张卡片,每张卡片都能获得 1 个核心知识。…

领导让我调研CI/CD,我给他看了这个

一、概念解释 CI/CD是指持续集成(Continuous Integration)和持续交付/持续部署(Continuous Delivery/Continuous Deployment)的缩写,是现代软件开发中的重要实践。它们旨在通过自动化和持续化的方式改善软件开发、测试…

​你见过哪些不过度设计的优秀APP?​

优联前端https://ufrontend.com/ 提供一站式企业前端解决方案 “每日故宫”是一款以故宫博物院丰富的藏品为基础,结合日历形式展示每日精选藏品的移动应用。通过这款应用,用户可以随时随地欣赏到故宫的珍贵藏品,感受中华五千年文化的魅力。…

Solidity 教程01 Remix IDE 初次见面

访问链接地址: https://remix.ethereum.org/ 文件管理器 文件资源管理器用于管理工作区和文件。此插件还包含许多快捷方式和命令。要快速浏览,请右键单击文件以获取弹出菜单,并检查插件右上角的汉堡菜单。 要找到文件资源管理器模块 - 单…

如何用 Redis 统计海量 UV?

引言:在当今数字化时代,对于网站和应用程序的运营者而言,了解其用户的行为和习惯是至关重要的。其中,衡量页面的独立访客数量(UV)是评估网站流量和用户参与度的重要指标之一。然而,当面对海量访…

2024-BurpSuite快速配置Jython插件环境

文章目录 前言一、下载Jython二、配置Python environment 前言 很多插件需要python环境,Burpsuite本身是支持java的,Jython就是java和python的结合。 提示:以下是本篇文章正文内容,下面案例可供参考 一、下载Jython https://ww…

基于Spring+Struts2+Hibernate+MySQL的个人网上银行

## 系统概述该系统采用SpringHibernateStruts2框架搭建,实现了登录、退出功能。不同账号之间进行转账功能,查询转账记录功能,修改登录密码功能。## 使用方法* 将项目导入idea,修改hibernate.cfg.xml中的数据库用户名、密码等信息…

Go 语言简介 -- 高效、简洁与现代化编程的完美结合

在现代软件开发领域,选择合适的编程语言对于项目的成功至关重要。Go 语言(又称 Golang )自 2009 年由Google发布以来,以其简洁的语法、高效的并发模型以及强大的性能,迅速成为开发者们的新宠。Go语言不仅融合了传统编译…

水滴式粉碎机:让破碎多样化

水滴式粉碎机以其新的粉碎技术和卓越的性能,引领着粉碎技术的新革命。它采用了高速旋转技术,通过转子对物料进行撞击和摩擦,实现了对物料的精细粉碎,制备出了高品质、高附加值的产品。 水滴式粉碎机在多个行业中都有着广泛的应用…