基于 Arm 虚拟硬件的心电图(ECG)疾病分类应用开发实战

基于 Arm 虚拟硬件的心电图(ECG)疾病分类应用开发实战

目录

文章目录

    • @[toc]
  • 一、实验背景
    • 1. 嵌入式软件开发的基本流程
    • 2. Arm 虚拟硬件镜像产品简介
  • 二、实验目标
  • 三、实验步骤简介
  • 四、实验前准备
    • 1. 订阅使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例
      • 1.1 百度智能云账号准备
        • 1.1.1(可选)注册百度智能云账号
        • 1.1.2 登录百度智能云平台
        • 1.1.3 完成实名认证(个人用户)
      • 1.2 (新用户)购买使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例
      • 1.2 (非新用户)购买使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例
        • 1.2.1 订阅百度智能云云市场 Arm 虚拟硬件镜像
        • 1.2.2 配置购买百度智能云云服务器 BCC 实例
          • a. 基本配置
          • b. 网络和带宽
          • c. 登录凭证
          • d. 购买信息
          • e. 其他配置
          • f. 确认订单
      • 1.3 查看已购买的使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例
        • 1.3.1 查看实例列表
        • 1.3.2 查看实例详情
    • 2. 登录使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例
      • 2.1 浏览器窗口登录(通过 VNC 登录)
      • 2.2 查看 Arm 虚拟硬件镜像预装软件清单
  • 五、实验步骤指导
    • 1. 克隆实验代码
      • 1.1 了解实验项目技术栈
      • 1.2 更新 CMSIS Toolbox 工具
      • 1.3 安装项目依赖的 CMSIS Packs 软件包
      • 1.4 安装项目依赖的环境和 Python 软件包
    • 2. 数据预处理
      • 2.1 测试数据预处理
      • 2.2 数据标签预处理
    • 3. 模型编译和部署
      • 3.1 TensorFlow -> ONNX -> TVM 编译 -> Cortex-M55
      • 3.2 TensorFlow -> TFLite -> TVM 编译 -> Cortex-M55
  • 六、实验思考
  • 七、参考文档

本实验过程中所显示的优惠价格及费用报销等相关信息仅在【Arm AI 开发体验创造营】体验活动过程中有效,逾期无效,请根据实时价格自行购买和体验。同时,感谢本次体验活动 Arm 导师 Liliya 对于本博客的指导。
详见活动地址

一、实验背景

1. 嵌入式软件开发的基本流程

在常规的嵌入式软件开发中,通常需要在用于开发的电脑主机上提前把应用程序编译好,生成可在嵌入式芯片上运行的文件代码,再通过相应的烧录调试工具,把该代码烧录至开发板中,才能查看验证所编写应用程序的正确性。

传统的嵌入式开发流程中,往往需要用到物理开发板才能进行相应的软件开发。但是,没有拿到物理开发板或对于一些新推出的处理器产品(例如:Arm® Cortex®-M55,Cortex-M85, Ethos™-U 系列 NPU 等)市场上硬件的资源较为稀缺且需要较长的时间才能获取到物理开发板的情况下,是否有办法在相应的平台上进行软件开发呢?

答案自然是有的,这就是我们本期实验手册要给大家介绍的一个非常强大的开发工具:Arm 虚拟硬件(Arm Virtual Hardware)

2. Arm 虚拟硬件镜像产品简介

Arm 虚拟硬件(Arm Virtual Hardware)提供了一个 Ubuntu Linux 镜像,包括用于物联网、机器学习和嵌入式应用程序的 Arm 开发工具:例如,Arm 编译器、 FVP 模型和其他针对 Cortex-M 系列处理器的开发工具帮助开发者快速入门。Arm 虚拟硬件限时免费提供用于评估用途,例如,评估 CI/CD、MLOps 和 DevOps 工作流中的自动化测试工作流等。订阅访问和使用此版本的 Arm 虚拟硬件,您需同意产品最终用户许可协议中与免费测试版许可相关的条款和协议。

Arm 虚拟硬件产品的技术概览示意图如下所示。开发者也可访问 Arm 虚拟硬件产品介绍页和产品技术文档了解更多关于 Arm 虚拟硬件产品知识。


Arm 虚拟硬件产品概览
图1. Arm 虚拟硬件产品概览

二、实验目标

  1. 了解 Arm 虚拟硬件产品的功能及核心优势。
  2. 熟悉 Arm 虚拟硬件云服务器 BCC 实例的订阅流程及 Arm 虚拟硬件镜像内的主要组件。
  3. 掌握如何使用 Arm 虚拟硬件云服务器 BCC 实例进行嵌入式软件的开发(例如:机器学习、物联网应用等)并熟悉其基本的开发流程,包括:如何搭建开发环境、编译构建应用代码、运行调试工程代码等步骤。

三、实验步骤简介

本实验将展示如何使用百度智能云云市场上的 Arm 虚拟硬件镜像开发一个心电疾病分类的算法。更详细的实验项目介绍资料请参考本手册第五章《实验步骤指导》中的内容。
本实验主要包括以下几个核心步骤,并在接下来的章节中提供更全面的操作指南:

1. 了解 Arm 虚拟硬件产品的功能及核心优势

  • 访问 Arm 虚拟硬件产品介绍网站或 Arm 公司 官网了解 Arm 虚拟硬件产品信息。
  • 微信搜索并关注 “Arm 社区” 微信公众号(二维码见文末),回复 “AVH” 即可获取更全面的关于 Arm 虚拟硬件产品的最新资讯和技术指南博客。

2. 订阅使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例

  • (可选地)注册百度智能云账号并完成个人实名验证。
  • 订阅指定的使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例。
  • 登录所购买的云服务器 BCC 实例并熟悉 Arm 虚拟硬件镜像环境。

3. 完成实验项目的开发与测试

  • 克隆本实验项目代码到 BCC 实例中。
  • 安装本实验项目所依赖的 CMSIS Packs 软件包。
  • 编译构建本实验项目的应用程序,生成相应的可执行文件。
  • 使用 Arm 虚拟硬件镜像中的 Cortex-M55 的虚拟硬件 FVP 模型执行所构建的心电疾病分类应用。

