欢迎光临
我们一直在努力

第32章:Swin‑Transformer全家桶实现MIT‑BIH心电图像五分类

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}

摘要:心电图ECG是筛查心律失常最便捷无创手段,房性早搏、室性早搏、束支传导阻滞等异常波形形态细微,人工判读对医生经验要求高。传统CNN感受野受限,普通ViT全局注意力计算开销巨大。本文基于Pytorch搭建Swin‑Transformer全家桶心电图像分类工程,数据集2700余张MIT‑BIH转换得到的ECG图像,完成A房性早搏、L左束支传导阻滞、N正常心搏、R右束支传导阻滞、V室性早搏五类识别。项目支持Swin‑T/Swin‑S/Swin‑B一键切换,实现迁移学习、冻结微调、参数量FLOPs统计、全套多分类指标、混淆矩阵、多维度训练曲线、批量图片推理;附带可直接渲染Mermaid网络结构图。本文从临床背景、数据集、Swin‑Transformer原理拆解、网络结构、代码模块解析、训练策略、指标解读、运行流程、缺陷与后续优化方向完整展开。 在这里插入图片描述

1 研究背景与临床意义

心血管疾病是全球高发病,心律失常是很多心脏疾病早期重要表现。MIT‑BIH心律失常数据库是国际公认权威心电数据库,记录多种真实临床心跳波形,包含正常心搏、房性早搏、室性早搏、左右束支传导阻滞等典型样本。

  • A(Atrial premature beat,房性早搏):心房提前激动,属于室上性异常搏动;
  • L(Left bundle branch block,左束支传导阻滞):心室内左束支传导发生阻滞;
  • N(Normal beat,正常心搏):正常窦性心跳波形;
  • R(Right bundle branch block,右束支传导阻滞):右束支传导阻滞;
  • V(Premature ventricular contraction,室性早搏):心室提前搏动,属于高危心律失常,需要重点检出。

基层医疗机构心电医生资源紧张,动态Holter会产生海量心电片段,人工逐帧判读工作量巨大。AI辅助诊断可以完成初筛,优先标记高风险异常心电片段,减轻医生阅片负担。

卷积CNN擅长提取局部波形,但建模长距离心电节律依赖能力弱;原始ViT做全局自注意力,计算复杂度是图像尺寸平方,开销巨大。Swin‑Transformer使用分层移位窗口注意力W‑MSA与SW‑MSA,注意力计算限制在局部窗口,通过窗口偏移实现跨窗口信息交互,构建分层多尺度特征,兼顾局部QRS波细节与心跳节律全局依赖,同时降低计算量,非常适合ECG图像任务。

本数据集2700多张心电图像,是由一维心电信号转换得到二维可视化图片,属于中等规模医学数据集,利用ImageNet预训练权重迁移学习,配合冻结微调策略,缓解医学数据集样本量不足问题。整套工程包含训练脚本、工具库、批量推理脚本,可以横向对比Tiny/Small/Base三个版本的精度、参数量、推理速度差异。

2 数据集说明

数据集标签json定义:

{
"0": "A",
"1": "L",
"2": "N",
"3": "R",
"4": "V"
}

数据集采用ImageFolder标准目录组织格式:

data
├─train
│ ├─A
│ ├─L
│ ├─N
│ ├─R
│ └─V
└─val
├─A
├─L
└─……其余类别

数据预处理流水线

  • 训练集:Resize(256) → RandomRotation(90)随机旋转 → CenterCrop(224) → ToTensor() → ImageNet标准化mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]
  • 验证集:Resize(256) → CenterCrop(224) → ToTensor() → 同样标准化。

注意:本项目输入为一维心电信号转换后的RGB图像,心电波形有固定时序方向,实际工程中可关闭随机旋转,防止波形时序错乱;本实验保留旋转作为基线增强。心电图像灰度分布和自然图像存在域偏移,有条件可以使用心电领域预训练Swin权重进一步提升效果。

3 Swin‑Transformer网络架构与Mermaid结构图

