2021AIWIN-心电图智能诊断竞赛任务一Baseline

2023-10-11 04:10

本文主要是介绍2021AIWIN-心电图智能诊断竞赛任务一Baseline,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、赛题考官

本赛题由复旦大学附属中山医院和上海数创医疗科技有限公司联合命题。

竞赛地址:
http://ailab.aiwin.org.cn/competitions/64#learn_the_details-overview

数据集下载地址:
http://ailab.aiwin.org.cn/competitions/64#participate-get_starting_kit

本文章代码下载地址:
https://gitee.com/txyugood/aiwin.git

二、赛题背景

心电图是临床最基础的一个检查项目,因为安全、便捷成为心脏病诊断的利器。每天都有大量的心电图诊断需求,但是全国范围内诊断心电图的专业医生数量不足,导致很多医院都面临专业心电图医生短缺的情况。

人工智能技术的出现,为改善医生人力资源不足的问题带来了全新的可能。由于心电图数据与诊断的标准化程度较高,相对较易于运用人工智能技术进行智能诊断算法的开发。

由于心电图可诊断的疾病类别特别丰富,目前,市面上出现较多的是针对某些特定类别的算法,尚没有看到能够按照临床诊断标准、在一定准确率标准下,提供类似医生的多标签多分类算法。本次赛事希望吸引更多优秀的算法人才,共同为心电图人工智能诊断算法的开发贡献力量。

三、赛题任务

针对临床标准12导联心电图数据的多标签多分类算法开展研发和竞技比拼。

选手需利用命题方提供的训练集数据,设计并实现模型和算法,能够对标准12导静息心电图进行智能诊断。需要识别的心电图包括12个类别:正常心电图、窦性心动过缓、窦性心动过速、窦性心律不齐、心房颤动、室性早搏、房性早搏、一度房室阻滞、完全性右束支阻滞、T波改变、ST改变、其它。

本赛题共分为两个关联任务:任务一为要求针对心电图输出二元(正常 v.s 异常)分类标签;任务二为针对给定的心电图输出上述12 项诊断分类的诊断结果标签。

四、数据介绍

心电数据的单位为mV,采样率为 500HZ,记录时长为 10 秒,存储格式为 MAT;文件中存储了 12 导联的电压信号(包含了I,II,III,aVR,aVL,aVF,V1,V2,V3,V4,V5 和 V6)

任务一的数据说明

数据将会分为参赛者可见标签的训练集,及不可见标签的测试集两大部分。数据均可下载。(请参见「参赛提交」——「下载」下的 2021A_T2_Task1_数据集,其包含了训练集和测试集)

其中训练数据提供 1600 条 MAT 格式心电数据及其对应诊断分类标签(“正常”或“异常”,csv 格式);测试数据提供 400 条 MAT格式心电数据。

五、数据预处理

本项目将mat数据转换为图片,尝试使用卷积神经网络来解决此问题。通过绘制波形可以看到,正常心电图与异常心电图在图像还是有明显差别的。这样使用卷积神经网络就有可能提取到不同的特征,从而实现分类。
正常

正常心电图

异常

异常心电图

使用下面代码将原始数据转换为图片。
注意修改代码中的路径。

tar xvf 2021A_T2_Task1_数据集含训练集和测试集.tar.gz
cd aiwin/
mkdir dataset/train
mkdir dataset/val
python process.py

运行结束后可以在dataset目录下看到train和val两个文件中包含图片数据。

ls dataset/
train  trainreference.csv  val

六、训练

运行环境:

python 3.7

paddlepaddle 2.1.2

训练模型主要有以下几个要点:

1.模型采用ResNet50网络,并加载预训练数据。

2.由于图表数据可能包含细小的特征,所以图像尺寸放大到640x640。

3.添加了一些数据增强方法,增强模型学习特征的能力。

4.学习率采用Warmup+Decay的方法,学习率设置为0.001.

训练模型执行以下命令。

