返回列表

26th Place Solution

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

开始: 2025-10-21 结束: 2026-01-22 医学影像分析 数据算法赛
第 26 名解决方案
作者: One piece (cudacoding) 及团队成员
排名: 第 26 名
发布时间: 2026-01-23

第 26 名解决方案

用于分割和信号提取的两阶段训练。

感谢 PhysioNet 和 Kaggle 举办如此精彩的比赛。非常感谢 hengck23wasupandceacar 以及其他人的无私开源贡献。我们直到最后一周才开始认真投入,因此我们专注于优化得分最高的开源解决方案。我们很激动能取得这个排名,并期待看到获胜者的解决方案!


概述

我们的解决方案主要基于 hengck23 的开源代码。我们将优化重点放在第一阶段和第二阶段(由于时间不足,我们保留了阶段 0 的原样)。最大的改进来自于第二阶段的两阶段训练,它结合了分割和信号提取。这使得原始信号数据能够直接参与训练过程——这个想法之前在 hengck23 的讨论帖中已经提出过(虽然起初我从图表中不太理解……)。


第一阶段

数据准备:

我们基于多个外部数据集(例如 PTB, PTB-XL, Georgia, CPSC-2018 等),使用修改版的 ecg-image-kit 随机生成了约 10k 张原始 ECG 图像。结合官方数据集,我们将这些图像通过我们的阶段 0 和阶段 1 推理管道进行处理。 resulting 输出作为预标注,然后使用我们自定义的标注软件进行手动 refinement。 Stage 1 Data Preparation

模型:

标准 UNet。骨干网络:EfficientNet-V2-S, ResNet34。(AdamW (lr: 1e-4, wd: 2e-5).)

数据增强:

各种 Albumentations 技术,包括 Noise, Blur, ToGray, 和 CLAHE。

简单权重平均 (SWA):

在训练期间,我们根据验证损失和分数保留排名前三的模型,然后进行离线权重平均。

推理后处理:

  1. 优化 output_to_predict:在为每个点分配 44/57 范围内的值时,逻辑增强为不仅考虑当前行位置,还考虑周围 3x3 窗口的投票值。
  2. 网格补全:基于方向向量对分割中缺失的网格点进行插值和填充。

第二阶段

数据准备:

使用修改版的 ecg-image-kit 生成了 20k 张 ECG 图像(带有导联掩码),并结合官方数据集。所有训练数据都经过我们优化的阶段 0 + 阶段 1 推理管道预处理,以获得校正后的无失真图像。 Stage 2 Data Preparation

交叉验证:

在官方数据集上使用患者 ID 作为分组进行 5 折交叉验证。合成数据仅包含在每折的训练集中,排除在验证集之外。

两阶段训练:

  • 步骤 1:使用合成数据和掩码微调 wasupandceacar 最好的开源分割模型。
  • 步骤 2:使用步骤 1 的权重作为预训练骨干网络。我们在分割头之后实现了一个可微分 Soft-Argmax 层,从概率图(logits)中提取信号。使用固定的裁剪参数和零基线坐标,将预测的像素级信号转换为物理信号,以针对 ground truth (GT) 信号计算 L1 + L2 损失。

模型:

wasupandceacar 的 ResNet34-UNet。图像大小:1696 x 4352

分割阶段增强:

各种 Albumentations 技术,包括 Noise, Blur, ToGray, 和 CLAHE。

信号阶段增强:

结合分割阶段的增强与自定义设计的效果:模拟黑色/黄色污渍、镜头失真、纸张折痕、部分阴影和扫描仪噪声。

训练配置:

4x RTX 4090 (DDP), EMA (0.992), AdamW, Warmup + Cosine Scheduler, 2e-5 学习率。每个 epoch 的数据采样:80% 官方数据和 20% 合成数据。

推理配置:

  1. 集成策略:集成了三个最佳模型(在增强、学习率和折数上有所不同)。我们在概率级别(分割 logits)进行简单平均,然后再通过训练期间使用的相同可微分后处理。
  2. 遗留逻辑:保留了 ECG 类型分类及其相应预处理的开源逻辑。尽管分类准确性不完美,但它提供了 0.2 的 LB 提升。
同比赛其他方案