4. 验证实验运行结果

  • 应用程序代码运行过程中,查看实验结果与预期结果是否一致。

四、实验前准备

本章节将重点介绍如何订阅使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例。这一步骤是我们后续进行实验项目开发和测试的必要准备,为我们后续实验项目的体验提供了基础的开发环境和工具。

1. 订阅使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例

Arm 虚拟硬件镜像目前已经在百度智能云云市场上线,具体的订阅步骤可以参考如下。

1.1 百度智能云账号准备

若您已经拥有百度智能云的账号并完成了个人实名验证可忽略部分步骤并直接登录百度智能云平台即可。可选步骤仅面向从未使用过百度智能云的新用户或拥有百度智能云账号(云账号或百度账号)却未完成实名制认证的用户。

1.1.1(可选)注册百度智能云账号

访问百度智能云登录/注册页面注册【云账号】(可选地,也可注册和使用【百度账号】登录)。具体注册流程请根据百度智能云账户注册页面的提示操作并完成注册即可。

1.1.2 登录百度智能云平台

访问百度智能云平台登录页面,根据所注册的账号类型输入相应的账号和密码登录(推荐使用【云账号】,【云账号】的登录示意图如下图所示)。


实名认证入口
图2. 百度智能云平台登录界面

1.1.3 完成实名认证(个人用户)

成功登录后,点击用户头像(位于页面右上角)会自动跳转至【用户中心】界面(或手动选择下拉菜单中的【用户中心】按钮进行跳转)。【用户中心】页面,请参考图 3-6 中的步骤完成个人实名认证(可选地,若为企业用户也可进行企业认证)。


实名认证入口
图3. 实名认证入口

选择实名认证方式
图4. 选择实名认证方式

信息录入并完成实名认证
图5. 信息录入并完成实名认证

认证成功提示
图6. 认证成功提示

请根据自身是否为新用户的情况,二选一完成 1.2 章节。若未购买过百度智能云的任何一款云服务器产品,包括:从未注册过百度智能云账号的用户、以及已注册过百度智能云账号但未有发生过购买行为的用户,即为新用户,可享受优惠购买价格。

1.2 (新用户)购买使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例

访问百度智能云云服务器新品推荐页面。如下图所示,即为我们需要配置购买的百度智能云云服务器 BCC 实例。


认证成功提示
图6. 认证成功提示

点击【立即购买】按钮,将会自动跳转至如下图所示的订单购买页面。请注意页面底端的【地域】和【云市场镜像】两个选项以及右上角的订单金额

  • 地域】:仅可选择【广州】(推荐)、【北京】、【苏州】此 3 个地域中任意一个。
  • 云市场镜像】:确保其为 Arm 虚拟硬件(Arm Virtual Hardware,AVH)
  • 订单金额】:由于云服务器 BCC 实例的基础设施配置默认且相同,因此订单价格应与图示价格应一致。

确认订单明细及价格
图8. 确认订单明细及价格

点击【下一步】后,将会自动跳转至如下图所示的订单确认页面。请再次核对此页面所示的云服务器 BCC 实例的各个配置选项以及订单价格。


订单确认页面
图9. 订单确认页面

点击【去支付】后,将会跳转至如下图所示的订单支付页面。可根据自己的情况选择支付方式并完成支付。支付完成后,将会显示实例开通成功的提示。开通成功后,即可根据 1.3 章节中的内容进行后续的操作。


订单支付页面
图10. 订单支付页面

实例开通成功提示
图11. 实例开通成功提示

1.2 (非新用户)购买使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例

1.2.1 订阅百度智能云云市场 Arm 虚拟硬件镜像

访问百度智能云云市场主页,产品搜索框输入 “Arm虚拟硬件” 即可进入 Arm 虚拟硬件产品详情页面(也可直接点击链接跳转)。


百度智能云云市场 Arm 虚拟硬件产品简介
图12. 百度智能云云市场 Arm 虚拟硬件产品简介

请仔细阅读产品详情页面的产品信息以及相关服务协议(例如:《商品服务协议》和《云市场服务协议》),确认无误后勾选【同意】框并点击【立即购买】并进入到百度智能云云服务器 BCC 实例购买配置页面。


Arm 虚拟硬件产品订阅页面
图13. Arm 虚拟硬件产品订阅页面

1.2.2 配置购买百度智能云云服务器 BCC 实例

百度智能云云服务器 BCC 实例的配置与购买示意图如下所示,请仔细阅读下文中配置步骤 a-f 中的注意事项。


百度智能云云服务器 BCC 实例配置页面
图14. 百度智能云云服务器 BCC 实例配置页面

a. 基本配置
  • 付费及地域

    • 计费方式】默认为“包年包月”方式,请勿更改。目前【云市场镜像】仅支持“包年包月”模式,若调整为其他模式会导致无法订阅使用云市场的 Arm 虚拟硬件镜像服务。
    • 当前地域】可选择“华北-北京”、“华南-广州”以及“华东-苏州”(可参考图 15 中选择当前地域为 “华南-广州”)。请勿选择除上述 3 个选项之外的地域。具体原因为:目前百度智能云云市场上线发布的 Arm 虚拟硬件镜像仅可运行于采用 Arm 架构的服务器实例上,仅在上述 3 个地区有提供。

    付费及地域配置参考示意图
    图15. 付费及地域配置参考示意图

  • 配置

    • 实例配置】中【架构】请选择 “ARM计算”(原因如前文所述)。
    • 实例规格】可参考图 16 中选择 “bcc.gr1.c1m4”(即 1 核、4GB 内存)。
    • 镜像类型】请选择【云市场镜像】中的 “Arm虚拟硬件(Arm Virtual Hardware)”。请注意:
      • 若从云市场 Arm 虚拟硬件产品详情页进入,此项默认会自动匹配,无需手动配置。
      • 若从云服务器 BCC 实例创建入口直接进入,请手动搜索选择【云市场镜像】中的 “Arm 虚拟硬件(Arm Virtual Hardware)”。

      实例配置参考示意图
      图16. 实例配置参考示意图

      镜像类型参考示意图
      图17. 镜像类型参考示意图

      (可选)手动选择镜像类型操作示意图
      图18. (可选)手动选择镜像类型操作示意图

  • 存储

    • 系统盘】类型及是否添加额外存储盘会影响实例价格。参考下图,存储配置【系统盘】可选择 “通用型SSD、40GB”,以及不添加其他存储盘。此项无特殊要求,可根据用户所实际开发项目的工作负荷大小进行配置。

    存储配置参考示意图
    图19. 存储配置参考示意图

