# LoongArch-AF_Detection **Repository Path**: sdu-aes-lab/AF_Detection ## Basic Information - **Project Name**: LoongArch-AF_Detection - **Description**: 基于龙芯2K0300先锋派的智能房颤检测 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-30 - **Last Updated**: 2025-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 2K0300先锋板应用 该项目将通用神经网络框架移植到2K0300先锋派平台,结合资源感知的神经网络结构设计和模型压缩,实现了板上神经网络高效推理计算。结合实际医疗应用,针对心电监控中房颤难及时检测的问题,基于国产龙芯平台,开发了基于端侧人工智能的房颤检测系统,并提供了模型精度、模型泛化性、推理时延和存储占用等多个指标评判。 ## 1. 应用背景 ### 1.1 心电图(ECG) ECG信号记录了每个心跳的心肌去极化和复极化的小电压变化随时间的变化。如图1所示,它展示了由两个连续的心脏周期(心跳)组成的心电图信号,呈正常窦性节律。正常的心电图反映了P波、QRS波群(包括Q波、R峰和S波)和T波的形态特征,这些波是由单个心跳的不同心脏电活动产生的。心跳间隔信息,如R-R间隔和T-P间隔,也可以由心电图导出。心脏内科专家通常依据心电图的信息对心律失常做出诊断。 ### 1.2 房颤(AF) 房颤(AF)是一种与血栓、中风、心力衰竭和其他心血管疾病有关的心律不齐。房颤通常是基于心电图上反映的快速和不规则的节律特征进行诊断的。如图2所示,有四个心电图信号代表了两位患者的正常窦性节律和房颤。每个心电图片段长度为10秒(以250赫兹采样)。与图2(a)和图2(b)中正常窦性节律的心电图片段相比,图2(c)和图2(d)中显示的房颤的心电图片段具有一些独特的视觉特征。心脏病学家通过心电图诊断房颤节律,关键特征由房颤的发病机制引起。 ### 1.3 任务 由于房颤可能偶尔发作,且患者往往无明显症状,因此发现并诊断房颤颇具挑战。通常,医生会推荐疑似房颤患者使用心脏监测设备(如Holter监护仪)进行24小时或48小时的心电图(ECG)记录。心脏专家通过分析这些心电图数据来确认是否患有房颤。然而,这一诊断过程耗时费力,如果患者在佩戴Holter期间没有出现房颤,还可能出现漏诊。基于人工智能算法的房颤检测算法可以进一步提高检测性能,并减少医生在标准设计和参数调整方面的工作量。 因此,本项目基于国产龙芯2K0300先锋派平台,开发了基于端侧人工智能的房颤检测系统。考虑到实用价值,项目中提供了模型精度、模型泛化性、推理时延和存储占用等多个指标评判。 ## 2. 数据 ### 2.1 数据介绍 本文提供的数据为单导联心电图(ECG)片段。每个心电图片段长度为5秒,采样率为250赫兹。记录经过预处理,利用带通滤波器去除噪声。每个心电图片段有一个标签,描述了心脏异常(或正常窦性)节律。在这里,对于房颤的分类,标签为房颤(Atrial Fibrillation,AF)。对于非心律失常(non-AF),段标记为除房颤外的其他标签。心电图片段根据患者进行分割,分为训练集和测试集。80%的受试者心电图片段被释放为训练数据集,其余20%的受试者心电图片段将用于评估提交算法的检测性能。 ### 2.2 数据格式 #### 2.2.1 数据存储 所有数据都以文本格式进行格式化。每个文本文件包含一个5秒钟的心电图片段,每行采样点总长度为1,250个。每个采样点的值以浮点数形式存储。 #### 2.2.2 文件命名 每个文本文件的名称包含患者ID、标签和索引,用破折号(即“-”)分隔。例如,对于文件“S0-AFIB-0.txt”,“S0”表示受试者编号,“AFIB”表示心律失常或节律的类型(参考提供的标签列表),“0”表示片段的索引。 **数据下载地址**:https://pan.baidu.com/s/1aqpSo4HBBZPsfOm4OKM5Ig?pwd=99qj **提取码**:99qj ## 3. 神经网络架构 ### 3.1 TensorFlow Lite 框架 TensorFlow 是由 Google 开发的一个端到端开源机器学习平台。其核心是通过构建计算图来定义模型的操作流程,可以在 CPU 或 GPU 上执行。此外,TensorFlow 提供了丰富的工具和库,如 TensorFlow Serving、TensorBoard 等,帮助开发者更好地管理和可视化模型训练过程。其中,TensorFlow Lite 是 TensorFlow 的一个子项目,专注于移动和嵌入式设备上的机器学习模型。框架可以利用硬件加速(如 ARM NEON 和 GPU),框架还提供了量化等模型优化工具,提高推理速度;并且易于部署,提供了简单的 API 和工具,方便开发者将模型部署到移动设备上。该项目将TensorFlow Lite移植到2K0300平台,结合资源感知的神经网络结构设计和模型压缩,实现了龙芯平台上神经网络的高效推理计算。 ### 3.2 模型 本文采用的 AFNet 是一个用于特定任务的卷积神经网络模型。该模型的设计采用了多个卷积层和全连接层的组合,旨在提取输入数据中的特征,并进行分类或回归预测。 **AFNet 网络架构图**(此处应插入图表) ### 3.3 模型训练 我们提供了示例的模型训练代码,你可以修改代码中的CNN模型为自己的实现方式,并重新训练、验证。训练结束后得到tflite格式的模型文件,按照以下部分的描述部署在龙芯2K0300先锋板上执行推理过程。 **GitHub 项目地址**:https://gitee.com/sdu-aes-lab/demo_example_pytorch, https://gitee.com/sdu-aes-lab/demo_example_tensorflow 根据 README 中的说明,安装相关的 requirements。 - `./models` 文件夹存放不同架构的模型; - `./data_indices` 中存放已经分割好的测试集和训练集的数据索引,也可以根据自己的策略重新分割; - `./saved_models` 存放训练好的模型。 **训练和验证命令**: ```bash python training_save_deep_models_tf.py python testing_performances_tf.py ``` **数据集**: 训练和测试的数据为 Part 2 的数据,自行下载解压,按照代码配置路径即可。 ## 4. 初体验 ### 4.1 接通电源,启动调试 电源和调试串口都集成为一个 Type-C 的接口中,接入电源之后即可通过串口工具在上位机上调试,可借助 MobaXterm (Windows)、Cutecom (Linux) 等 serial 调试工具。USB 接入上位机之后可以在相应的 serial 工具中检测到该串口 (/dev/ttyxx 或 COMx)。 ### 4.2 网络连接 2K0300先锋板上拥有 WIFI 模块可以通过 network-manager 工具快捷连接,也可以选择有线方式联网。在连接以后可以选择固定 IP,然后就可以使用 SSH 等方式访问开发板。 **network-manager 连接命令**: ```bash nmcli dev wifi connect "wifi_name" password "pwd" ``` ## 5. 环境配置 在2K0300先锋板实现神经网络的推理,本项目主要借助的是 tflite-micro 工具链,实现轻量化可部署的模型。以下过程需要 Linux 虚拟机,推荐使用 Ubuntu 24.04.1 LTS。 ### 5.1 项目实操 **项目地址**:https://gitee.com/sdu-aes-lab/AF_Detection 下载项目后,在项目目录 `./tensorflow/lite/micro/examples/af_detection/main_functions.cc` 中根据自己的需要进行更改,其中2K0300先锋板上的串口只有 ttyS0 (电源+调试串口)和 ttyS2,所以主程序的 `/dev/ttyS7` 需要修改为其中 ttyS2。 然后将训练得到的 tflite 模型文件命名为 `af_detection.tflite`,并放入 `./tensorflow/lite/micro/models/` 文件夹下。 将心电图数据解压到项目的 `data` 目录下,命名与 `./evaluation_af_detection.py` 中的配置相对应即可。 ### 5.2 龙芯工具链准备 在龙芯社区上下载最新的龙芯工具链,并通过以下步骤在机器上配置龙芯的环境。 #### 5.2.1 下载 Python3 环境和 Pillow 库 在 Linux 环境中运行如下命令: ```bash sudo apt install python3 git unzip wget build-essential pip install pillow ``` #### 5.2.2 环境配置 其中可以替换为自己的路径。 ```bash export PATH=$PATH:/Your Path/loongson-gnu-toolchain[version]/bin/ export ARCH=loongarch64 export CROSS_COMPILE=loongarch64-linux-gnu ``` 通过以下命令确认是否配置成功: ```bash loongarch64-linux-gnu-gcc -v ``` ### 5.3 交叉编译 通过给定的 Makefile 进行编译,将模型编译为2K0300可以执行的二进制文件,成功之后可以在 `./gen/linux_x86_64_default_gcc/bin/` 中找到对应的文件,并上传到板子上。 ```bash cd iesdcontest2024_demo_example_deployment MKFLAGS="-f tensorflow/lite/micro/tools/make/Makefile" MKFLAGS="$MKFLAGS CC=loongarch64-linux-gnu-gcc" MKFLAGS="$MKFLAGS CXX=loongarch64-linux-gnu-g++" make $MKFLAGS af_detection -j8 ``` **注意**:在编译之前可能需要在 GoogleSource 上下载嵌入式库 pigweed。如果网络未配置好,同样可下载网盘中的压缩包并解压到项目目录 `./tensorflow/lite/micro/tools/make/download`。 ## 6. 运行过程 由于在推理过程中需要与上位机通信,所以需要绑定不同的串口通信。 ### 6.1 绑定串口 根据2K0300先锋板的硬件规格图进行串口绑定,如下图: (此处应插入硬件规格图) 选用编号为 8,10 的 UART 作为数据通信的串口。 连接好之后可以通过开发板上的测试工具进行测试: ```bash cd ./loongson_test_case/uart_test ./uart_test -a /dev/ttyS2 -s 115200 ``` 如上所示即表示串口通信成功。 ### 6.2 运行测试代码 在上位机执行 `./evaluation_af_detection.py` 的 Python 程序,然后在板子上执行对应的可执行文件,之后即可在上位机上观察到运行过程以及测试结果。 其中需要在 Python 文件中指定上位机的串口号。 ## 引用 [1] Jia, Zhenge, Yiyu Shi, Samir Saba, and Jingtong Hu. "On-device prior knowledge incorporated learning for personalized atrial fibrillation detection." *ACM Transactions on Embedded Computing Systems (TECS)* 20, no. 5s (2021): 1-25. ## 作者 **段昱** - 本科四年级 山东大学 计算机技术专业 邮箱: **刘俊喆** - 本科四年级 山东大学 计算机技术专业 邮箱: **贾振格** - 教授 山东大学 计算机技术专业 邮箱: