返回列表

14th Place Solution

686. PhysioNet - Digitization of ECG Images | physionet-ecg-image-digitization

开始: 2025-10-21 结束: 2026-01-22 医学影像分析 数据算法赛
第 14 名解决方案 - PhysioNet ECG 数字化挑战

第 14 名解决方案

作者: sshiyu (EXPERT)
发布时间: 2026-01-23
竞赛排名: 14

PhysioNet ECG 数字化挑战 - 解决方案报告

概述

本解决方案针对 PhysioNet 挑战,旨在将 ECG 图像数字化——将打印/拍摄的 ECG 记录转换回数值波形数据。该方法使用三阶段深度学习流程,逐步将原始 ECG 图像转换为高保真数字波形。

最终公共排行榜得分:21.56 SNR
最终私有排行榜得分:21.37 SNR


问题陈述

来自各种来源的 ECG 图像(打印记录、手机照片、损坏文档的扫描件)需要转换回数字波形。挑战涉及:

  1. 多样的图像来源:高质量打印件、手机照片、屏幕截图、损坏/发霉的文档
  2. 几何失真:透视 warp、旋转、不同的纵横比
  3. 视觉退化:水渍、折叠褶皱、霉菌、低分辨率、压缩伪影
  4. 布局解析:标准 4 条带 ECG 布局,12 个导联排列在特定位置

解决方案架构

三阶段流程

Pipeline Diagram

阶段 0:标准化

目的:检测导联标记并校正图像方向

  • 架构:ResNet18 编码器 + U-Net 解码器
  • 输出:
    • 导联标记分割(13 个导联 + 背景)
    • 图像方向分类(8 个方向)
  • 处理:应用单应性将图像标准化为规范尺寸 (3024×4032)

注意:对于此阶段,我使用了 原始基线 中提供的预训练阶段 0 检查点。

阶段 1:校正

目的:检测并校正网格失真

  • 架构:ResNet34 编码器 + U-Net 解码器
  • 输出:
    • 网格点检测(用于透视校正的关键点)
    • 水平线分类(44 类)
    • 垂直线分类(57 类)
  • 处理:使用检测到的网格点应用透视变换,生成完美对齐的校正图像

注意:与阶段 0 类似,我使用了 原始基线 中的预训练阶段 1 检查点。

阶段 2:波形预测

目的:从校正后的图像中提取 ECG 波形

这是主要的预测阶段,大部分创新在于此。

模型架构

Stage 2 Architecture

关键设计决策

  1. HRNet-W48 骨干网络:通过并行分支在整个网络中保持高分辨率表示,对于精确的像素级波形预测至关重要

  2. CoordConv 解码器:在每个解码器块注入归一化的 2D 坐标,实现位置感知预测,这对于 ECG 布局理解至关重要

  3. RGB 跳跃连接:从输入图像到预测头的直接连接保留了可能在编码器压缩中丢失的精细空间细节

  4. PixelShuffle 上采样:使用子像素卷积进行内存高效的可学习上采样,代替转置卷积

  5. GroupNorm:支持 batch size 为 1 的稳定训练(对于有限 GPU 内存上的高分辨率 1696×4352 图像是必要的)


训练策略

损失函数

模型使用带正类加权的二元交叉熵 (BCE) 进行像素级监督:

loss = F.binary_cross_entropy_with_logits(
    pixel_logit,
    target_mask,
    pos_weight=10.0  # 处理稀疏的 ECG 线条像素
)

发现此方法优于基于回归的损失(MSE, SNR)。

数据增强

开发了全面的 segment 感知的增强流程 以匹配多样的训练数据分布:

通用增强

增强 概率 目的
Perlin 噪声 85% 模拟扫描仪噪声、纸张纹理
纹理噪声 70% 网格状伪影、扫描线
颜色抖动 80% 亮度、对比度、饱和度、色调变化
高斯噪声 50% 扫描仪 ISO 噪声
高斯模糊 35% 低质量扫描、失焦照片
阴影叠加 35% 不均匀照明
纸张纹理 30% 物理纸张颗粒模拟
JPEG 伪影 30% 压缩伪影
水平翻转 50% 数据增强(带标签翻转)

特定 Segment 增强

训练数据包含 12 种具有不同特征的 segment 类型。增强流程根据 segment 类型应用针对性的退化:

Segment 特征 应用的增强
0003 标准彩色扫描 仅基线增强
0004 黑白扫描 灰度转换 + 纸张色调
0005 手机照片 暗角 + 阴影渐变
0006 屏幕照片 摩尔纹 + 屏幕 glare
0009 水损 水渍 + 颜色渗色
0010 严重损坏 折叠褶皱 + 重度噪声
0011, 0012 发霉扫描 霉斑 + 灰度

增强缓存

为避免昂贵的实时增强操作(尤其是 Perlin 噪声生成),内存映射缓存系统 预计算增强掩码:

  • Perlin 噪声缓存:512 个预计算噪声图
  • 纹理缓存:256 个图案
  • 阴影/暗角缓存:256 个渐变图案

训练配置

参数
Batch Size 1 (4352×1696 全分辨率)
优化器 AdamW
学习率 1e-4
权重衰减 0.05
Epochs 80
EMA 衰减 0.999
训练/验证 分割 100/0 (完整训练集)
混合精度 FP16 (AMP)
梯度检查点 为解码器启用

推理流程

测试时增强 (TTA)

水平翻转 TTA 提高鲁棒性:

  1. 在原始图像上预测
  2. 水平翻转输入图像
  3. 在翻转图像上预测
  4. 将预测翻转回原始方向
  5. 平均两个预测

爱因托芬定律校正

基于物理的后处理步骤强制实施心电图约束:

爱因托芬定律: 导联 II = 导联 I + 导联 III

校正将违规错误重新分配到所有三个肢体导联:

error = II - (I + III)
I_corrected = I + α × error
III_corrected = III + α × error
II_corrected = II - α × error  # α = 0.33

波形提取

4 条带的像素预测通过以下方式转换为波形:

  1. 在 y 维度应用 softmax 获取概率分布
  2. 计算每个 x 列的加权质心(argmax 或 soft-argmax)
  3. 使用校准参数将像素坐标转换为 mV
  4. 根据时间布局将每条带分割为组成导联
  5. 重采样到 test.csv 中指定的目标样本长度

消融实验

注意:这些分数是近似值。更改未单独隔离,以加快迭代速度并节省计算成本。

配置 公共 LB 得分
基线 (BCE 损失 + 全面增强,90/10 分割) ~15.31
+ 高分辨率 (1696×4352) ~18.22
+ HRNet-W48 骨干网络 (替换 ResNet) ~20.90
+ 100/0 训练/验证 分割 (使用所有训练数据) ~21.01
+ 水平翻转 TTA ~21.28
+ 爱因托芬定律校正 ~21.32
+ RGB Skip + PixelShuffle + 融合头 ~21.56

关键见解

  1. 分辨率很重要:从标准分辨率增加到 1696×4352 提供了最大的单一改进 (~3 SNR)

  2. HRNet 优势:多分辨率并行分支比传统编码器 - 解码器架构更好地保留空间精度

  3. 完整训练数据:通过全面增强,使用 100% 数据进行训练优于保留验证集

  4. 物理约束有帮助:爱因托芬校正通过强制已知的 ECG 关系提供一致的小幅改进


技术实现细节

内存优化

在 batch size 为 1 的情况下训练高分辨率图像 (1696×4352) 需要仔细的内存管理:

  • 梯度检查点:为解码器块启用,以计算换取内存
  • GroupNorm:代替 BatchNorm 用于稳定的单样本训练
  • PixelShuffle:代替 ConvTranspose2d 用于 2× 上采样(更节省内存)
  • 混合精度 (FP16):通过 PyTorch AMP 启用

分布式训练

  • 支持多 GPU 训练的 DDP (分布式数据并行)
  • 每个 worker 的增强缓存以避免争用
  • 跨 worker 共享的内存映射缓存文件

仓库结构

├── stage0_model.py          # 阶段 0:标记检测与标准化
├── stage1_model.py          # 阶段 1:网格检测与校正
├── stage2_model.py          # 阶段 2:波形预测 (主模型)
├── predictor_dataset.py     # 训练数据加载与预处理
├── predictor_trainer.py     # 带 EMA、指标的训练循环
├── augmentations.py         # 全面增强流程
├── augmentation_cache.py    # 内存映射增强缓存
├── demo-submission.py       # 端到端推理与提交生成
├── config_predictor.yaml    # 训练配置
└── archive/
    ├── stage0-last.checkpoint.pth  # 阶段 0 预训练权重
    └── stage1-last.checkpoint.pth  # 阶段 1 预训练权重

代码

结论

该解决方案通过以下方式在 ECG 数字化方面实现了强劲性能:

  1. 鲁棒的预处理:阶段 0+1 流程处理多样的图像来源和几何失真
  2. 高分辨率预测:全分辨率 HRNet 实现精确的像素级波形检测
  3. 全面增强:Segment 感知的退化模拟提高泛化能力
  4. 物理信息后处理:爱因托芬校正强制已知的 ECG 约束
  5. 高效架构:RGB 跳跃连接 + PixelShuffle 融合在保持训练效率的同时保留精细细节

希望你喜欢我的报告。感谢阅读!


致谢

该解决方案建立在 Kaggle 社区分享的出色工作之上:

参考文献

  • Shivashankara KK, Deepanshi, Shervedani AM, Reyna MA, Clifford GD, Sameni R. ECG-Image-Kit: a synthetic image generation toolbox to facilitate deep learning-based electrocardiogram digitization. Physiological Measurement 2024; 45:055019. DOI: 10.1088/1361-6579/ad4954
  • Reyna MA, Deepanshi, Weigle J, Koscova Z, Campbell K, Shivashankara KK, Saghafi S, Nikookar S, Motie-Shirazi M, Kiarashi Y, Seyedi S, Hassannia M, Bjørnstad AM, Stenhede E, Ranjbar A, Clifford GD, and Sameni R. ECG-Image-Database: A dataset of ECG images with real-world imaging and scanning artifacts; a foundation for computerized ECG image digitization and analysis, 2024. DOI: 10.48550/arXiv.2409.16612.
  • Reyna MA, Deepanshi, Weigle J, Koscova Z, Campbell K, Seyedi S, Elola A, Bahrami Rad A, Shah AJ, Bhatia NK, Clifford GD, Sameni R. Digitization and Classification of ECG Images: The George B. Moody PhysioNet Challenge 2024; Computing in Cardiology 2024; 51: 1-4.
  • Matthew A. Reyna, Deepanshi, James Weigle, Zuzana Koscova, Kiersten Campbell, Salman Seyedi, Andoni Elola, Ali Bahrami Rad, Amit J Shah, Neal K. Bhatia, Yao Yan, Sohier Dane, Addison Howard, Gari D. Clifford, and Reza Sameni. PhysioNet - Digitization of ECG Images. https://kaggle.com/competitions/physionet-ecg-image-digitization, 2025. Kaggle.

同比赛其他方案