b. 网络和带宽
  • 网络

    • 私有网络】保持默认配置即可(【网络类型】和【安全组】不进行改动)。
    • 公网访问】保持默认配置即可(【公网带宽】的不同配置模式会造成购买实例时较大的价格差异。参考下图,本实验中推荐保持默认即可,即:【公网带宽】采用 “包年包月计算” 模式并且【带宽峰值】为 “1Mbps”)。

    网络配置参考示意图
    图20. 网络配置参考示意图

c. 登录凭证
  • 登录凭证

    • 如下图所示,请选择 【创建后设置】。
    • 初始登录用户名为 “ubuntu",密码统一为 “avh”。首次登录后请注意及时更改密码为自定义的密码,确保所使用镜像的安全性。受镜像内工具组件的许可证约束,目前仅支持使用 “ubuntu” 作为用户名进行登录和后续开发,请勿使用其他(例如:root)。

    登录凭证配置参考示意图
    图21. 登录凭证配置参考示意图

d. 购买信息

参考下图,保持默认配置即可。可选地,根据自己的需求进行【购买数量】和【购买时长】的自定义选择。


购买信息配置参考示意图
图22. 购买信息配置参考示意图

e. 其他配置

保持默认即可,或可选地参考以下说明进行自定义配置。

  • 部署集】、【标签】、【资源分组】建议保持默认配置。

  • 系统信息】中【实例名称】和【主机名】可保持空白(即由系统随机生成)。

    • (特别地,用于本次创造营活动报销)创建实例的过程中将【实例名称】和【主机名】定义为 “arm-用户的百度智能云 ID ” 的格式(如何找到用户自己的百度智能云 ID 请参考图 29 所示)。
    • (特别地,用于本次创造营活动报销)可选地,在实例创建完成后进行修改,参考后续步骤中的提示。

    其他配置参考示意图
    图23. 其他配置参考示意图

f. 确认订单
  • 订单确认
    配置完成后,点击下方蓝色的【确认购买】按钮即可进入订单确认页面。该页面可再次确认所购买的云服务器 BCC 实例的各项信息(主要包括:BCC、系统盘、EIP、MKT、快照链容量以及代金劵选择等方面)。
    • 请注意,创建实例过程中不同的配置选项会造成价格差异。本实验中的参考配置下的实例价格如下图所示。阅读并勾选同意对应条款后点击页面底部的蓝色【提交订单】按钮即可跳转至订单支付页面。

订单确认页面参考示意图
图24. 订单确认页面参考示意图

  • 订单支付
    订单支付界面可再次查看和确认所订购的云产品服务及其价格,确认无误后可选择支付方式。目前可选的支付方式包括:【账户余额支付】、【支付宝支付】、【微信支付】或其他支持的支付方式。确认无误后,点击页面底部的蓝色【确认支付】按钮即可完成支付。

订单支付页面参考示意图
图25. 订单支付页面参考示意图

  • 实例开通
    支付完成后,请耐心等待实例开通过程。当页面提示如下图所示,即表示实例已经成功开通。

实例开通成功提示
图26. 实例开通成功提示

1.3 查看已购买的使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例

1.3.1 查看实例列表

实例创建完成后,可以点击图 26 中的【管理控制台】按钮直接跳转到实例列表页面。需要注意的是,请确保跳转后页面上方【控制台总览】旁的地区和在 1.2 节中创建实例时所配置的 【当前地域】 一致,否则可能出现实例不存在或不显示的情况。若不一致,请手动切换为创建实例时所配置的地域(例如,图 15 中所选择的为“华南-广州”,此处选择同为“华南-广州”)。
若确保一致仍未显示,请耐心等待 1-2 分钟,实例可能仍处于创建和初始化过程中。


实例列表详情页面
图27. 实例列表详情页面

1.3.2 查看实例详情

实例列表页面,点击蓝色的实例名称即可跳转至实例详情页面。此页面可以再次查看所创建实例的详细信息,并请重点关注以下几个关键信息:


实例详情页面
图28. 实例详情页面

  • 实例名称和主机名
    如 1.2 章节中所描述,若在创建实例的过程中未自定义实例名称和主机名(即保持空白),则此两项信息将由系统随机生成。为便于活动报销,请参考下面图所示的步骤将其修改为 “arm-用户的百度智能云账户ID” 的格式。若已经在创建实例的过程中完成了规定格式的自定义,请忽略下面的步骤。

    • a. 请访问【用户中心】页面获取自己的百度智能云账户ID。

    获取百度智能云账户ID
    图29. 获取百度智能云账户ID

    • b. 图 28 所示的实例详情页面点击【实例名称】旁的【修改】按钮修改实例名称并点击【确认】完成修改。

    修改实例名称
    图30. 修改实例名称

    修改格式示意图
    图31. 修改格式示意图

    • c. 图 28 所示的实例详情页面点击【主机名】称旁的【修改】按钮修改主机名并点击【确认】完成修改。

    修改主机名
    图32. 修改主机名

    修改格式示意图
    图33. 修改格式示意图

    • d. 主机名修改后,实例将会自动重启。请耐心等待实例完成自动重启。重启完成后,实例【状态】将会由 “重启中” 变化为 “运行中”。

    实例重启中示意图
    图34. 实例重启中示意图

    实例重启完成示意图
    图35. 实例重启完成示意图

  • 状态:确认实例状态处于 “运行中”。

  • 公网 IP:用于 SSH(Secure Shell Protocol)等远程登录操作。

  • 实例规格:确认是否与订阅时选择的一致,参考示例中为 bcc.gr1.c1m4

  • 镜像信息和镜像类型:确认是否与订阅时选择的一致,即 Arm虚拟硬件(Arm Virtual Hardware)(试用版) 和云市场镜像。