Swin‑Transformer核心组件:Patch Partition分块、Swin‑Block(W‑MSA+SW‑MSA)、Patch Merging块合并下采样。

  • Patch Partition:把输入图像切分为4×4大小patch,做线性嵌入;
  • Swin‑Block:连续两个Block,第一个Block使用普通窗口多头自注意力W‑MSA;第二个Block使用移位窗口多头自注意力SW‑MSA,实现窗口之间信息交互;两个Block均包含LayerNorm、多头注意力、残差连接、MLP;
  • Patch Merging:合并相邻patch,实现分层下采样,通道数翻倍,分辨率减半,构建多尺度分层特征;
  • 重复多组Stage,最后全局池化,head全连接输出分类结果。
  • 3.1 Swin‑Transformer整体文字结构

    输入ECG图像 3×224×224
    ↓
    Patch Partition:4×4分块 + Linear Embedding
    ↓
    Stage1:Swin‑Block ×2 (W‑MSA + SW‑MSA)
    ↓
    Patch Merging(下采样,分辨率减半,通道翻倍)
    ↓
    Stage2:Swin‑Block ×2 (W‑MSA + SW‑MSA)
    ↓
    Patch Merging(下采样)
    ↓
    Stage3:Swin‑Block ×6 / ×8 / ×12(T/S/B版本层数不同)
    ↓
    Patch Merging(下采样)
    ↓
    Stage4:Swin‑Block ×2
    ↓
    Global Average Pooling全局平均池化
    ↓
    Head全连接层 → 输出5维:A / L / N / R / V

    3.2 Swin‑Block内部子结构(一组连续两个Block)

    输入Token序列
    ===== Block1 W‑MSA =====
    LayerNorm
    W‑MSA普通窗口多头自注意力
    残差相加
    LayerNorm
    MLP前馈网络
    残差相加

    ===== Block2 SW‑MSA =====
    LayerNorm
    SW‑MSA移位窗口多头自注意力(跨窗口交互)
    残差相加
    LayerNorm
    MLP前馈网络
    残差相加
    输出送入Patch Merging

    3.3 Mermaid绘图代码,复制Markdown直接渲染

    flowchart TD
    A["输入MIT‑BIH心电ECG图像 3×224×224"] –> B["Patch Partition<br/>4×4分块 + 线性嵌入"]
    B –> C["Stage1 Swin‑Block×2<br/>W‑MSA + SW‑MSA"]
    C –> D["Patch Merging<br/>分层下采样,通道翻倍"]
    D –> E["Stage2 Swin‑Block×2<br/>W‑MSA + SW‑MSA"]
    E –> F["Patch Merging<br/>分层下采样,通道翻倍"]
    F –> G["Stage3 Swin‑Block(层数随T/S/B变化)"]
    G –> H["Patch Merging<br/>分层下采样,通道翻倍"]
    H –> I["Stage4 Swin‑Block×2"]
    I –> J["GlobalAvgPool 全局平均池化"]
    J –> K["Head全连接分类头<br/>输出5类:A房早,L左束支,N正常,R右束支,V室早"]
    subgraph Swin‑Block单元
    C1["LayerNorm"]
    C2["W‑MSA普通窗口多头注意力"]
    C3["残差Add"]
    C4["LayerNorm"]
    C5["MLP"]
    C6["残差Add"]
    C7["LayerNorm"]
    C8["SW‑MSA移位窗口多头注意力"]
    C9["残差Add"]
    C10["LayerNorm"]
    C11["MLP"]
    C12["残差Add"]
    C1 –> C2 –> C3 –> C4 –> C5 –> C6 –> C7 –> C8 –> C9 –> C10 –> C11 –> C12
    end

    3.4 Swin‑T / Swin‑S / Swin‑B版本对比
    模型代号特点参数量适用场景
    Swin‑Tiny t 通道数最小,Stage3块数量少 最小 快速实验、算力有限、边缘端原型
    Swin‑Small s 中间规格,平衡精度速度 中等 心电任务推荐基线版本
    Swin‑Base b 通道、block数量更大,特征能力强 偏大 服务器离线实验,追求识别精度

    本项目命令行参数–model t/s/b切换模型;加载官方ImageNet预训练权重,替换最后的head层输出维度为5,适配五类心电分类;开启–freeze_layers True冻结主干网络,仅训练head分类头,降低2700张心电数据集的过拟合风险。

    4 项目核心代码模块解读

    整套工程包含三份核心脚本:train.py训练脚本、utils.py工具库、predict.py批量推理脚本。

    4.1 utils.py核心模块
  • create_model():模型工厂函数,选择t/s/b对应Swin‑T/S/B,加载预训练权重,替换网络末尾head全连接层输出通道等于类别数量。
  • get_device()自动获取cuda/cpu;mkdir()自动清空旧实验目录,新建weights权重文件夹;data_trans()训练集验证集两套数据增强。
  • ConfusionMatrix混淆矩阵类:计算多分类全套指标:准确率、每一类Precision精确率、Recall召回率、Specificity特异度、F1‑score,输出宏平均指标,自动绘制混淆矩阵图片。>
  • 心电临床任务重点指标:V室性早搏的召回率,室性早搏属于高危心律失常,需要尽可能检出,降低漏诊风险;混淆矩阵可以观察A/L/R之间容易发生的互相错分。

  • train_one_epoch()一轮训练,CrossEntropy交叉熵损失;evaluate()验证集评估。
  • 绘图工具函数:loss‑acc损失精度曲线;plot_lr_decay()学习率变化曲线;plot_prsf()每epoch宏平均Precision、Recall、Specificity、F1曲线。
  • get_data()读取ImageFolder格式心电数据集;gen_json()生成class_indices.json类别映射;get_optim()支持SGD、Adam、AdamW优化器,医学影像优先AdamW。
  • 4.2 train.py训练脚本完整流程
  • 解析命令行参数,调用mkdir清空旧文件,获取训练设备。
  • 加载训练集、验证集ECG图像,打印样本数量,导出class_indices.json。
  • 创建Swin Transformer模型,thop工具统计总参数量、可训练参数量、FLOPs计算量控制台打印。
  • freeze_layers开启时冻结主干全部Stage模块,只训练head分类头。
  • 筛选可更新梯度参数pg;选择优化器;设置LambdaLR余弦退火学习率调度器。
  • epoch循环:
    • 执行train_one_epoch训练一轮;scheduler更新学习率;evaluate做验证;
    • 每epoch全部指标保存到train_log_results.json;
    • 对比验证集accuracy,保存最优best.pth;训练结束保存last.pth。
  • 训练结束自动绘制loss‑acc、lr、P‑R‑S‑F1曲线图。
  • 加载best最优权重,分别计算、绘制训练集、验证集混淆矩阵。
  • 参考训练超参数

    –model s
    –pretrained True
    –freeze_layers True
    –batch‑size 16
    –epochs 50
    –optim AdamW
    –lr 0.001
    –lrf 0.0001

    提示:Swin Transformer对学习率比较敏感,医学迁移训练建议使用较小学习率,避免破坏预训练学到的底层纹理特征。

    4.3 predict.py批量推理脚本
  • 读取runs/class_indices.json类别映射、best.pth模型权重;
  • 读取文件夹./inference/infer_img下全部心电图片;
  • 图像预处理,模型推理softmax,获取top‑2预测结果;
  • OpenCV将类别名称+概率绘制在图片左上角;
  • 自动创建inference/ret目录保存带预测文本的图片。
  • 运行命令示例:

    python predict.py –model s –weights runs/weights/best.pth

    5 多分类评价指标解读(A/L/N/R/V五类心电)

    本任务为五分类,代码采用宏平均Macro‑Average,平等对待5类心电样本,不受各类样本数量不均衡干扰。

  • Accuracy准确率:全部样本预测正确占总样本的比例;
  • Precision精确率:预测为某一类心电样本中,真实属于该类的比例,反映误判;
  • Recall召回率:真实该类样本被识别出来的比例,V室性早搏召回率是临床最重要指标,直接关系高危心律失常漏诊;
  • Specificity特异度:不属于该类别的样本被正确判定为阴性;
  • F1‑score:精确率召回率调和平均,综合评价类别识别性能;
  • 5×5混淆矩阵:对角线是各类别预测正确数量;非对角线观察哪两类波形容易混淆,例如L左束支与R右束支波形形态相近,容易发生错分。
  • 过拟合判断:训练集指标很高,验证集指标明显下滑;医学小数据集常见;缓解手段:开启冻结训练、控制epoch、权重衰减、合理数据增强。

    6 完整项目运行流程

  • 环境依赖 pytorch、torchvision、opencv‑python、pillow、matplotlib、thop、tqdm
  • ECG图像按照ImageFolder目录格式放到./data/train、./data/val。
  • 启动训练示例:
  • python train.py –model s –pretrained True –freeze_layers True –batch-size 16 –epochs 50 –optim AdamW –lr 0.001 –lrf 0.0001

  • 训练产物全部输出到./runs目录:
    • weights文件夹:best.pth、last.pth权重文件
    • class_indices.json类别映射
    • train_log_results.json完整训练日志
    • loss_accuracy_curve.jpg、LR_decay.jpg、results.jpg指标曲线图
    • trainSet Confusion Matrix.jpg、valSet Confusion Matrix.jpg混淆矩阵图片
  • 批量推理:心电图片放入inference/infer_img,运行predict.py,结果输出至inference/ret。
  • 基于 Swin‑Transformer 全家桶的 MIT‑BIH 心电五分类研究

    赞(0)
    未经允许不得转载:171主机测评 » 第32章:Swin‑Transformer全家桶实现MIT‑BIH心电图像五分类
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址