python train.py
W1115 09:27:59.167901  1998 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W1115 09:27:59.173139  1998 device_context.cc:465] device: 0, cuDNN Version: 7.6.
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1436: UserWarning: Skip loading for fc.weight. fc.weight receives a shape [2048, 1000], but the expected shape is [2048, 2].warnings.warn(("Skip loading for {}. ".format(key) + str(err)))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1436: UserWarning: Skip loading for fc.bias. fc.bias receives a shape [1000], but the expected shape is [2].warnings.warn(("Skip loading for {}. ".format(key) + str(err)))
2021-11-15 09:28:20 [INFO]	[TRAIN] epoch: 1, iter: 10/10000, loss: 0.7406, lr: 0.0000450000, batch_cost: 9.2992, reader_cost: 0.00000, ips: 3.4412 samples/sec | ETA 25:48:18
2021-11-15 09:28:36 [INFO]	[TRAIN] epoch: 1, iter: 20/10000, loss: 0.6941, lr: 0.0000950000, batch_cost: 24.9116, reader_cost: 0.00000, ips: 1.2845 samples/sec | ETA 69:03:37
2021-11-15 09:28:51 [INFO]	[TRAIN] epoch: 1, iter: 30/10000, loss: 0.6949, lr: 0.0001450000, batch_cost: 40.5031, reader_cost: 0.00000, ips: 0.7901 samples/sec | ETA 112:10:16
2021-11-15 09:29:07 [INFO]	[TRAIN] epoch: 1, iter: 40/10000, loss: 0.6943, lr: 0.0001950000, batch_cost: 56.1472, reader_cost: 0.00000, ips: 0.5699 samples/sec | ETA 155:20:25
2021-11-15 09:29:15 [INFO]	[EVAL] epoch: 1 accuracy: 0.25
2021-11-15 09:29:15 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:15 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:15 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:15 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:15 [INFO]	[EVAL] epoch: 1 accuracy: 1.0
2021-11-15 09:29:15 [INFO]	[EVAL] epoch: 1 accuracy: 0.0
2021-11-15 09:29:15 [INFO]	[EVAL] epoch: 1 accuracy: 0.25
2021-11-15 09:29:15 [INFO]	[EVAL] epoch: 1 accuracy: 0.25
2021-11-15 09:29:16 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:16 [INFO]	[EVAL] epoch: 1 accuracy: 0.25
2021-11-15 09:29:16 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:16 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:16 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:16 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:16 [INFO]	[EVAL] epoch: 1 accuracy: 0.25
2021-11-15 09:29:16 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:16 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:17 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:17 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:17 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:17 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:17 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:17 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:17 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:17 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:17 [INFO]	[EVAL] epoch: 1 accuracy: 0.0
2021-11-15 09:29:17 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:18 [INFO]	[EVAL] epoch: 1 accuracy: 0.25
2021-11-15 09:29:18 [INFO]	[EVAL] epoch: 1 accuracy: 0.25
2021-11-15 09:29:18 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:18 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:18 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:18 [INFO]	[EVAL] epoch: 1 accuracy: 0.25
2021-11-15 09:29:18 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:18 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:18 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:18 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:19 [INFO]	[EVAL] epoch: 1 accuracy: 0.75
2021-11-15 09:29:19 [INFO]	[EVAL] epoch: 1 accuracy: 0.5
2021-11-15 09:29:19 [INFO]	[EVAL] epoch: 1 avg accuracy: 0.512499988079071
2021-11-15 09:29:27 [INFO]	[TRAIN] epoch: 2, iter: 50/10000, loss: 0.6943, lr: 0.0002450000, batch_cost: 38.6916, reader_cost: 0.00000, ips: 0.8271 samples/sec | ETA 106:56:21

七、预测与提交

训练结束后,在output目录下会保存一个best_model模型权重,预测程序会加载此权重对测试图片进行推理预测,同时生成answer.csv提交文件。

python predict.py
W1115 09:32:55.909576  2394 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W1115 09:32:55.914799  2394 device_context.cc:465] device: 0, cuDNN Version: 7.6.
Save to answer.csv

最后下载answer.csv文件压缩后并提交,分数为76.54,可以说明卷积神经网络可以学习到心电图数据中的特征。

八、总结

本项目使用了一种非常规的方法来实现心电图数据的分类,与常规的机器学习方法不同。初步实验取得了76.54的分数,分数不高,但还是有可以继续优化提升的空间,比如可以选择其他模型进行训练,数据做进一步的处理与增强。同时也可以将本项目的模型最为一种辅助模型与机器学习的结果进行融合,来提高分数。本项目可能提供了一个新的思路来解决心电图分类的问题。

这篇关于2021AIWIN-心电图智能诊断竞赛任务一Baseline的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

JVM 常见异常及内存诊断

栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存。 栈帧过多导致栈内存溢出 下述示例代码,由于递归深度没有限制且没有设置出口,每次方法的调用都会产生一个栈帧导致了创建的栈帧过多,而导致内存溢出(StackOverflowError)。 示例代码: 运行结果: 栈帧过大导致栈内存

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

FreeRTOS学习笔记(二)任务基础篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2.4 任务的运行与切换2.4.1 利用延时函数2.4.2 利用中断 2.5 任务的通信与同步2.6 任务的删除2.7 任务的通知2

Flink任务重启策略

概述 Flink支持不同的重启策略,以在故障发生时控制作业如何重启集群在启动时会伴随一个默认的重启策略,在没有定义具体重启策略时会使用该默认策略。如果在工作提交时指定了一个重启策略,该策略会覆盖集群的默认策略默认的重启策略可以通过 Flink 的配置文件 flink-conf.yaml 指定。配置参数 restart-strategy 定义了哪个策略被使用。常用的重启策略: 固定间隔 (Fixe