2. 登录使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例

百度智能云云服务器 BCC 实例提供了多种方式供开发者连接登录。如需深入了解,请参考百度智能云云平台帮助文档《登录 Linux 实例》。

强烈推荐有基础的开发者使用 SSH 远程登录方法连接所创建的使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例(例如,终端使用命令 ssh ubuntu@公网 IP,密码为avh),具体连接方法可参考博客《 Arm 虚拟硬件实践专题一:产品订阅指南(百度智能云版)》,开发体验会更加稳定和流畅。可选地,可参考 2.1 章节所描述的 《浏览器窗口通过 VNC 登录》的方式连接实例。

2.1 浏览器窗口登录(通过 VNC 登录)

本小节将介绍一种更为简单的百度智能云云服务器 BCC 实例的登录方式供开发者参考和使用。如下图所示,点击实例列表详情页面所创建的使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例(确保实例【状态】为 “运行中” )右侧蓝色的【远程登录】按钮。弹出的窗口选项选择【通过 VNC 登录】,点击后页面即刻跳转至浏览器窗口登录页面如图 38 所示。完全启动后(即不再有新的启动日志滚动),输入登录用户名ubuntu和登录密码avh( Linux 命令行默认不显示密码)。


实例列表详情页面【远程登录】选项
图36. 实例列表详情页面【远程登录】选项

【远程登录】方式选择页面
图37. 【远程登录】方式选择页面

浏览器窗口VNC 登录页面
图38. 浏览器窗口 VNC 登录页面

登录过程中,正确地输入用户名和密码后,页面将会弹出和最终用户许可协议相关的提示信息。请您仔细阅读该提示中提及的网页链接中所展示的EULA文件确认无误后请输入Y/yes/YES等表示您确认同意遵守相应的最终用户许可协议。输入后按下回车,用户即可成功连接登录到所创建的使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例中。如图所示,当页面信息提示ubuntu@arm-百度智能云ID:~$等信息则代表您已经成功地作为ubuntu的用户身份登录到实例中(请确保用户名ubuntu正确,非root或其他自定义的用户名)。


登录过程提示
图39. 登录过程提示

(可选)登录后可在该页面手动输入 ls 命令可查看当前目录下的文件列表。


查看当前登录目录下文件列表
图40. 查看当前登录目录下文件列表

另外,请重点了解下面的 2 个小贴士,熟悉如何通过浏览器 VNC 登录页面完成实例的重启操作或输入/复制粘贴已有的命令(利于后续项目代码的输入)。

  • 重启实例:如下图所示,实验过程中若需要重启实例,请点击页面右上角的【发送Ctrl+Alt+Del】按钮。实例将立刻重启,重启完成后根据与上面步骤同样的方法输入登录账户名ubuntu和密码avh再次登录即可。

快捷重启实例
图41. 快捷重启实例

  • 输入命令/复制粘贴命令:由于网页直接输入代码或存在不稳定因素,若需稳定的输入命令或直接复制/粘贴已有的命令,请参考以下操作进行。点击页面右上角的【复制命令输入】按钮,输入已经复制的命令内容或手动输入相关命令后点击蓝色的【确认】按钮即可回到命令行输入页面。此处可以发现,所输入/复制粘贴的命令已经填充至命令行处,点击键盘上的回车按钮即可执行命令。

输入/复制粘贴命令方法示意图
图42. 输入/复制粘贴命令方法示意图

执行已输入的命令
图43. 执行已输入的命令

2.2 查看 Arm 虚拟硬件镜像预装软件清单

目前,Arm 虚拟硬件镜像预装的 Arm 相关软件工具清单可以通过以下两种方式查看:

  • 云市场 Arm 虚拟硬件产品详情页的规格参数介绍中的 “集成服务组件及版本” 信息。
  • 登录使用 Arm虚拟硬件镜像的百度智能云云服务器 BCC 实例后(默认登录目录为/home/ubuntu),运行以下命令将自动显示当前版本的 Arm 虚拟硬件镜像安装的 Arm 软件工具清单及其版本信息。同时,运行该命令后,当前目录下(/home/ubuntu)会自动生成文本文件tool-inventory.txt记录了所显示的工具清单和版本信息。

参考执行命令如下(该命令实则执行了位于 /home/ubuntu 目录下的 tool-inventory.sh 脚本文件):

./tool-inventory.sh

可参考的输出结果如下所示:

Arm Compiler information: 
Product: 
Component: Arm Compiler for Embedded 6.18
Tool: armclang [5e4cbf00]
Target: arm-arm-none-eabi

GNU Compiler information: 
arm-none-eabi-gcc (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.16)) 11.2.1 20220111
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

CMSIS build information: 
cbuild: Build Invocation 1.2.0 (C) 2022 ARM
Usage:
  cbuild <project.cprj> [flags]
Flags:
  -c, --clean              Remove intermediate and output directories
  -d, --debug              Enable debug messages
  -g, --generator string   Select build system generator (default "Ninja")
  -h, --help               Print usage
  -i, --intdir string      Set directory for intermediate files
  -j, --jobs int           Number of job slots for parallel execution
  -l, --log string         Save output messages in a log file
  -o, --outdir string      Set directory for output files
  -p, --packs              Download missing software packs with cpackget
  -q, --quiet              Suppress output messages except build invocations
  -r, --rebuild            Remove intermediate and output directories and rebuild
  -s, --schema             Check *.cprj file against CPRJ.xsd schema
  -t, --target string      Optional CMake target name
  -u, --update string      Generate *.cprj file for reproducing current build
  -v, --version            Print version

