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

本文主要是介绍开发心电疾病分类的深度学习模型并部署运行于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 

这篇关于开发心电疾病分类的深度学习模型并部署运行于ARM虚拟硬件平台(AVH)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007402

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4