Arm Virtual Hardware Targets information: 
   FVP_Corstone_SSE-300 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

   FVP_Corstone_SSE-300_Ethos-U55 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

   FVP_Corstone_SSE-300_Ethos-U65 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_Corstone_SSE-310 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_Corstone_SSE-310_Ethos-U65 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_MPS2_Cortex-M0 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_MPS2_Cortex-M0plus information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_MPS2_Cortex-M23 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_MPS2_Cortex-M3 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_MPS2_Cortex-M33 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_MPS2_Cortex-M35P information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_MPS2_Cortex-M4 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_MPS2_Cortex-M55 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_MPS2_Cortex-M55_ADA information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_MPS2_Cortex-M7 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

  FVP_MPS2_Cortex-M85 information: 
Fast Models [11.22.38 (Oct 27 2023)]
Copyright 2000-2023 ARM Limited.
All Rights Reserved.
Info: /OSCI/SystemC: Simulation stopped by user.

特别地,请注意查看以下两项核心组件的相关信息:

  • Arm Compiler for Embedded 工具许可证有效期
    请注意,若运行 tool-inventory.sh 显示组件信息的过程中(注意起始的几行信息),出现下面所示的错误提示信息(红色 error 报错),请运行 armlm inspect 命令检查 Arm Compiler for Embedded 工具的许可证有效期。若有效期信息显示正常(即在有效期时间内),则可忽略并继续进行后续步骤。

    Arm Compiler information: 
    error: Your cached license information has expired and could not be refreshed
    error: Check your network connection and restart armclang
    error: https://lm.arm.com/200
    Product: 
    Component: Arm Compiler for Embedded 6.18
    Tool: armclang [5e4cbf00]
    

    可参考的工具许可证有效期提示信息如下,当前日期在工具许可证有效期限内,故表明该许可证有效期正常。

    ubuntu@ip:~$ armlm inspect
    Keil MDK Community (non-commercial free of charge)
       Product code: KEMDK-COM0
       Order Id: Community
       License valid until: 2033-05-31
       Local cache expires: 6 days and 23 hours
    

    若有效期提示信息异常(如下所示),请尝试重新启动实例(手动关机重启或参考图 41 所示快捷方式)再次运行armlm inspect 命令检查 Arm Compiler for Embedded 工具的许可证有效期。若多次尝试仍然异常,请参考本手册第七章《实验问题解答》中的问题 2。

    ubuntu@ip:~$ armlm inspect
    Keil MDK Community (non-commercial free of charge)
       Product code: KEMDK-COM0
       Order Id: Community
       Local cache expired on: 2024-03-28
    
  • Arm 固定虚拟平台(Fixed Virtual Platform,FVP)模型
    Arm 固定虚拟平台 FVP 模型为软件开发人员提供了基于 Arm 架构的 SoC 的准确模型。若想查看当前镜像内所支持的 Arm FVP 模型的清单,请运行 ls /opt/VHT/bin/FVP_* 命令。

    ubuntu@ip:~$ ls /opt/VHT/bin/FVP_*
    /opt/VHT/bin/FVP_Corstone_SSE-300            /opt/VHT/bin/FVP_MPS2_Cortex-M3
    /opt/VHT/bin/FVP_Corstone_SSE-300_Ethos-U55  /opt/VHT/bin/FVP_MPS2_Cortex-M33
    /opt/VHT/bin/FVP_Corstone_SSE-300_Ethos-U65  /opt/VHT/bin/FVP_MPS2_Cortex-M35P
    /opt/VHT/bin/FVP_Corstone_SSE-310            /opt/VHT/bin/FVP_MPS2_Cortex-M4
    /opt/VHT/bin/FVP_Corstone_SSE-310_Ethos-U65  /opt/VHT/bin/FVP_MPS2_Cortex-M55
    /opt/VHT/bin/FVP_MPS2_Cortex-M0              /opt/VHT/bin/FVP_MPS2_Cortex-M55_ADA
    /opt/VHT/bin/FVP_MPS2_Cortex-M0plus          /opt/VHT/bin/FVP_MPS2_Cortex-M7
    /opt/VHT/bin/FVP_MPS2_Cortex-M23             /opt/VHT/bin/FVP_MPS2_Cortex-M85
    

五、实验步骤指导

通过实验步骤四,我们已经成功地创建并登录了使用 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例。本章节我们将通过一个具体的应用案例,带领大家更深入地体验如何使用 Arm 虚拟硬件镜像环境进行嵌入式软件开发的全流程。

1. 克隆实验代码

首先我们需要将实验代码克隆(下载)至 BCC 服务器实例中,便于后续使用 Arm 虚拟硬件镜像环境中的软件开发工具进行进一步的开发调试。
本实验代码的仓库地址为:https://github.com/codehgq/ECG_classification_AVH.git 。通过以下命令可以将代码仓库中的代码克隆下载至服务器中。

mkdir ECG_classification
cd ECG_classification
git clone https://github.com/codehgq/ECG_classification_AVH.git

若下载速度较慢或下载不成功,可考虑在 ECG_classification 目录下使用以下代码下载。

git clone https://github.moeyy.xyz/https://github.com/codehgq/ECG_classification_AVH.git

代码克隆(下载)完成后,参考如下命令查看已克隆的实验工程目录(示例如下)。

ubuntu@heda3:~$ cd ECG_classification
ubuntu@heda3:~/ECG_classification$ ls
ECG_classification+PaddleClasM55.cbuild.yml  ECG_classification.cbuild-pack.yml  RTE                 packs.txt
ECG_classification+PaddleClasM55.cprj        ECG_classification.cproject.yml     convert_ECGData.py  rename_onnx_model.py
ECG_classification+PaddleClasM55.uvprojx     ECG_classification.csolution.yml    convert_labels.py   save
ECG_classification+PaddleClasM85.cbuild.yml  ECG_classification.uvoptx           data                trainData
ECG_classification+PaddleClasM85.cprj        ECG_classification.uvprojx          include             vcpkg-configuration.json
ECG_classification.cbuild-idx.yml            README.md                           main.c              sct

1.1 了解实验项目技术栈

通过上述步骤,我们已经成功地将实验项目代码克隆(下载)到了 BCC 服务器实例中。在正式地进行实验项目体验之前,我们首先需要了解本实验项目的一些技术原理和相应的工程代码实现,便于我们更好地理解整个实验项目。本实验的心电疾病分类算法的流程示意图如下所示。


软件算法流程图
图44. 软件算法流程图

  • 从流程图中可以看出,完成心电疾病分类的过程,需经过:心电数据的读取加载、数据点预处理(1x3600维数)、数据的标准化、CNN模型推理、输出预测的1x7维度的概率矩阵等步骤。
  • 同时,我们将采用两种不同的编译方式对训练好的推理模型进行编译使其可以运行在 Cortex-M55 处理器上,并使用 Arm 虚拟硬件镜像中 Cortex-M55 处理器的虚拟硬件 FVP 模型验证这两种不同的编译方式是否会对应用最后的推理结果造成影响。

在了解该心电疾病分类算法的功能和主要步骤的基础上,进一步地,请开发者仔细阅读实验项目的帮助文档 README.md(在实验项目根目录下),有助于更深入理解本实验项目的工程代码实现。


帮助文档
图45. 帮助文档

1.2 更新 CMSIS Toolbox 工具

完成实验代码的克隆(下载)后,因为本项目搭建所使用的 CMSIS Toolbox 工具版本与 Arm 虚拟硬件镜像中内置的工具版本不同,因此开发者可以考虑手动地将 CMSIS Toolbox 工具进行升级。参考以下命令进行工具的更新。GitHub 资源下载速度受限,请耐心等待下载完成。

wget "https://github.com/Open-CMSIS-Pack/cmsis-toolbox/releases/download/2.2.1/cmsis-toolbox-linux-arm64.tar.gz"
tar -vxf cmsis-toolbox-linux-arm64.tar.gz
rm cmsis-toolbox-linux-arm64.tar.gz
sudo rm -rf /opt/ctools/
sudo mv cmsis-toolbox-linux-arm64/ /opt/ctools

1.3 安装项目依赖的 CMSIS Packs 软件包

在构建应用之前,我们仍需要手动安装一些实验项目所依赖的软件包。本项目的开发采用了 Open-CMSIS-Pack 项目的标准形式,我们可以使用 Arm 虚拟硬件镜像中的 CMSIS-Toolbox 工具包里的 cbuild 工具来构建本实验项目。需要注意的是,正常情况下,运行 cbuild 命令在构建工程的过程中会自动下载项目所依赖的 CMSIS Packs 软件包。但由于国内外网络环境的差异,部分 CMSIS Packs 软件包资源的下载速度较慢导致无法自动下载成功。本文提供以下几种方式安装所需要的 CMSIS Packs 软件包。

小贴士,若查看当前工程所需要安装或缺失的 CMSIS Packs 软件包可以使用 csolution 工具。例如,输入以下命令可以查看当前项目所需要的 CMSIS Packs 软件包。-m 参数指定列举未安装的软件包,当前项目缺失 6 个相关软件包。因此我们需要将它们安装上后,才可以进行项目应用的构建。

ubuntu@ip:~/ECG_classification/ECG_classification_AVH$ csolution list packs ECG_classification.csolution.yml -m
ARM::CMSIS@5.9.0
ARM::CMSIS-DSP@1.15.0
ARM::CMSIS-NN@4.1.0
ARM::V2M_MPS3_SSE_300_BSP@1.4.0
ARM::V2M_MPS3_SSE_310_BSP@1.3.0
Keil::ARM_Compiler@1.7.2
  • 方法一:通过 CMSIS Packs 软件包下载网址逐个手动下载,并上传至所创建的 Arm 虚拟硬件镜像中。例如:使用 scp -r ARM.CMSIS.5.9.0.pack ubuntu@ip:/home/ubuntu 命令将该软件包从主机上上传至云端的 Arm 虚拟硬件镜像中的目录 /home/ubuntu 下面。然后切换至该目录下后使用 cpackget add ARM.CMSIS.5.9.0.pack 命令完成安装。一个简单的安装示例如下所示:

    ubuntu@instance-9w8dognp:~$ cpackget add ARM.CMSIS.5.9.0.pack
    I: Adding pack "ARM.CMSIS.5.9.0.pack"
    I: Extracting files to /home/ubuntu/packs/ARM/CMSIS/5.9.0...
    I: 100% |████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| (8642/8642, 8219 it/s)    
    

    参考下面命令逐个将缺失的软件包安装完毕(需先将相应的 CMSIS Pack 软件包提前下载并上传至所创建的 Arm 虚拟硬件镜像中)。

    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
    
  • 方法二:使用其他博主提供的 CMSIS Pack 软件包的压缩包集合,可以参考以下命令在服务器中下载和安装相应的软件包。可选地,也可以本地主机下载,然后上传至相应的服务器对应位置中解压,完成相应 CMSIS Pack 软件包的安装。

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

1.4 安装项目依赖的环境和 Python 软件包

参考以下命令完成项目依赖的 Python 软件包的安装。若遇到因网速较慢导致下载失败的情况,可多次运行相应的命令进行下载操作直至成功安装。

echo 'export PATH=/home/ubuntu/.local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
sudo apt install libhdf5-dev

pip install --upgrade pip
pip install opencv-python
pip install apache-tvm
pip install paddle2onnx
pip install onnx
pip install paddlepaddle==2.5.2

pip install scikit-learn
pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install tf2onnx
pip install pyserial==3.5 tflite=-2.1

2. 数据预处理

2.1 测试数据预处理

运行以下脚本处理心电图数据。具体处理过程请参考实验脚本 convert_ECGData.py。

python ./convert_ECGData.py ./data/TestX_eu_MLIII.csv

2.2 数据标签预处理

运行以下脚本处理心电图数据的标签。具体处理过程请参考实验脚本 convert_labels.py。

python convert_labels.py data/TestY_eu_MLIII.csv

3. 模型编译和部署

所使用的 TensorFlow 模型位于代码仓库的 save/CNN目录下。本小节我们将使用两种方式将该模型编译成可以在目标 Cortex-M55 平台上运行的代码并在后序章节中比较不同编译方式部署效果的差异。

3.1 TensorFlow -> ONNX -> TVM 编译 -> Cortex-M55

  • 模型转换

    通过以下命令可以将 TensorFlow 模型转换成 ONNX 模型格式。转换完成之后,我们可以在目录 onnx 下发现转换完毕的 ONNX 格式的模型文件 cnn_model.onnx。感兴趣的同学可以使用 netron 工具查看该模型的结构信息。

    python -m tf2onnx.convert --saved-model save/CNN --output  onnx/cnn_model.onnx
    
  • 模型编译

    转换完成后,使用下面的命令借助开源的深度学习编译器 TVM 将 ONNX 模型编译成为可以在 Cortex-M55 处理器上运行的代码,并将生成的代码进行解压。

    TVM_TARGET="cortex-m55"
    tvmc compile onnx/cnn_model.onnx \
      --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 \
      --output-format=mlf \
      --model-format=onnx \
      --input-shapes input_1:[1,3600] \
      --module-name=cls \
      --output=cls.tar
    mkdir cls
    tar -xvf cls.tar -C ./cls
    
  • 模型部署

    模型只是机器学习应用的一部分,接下来我们将编译该心电图分类应用。运行下面两个命令的任一个均可以构建工程。

    cbuild ECG_classification+PaddleClasM55.cprj
    # 可选
    # cbuild ECG_classification.csolution.yml
    

    当日志提示 info cbuild: build finished successfully! 即表明该应用已经成功构建,即可调用含有 Cortex-M55 的 FVP 模型平台执行应用查看运行结果。可参考使用如下命令以及运行效果的示意图。

    FVP_Corstone_SSE-300 -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  /home/ubuntu/ECG_classification_AVH/out/ECG_classification/PaddleClasM55/ECG_classification.axf --stat
    

    其中,

    • FVP_Corstone_SSE-300 即为所使用的含有 Cortex-M55 处理器平台的 FVP 模型。
    • ECG_classification.axf 为所构建的应用的可执行文件。
    • --stat 指定打印运行信息。
    • -C 指定 FVP 模型运行的具体参数。

运行效果示意图
图46. 运行效果示意图

3.2 TensorFlow -> TFLite -> TVM 编译 -> Cortex-M55

  • 模型转换

    通过以下命令可以将 TensorFlow 模型转换成 tflite 模型格式。转换完成之后,我们可以在目录 tfl 下发现转换完毕的 tflite 格式的模型文件 ecgcls.tflite。感兴趣的同学可以使用 netron 工具查看该模型的结构信息。

    mkdir tfl
    tflite_convert \
    --saved_model_dir=/home/ubuntu/ECG_classification_AVH/save/CNN\
    --output_file=/home/ubuntu/ECG_classification_AVH/tfl/ecgcls.tflite
    
  • 模型编译

    转换完成后,使用下面的命令借助开源的深度学习编译器 TVM 将 tflite 模型编译成为可以在 Cortex-M55 处理器上运行的代码,并将生成的代码进行解压。

    TVM_TARGET="cortex-m55"
    tvmc compile tfl/ecgcls.tflite \
      --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 \
      --output-format=mlf \
      --model-format=tflite \
      --input-shapes serving_default_input_1:[1,3600] \
      --module-name=cls \
      --output=cls.tar
    mkdir cls
    tar -xvf cls.tar -C ./cls
    
  • 模型部署

与前文类似,此处我们进行模型的部署和效果的验证。但是需要注意的是,因为节点的名称发生了改变,因此我们需要手动的修改 main.c 文件中相应输入节点的名称。如下图所示,需要将 main.c 中输入和输出名称修改如下图所示。


main.c 修改示意图
图47. main.c 修改示意图

运行结果示意图如下


运行效果示意图
图48. 运行效果示意图

六、实验思考

两种不同的模型编译方式运行的结果也有一定的差异,由运行结果图可知,TensorFlow 模型通过转换为 tflite 模型再经由 TVM 编译部署到 MCU 上运行效果更优。同时,也可以看出 Arm 虚拟硬件对于我们早期验证和比较算法的运行效果提供了一定的帮助优势。通过 Arm 虚拟硬件平台进行软件程序的验证是一个很好的选择,未来可以进一步尝试其它的虚拟硬件的部署。

七、参考文档

[1]. Arm 虚拟硬件产品简介
[2]. Arm 虚拟硬件帮助文档
[3]. Arm 虚拟硬件开发者资源
[4]. 【中文技术指南】Arm 虚拟硬件实践专题一:产品订阅指南(百度智能云版)
[5]. 【中文技术指南】Arm 虚拟硬件实践专题二:Arm 虚拟硬件 FVP 模型入门指南
[6]. 【中文视频直播课】加速AI开发,1小时快速入门Arm虚拟硬件
[7]. Arm 与 Paddle 共创模型库
[8]. TVM 社区 Arm 贡献案例
[9]. Arm 社区微信公众号

Arm 社区微信公众号

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

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

相关文章

Ubuntu 安装 CloudCompare

步骤&#xff1a; sudo apt install flatpakflatpak install flathub org.cloudcompare.CloudCompare此时会有报错&#xff1a; error: No remote refs found similar to ‘flathub’执行 flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.fla…

[深度学习]--分类问题的排查错误的流程

原因复现&#xff1a; 原生的.pt 好使&#xff0c; 转化后的 CoreML不好使&#xff0c; 分类有问题。 yolov8 格式的支持情况 Format Argument Suffix CPU GPU 0 PyTorch - .pt True True 1 Tor…

STM32多种开发环境及生成hex及bin文件介绍

一.STM32开发环境 KEIL系列 &#xff08;1&#xff09;KEIL公司目前有四款独立的嵌入式软件开发工具&#xff0c;即MDK、KEIL C51、KEIL C166、KEIL C251&#xff0c;它们都是KEIL公司品牌下的产品&#xff0c;都基于uVision集成开发环境&#xff0c;其中MDK是RealView系列中…

初阶 《数组》 3. 数组越界

3. 数组越界 数组的下标是有范围限制的。 数组的下规定是从0开始的&#xff0c;如果数组有n个元素&#xff0c;最后一个元素的下标就是n-1。 所以数组的下标如果小于0&#xff0c;或者大于n-1&#xff0c;就是数组越界访问了&#xff0c;超出了数组合法空间的访问。 C语言本身…

在Mac上恢复丢失或未保存的Word文档的5种有效方法

“救命&#xff01;我想在Mac上恢复丢失的Word文档。就在 1 小时前&#xff0c;我错误地删除了它们&#xff0c;并清空了垃圾桶。这些Word文档对我来说非常重要。我不知道如何恢复它们&#xff0c;谁能帮我&#xff1f;提前致谢&#xff01; 没有什么比忘记保存 Word 文档或在…

openEuler搭建hadoop 伪分布式集群

openEuler搭建hadoop 伪分布式集群 Mode 伪分布式 hadoop101hadoop102hadoop103192.168.10.101192.168.10.102192.168.10.103namenodesecondary namenoderecource managerdatanodedatanodedatanodenodemanagernodemanagernodemanagerjob historyjob logjob logjob log 升级软…

C语言之顺序结构以及程序调试的debug宏

一&#xff1a;C语言中的顺序结构 1:最浅显的顺序结构理解&#xff1a;三种结构之一 &#xff08;1&#xff09;代码执行的时候没有遇到判断跳转或者循环&#xff0c;默认是顺序执行的。执行完上一句则开始执行下一句。 &#xff08;2&#xff09;顺序结构说明cpu的工作状态&a…

springboot基于Web的社区医院管理服务系统 LW+ PPT+源码+讲解

3系统需求分析 3.1系统功能 通过前面的功能分析可以将社区医院管理服务系统的功能分为管理员、用户和医生三个部分&#xff0c;系统的主要功能包括首页、个人中心、用户管理、医生管理、预约医生管理、就诊信息管理、诊疗方案管理、病历信息管理、健康档案管理、费用信息管理…

【Linux】ss 命令使用详解

目录 一、ss命令介绍 二、ss命令格式和使用 1、命令格式 2、ss命令的常用选项 3、命令的常见用法 3.1 找出打开套接字/端口应用程序 3.2 检查系统的监听套接字 3.3 显示所有状态为established的SMTP连接 3.4 查看建立的 TCP 连接 3.5 通过 -r 选项解析 IP 和端口号 …

【YOLOv5/v7改进系列】引入特征融合网络——ASFYOLO

一、导言 ASF-YOLO结合空间和尺度特征以实现精确且快速的细胞实例分割。在YOLO分割框架的基础上&#xff0c;通过引入尺度序列特征融合(SSFF)模块来增强网络的多尺度信息提取能力&#xff0c;并利用三重特征编码器(TFE)模块融合不同尺度的特征图以增加细节信息。此外&#xff…

《Windows API每日一练》5.2 按键消息

上一节中我们得知&#xff0c;Windows系统的按键消息有很多类型&#xff0c;大部分按键消息都是由Windows系统的默认窗口过程处理的&#xff0c;我们自己只需要处理少数几个按键消息。这一节我们将详细讲述Windows系统的所有按键消息及其处理方式。 本节必须掌握的知识点&…

高清无字幕搞笑视频素材去哪里找哪里下载的?

在制作搞笑视频时&#xff0c;优质的无字幕视频素材对于提升作品的趣味性和吸引力至关重要。今天&#xff0c;我将为大家介绍一系列高清视频素材网站&#xff0c;这些网站不仅资源丰富、质量上乘&#xff0c;还能助你一臂之力&#xff0c;迅速提升视频的创意和品质。首先要推荐…

DP:完全背包+多重背包问题

完全背包和01背包的区别就是&#xff1a;可以多次选 一、完全背包&#xff08;模版&#xff09; 【模板】完全背包_牛客题霸_牛客网 #include <iostream> #include<string.h> using namespace std; const int N1001; int n,V,w[N],v[N],dp[N][N]; //dp[i][j]表示…

IDEA 学习之 打开一个 MAVEN 工程

目录 1. 单体工程2. 多 module 工程3. 多个多 module 工程3.1. 重复 1 步骤3.2. 添加其他多 module 工程 1. 单体工程 2. 多 module 工程 3. 多个多 module 工程 3.1. 重复 1 步骤 3.2. 添加其他多 module 工程

适合孩子学习用什么的落地灯?五款精品护眼大路灯分享

适合孩子学习用什么的落地灯&#xff1f;说到护眼落地灯&#xff0c;都会出现两种呼声&#xff1a;一种是认为是“智商税”&#xff0c;而另外一种则是妥妥的照明神器&#xff01;护眼大路灯到底是哪种定义呢&#xff1f;贵的护眼灯一定好吗&#xff1f; 这么年&#xff0c;护…

学习新语言方法总结(一)

随着工作时间越长&#xff0c;单一语言越来越难找工作了&#xff0c;需要不停地学习新语言来适应&#xff0c;总结一下自己学习新语言的方法&#xff0c;这次以GO为例&#xff0c;原来主语言是PHP &#xff0c;自学GO 了解语言特性&#xff0c;知道他是干嘛的 go语言&#xff0…

【JavaEE进阶】Spring统一功能处理:拦截器的使用

目录 1.什么是拦截器? 2.拦截器的使用 2.1定义拦截器 2.2 注册配置拦截器 3.拦截器详解 3.1 拦截路径 3.2 拦截器的执行流程 4. 使用拦截器实现登录校验 4.1 定义拦截器 4.2 注册配置拦截器 1.什么是拦截器? 拦截器是Spring框架提供的核心功能之⼀, 主要用来拦截用…

数据分析必备:一步步教你如何用matplotlib做数据可视化(8)

1、Matplotlib 条形图 条形图或条状图是一种图表或图形&#xff0c;它显示带有矩形条的分类数据&#xff0c;其高度或长度与它们所代表的值成比例。可以垂直或水平绘制条形。 条形图显示了离散类别之间的比较。图表的一个轴显示要比较的特定类别&#xff0c;另一个轴表示测量值…

【python】PyQt5初体验,窗口等组件开发技巧,面向对象方式开发流程实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

国外开源字典集(wordlists)

Assetnote Wordlists Wordlists that are up to date and effective against the most popular technologies on the internet.https://wordlists.assetnote.io/