返回列表

1st place solution

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

开始: 2025-10-21 结束: 2026-01-22 医学影像分析 数据算法赛
第一名解决方案 - 无需信号掩码的直接回归

第一名解决方案

无需信号掩码的直接回归

作者: Bob (fcf0823)

发布日期: 2026-01-23

竞赛排名: 1

我们要感谢 PhysioNet 和 Kaggle 组织这次 ECG 信号预测竞赛。特别感谢 @hengck23 分享图像校正 pipeline。该 pipeline 包括阶段 0(图像旋转和单应性变换)和阶段 1(校正单应性变换后的图像)。我们将这两个阶段整合到了我们的工作流程中,并开发了一种策略,直接从这些校正后的图像预测所有 ECG 导联。

概述

  • 基于校正图像的预测
    • 将各种图像风格转换为标准化格式,最大限度地减少不同视角带来的不一致性。这有助于模型忽略空间失真,专注于基本的心脏模式,从而产生更准确和可靠的 ECG 预测。
  • 从高分辨率图像重映射
    • 输入图像使用两种不同的方法生成,以最大化特征保留:
    • 1. 基于单应性:在重映射之前以高分辨率校正图像。
    • 2. 直接重映射:跳过单应性转换,直接对源图像执行重映射。
  • 傅里叶域重采样
    • 重采样不是在时域使用线性插值,而是在傅里叶域使用 scipy.signal.resample 执行。这种方法更适合 ECG 信号。

数据准备

为了验证模型,前十个训练样本被用作验证集。

Pipeline

1. 预处理

使用了两种方法来生成预测模型的输入图像。第一种方法通过单应性矩阵将旋转后的图像转换为 3200x2400 分辨率,随后进行网格点重映射。第二种方法使用单应性矩阵重新缩放网格点,并直接在旋转后的图像上执行重映射。在这两种情况下,包含 ECG 信号的下部区域被裁剪以供使用,而包含个人信息的上部部分被丢弃。

随后,图像被转换为灰度,并与基于坐标的特征连接作为模型输入,为网络提供视觉强度和空间上下文,以确保更准确的 ECG 信号预测。

预处理裁剪示意图

2. 预测策略 1

骨干网络最后一个和倒数第二个 block 的特征被用作数值预测的输入。由于 ECG 图像由四个垂直堆叠的数据组组成,这些特征按高度分为四段。这些段随后被扩展为输入图像宽度的四倍。

策略 1 示意图

3. 预测策略 2

骨干网络最后一个 block 的特征被用作数值预测的输入。鉴于 ECG 图像包含四个垂直堆叠的数据组,特征按高度分为四段。这些段随后被扩展为输入图像宽度的四倍。

策略 2 示意图

4. 预测策略 3

骨干网络最后一个 block 的特征被用作数值预测的输入。与策略 1 和策略 2 不同,不是按高度划分特征,而是首先使用最大池化合并高度维度。然后将通道分为四段,并扩展为输入图像宽度的四倍。

策略 3 示意图

5. 后处理

基于模型输出,选择中间的 10,000、15,000 或 20,000 个输出,随后进行重采样。此后,基于 ECG 特性和爱因托芬定律(Einthoven's Law)执行三种类型的导联混合,以优化信号:

  • 将长 II 导联的前四分之一与 II 导联混合
II = (II × 1.35 + long II) ÷ 2.35
  • 如果 np.abs(II-I-III).mean() < 0.01,应用 'II = I + III'
I = (I + (II - III) × 0.6) ÷ 1.6
II = (II + (I + III) × 0.3) ÷ 1.3
III = (III + (II - I) × 0.6) ÷ 1.6
  • 如果 np.abs(aVR+aVL+aVF).mean() < 0.01,应用 'aVR + aVL + aVF = 0'
aVR = (aVR + (-aVL - aVF) × 0.5) ÷ 1.5
aVL = (aVL + (-aVR - aVF) × 0.5) ÷ 1.5
aVF = (aVF + (-aVR - aVL) × 0.5) ÷ 1.5

6. 测试时增强 (TTA)

共实施了三种测试时增强 (TTA) 策略。这些涉及用于亮度控制的 gamma 调整(1.0、0.9 和 1.1),以及阶段 1 输入的裁剪和调整大小。

  • 裁剪: 阶段 1 输入调整为 1560x1248,随后中心裁剪为 1440x1152。
  • 调整大小: 阶段 1 的输入分辨率调整为 1600x1280。

7. 训练细节

使用 SmoothL1Loss 作为损失函数,AdamW 作为优化器,batch size 为 1。学习率设置为 1e-4,并由 cosine 学习率调度管理。

数据增强

生成合成空白 ECG 图像,以防止模型在遇到遮挡或噪声时预测异常值。还对 ground truth 数据应用了随机变化以增加多样性。此外,引入了摩尔纹(Moiré patterns)、 flare 和叠加的非校正图像,以增加训练难度并增强模型鲁棒性。

数据增强示意图

结果

共集成了十个模型。对于验证,从十个图像 ID 中选取三个段(0006、0009 和 0012),共 30 张图像。

TTA 的实施使整体性能提高了 0.07,而基于爱因托芬定律的校正提供了额外的 0.06 提升。

模型 验证集 LB (Private) 骨干网络 输入尺寸 输出尺寸 预测策略 集成权重
1 26.79 convnextv2_tiny 5056x1280 4x20000 策略 1 20
2 26.21 convnextv2_base 2528x1280 4x10000 策略 1 32
3 26.50 tf_efficientnetv2_m 5056x1280 4x20000 策略 2 30
4 26.03 hgnetv2_b6 5056x1280 4x20000 策略 2 11
5 26.46 mambaout_base 5056x1280 4x20000 策略 2 8
6 25.65 caformer_m36 2528x1280 4x10000 策略 2 9
7 26.77 22.98 (22.75) convnextv2_tiny 5056x1280 4x15000 策略 3 31
8 26.56 inception_next_small 5056x1280 4x15000 策略 3 23
9 26.76 inception_next_base 5056x1280 4x20000 策略 3 27
10 26.78 inception_next_base 5056x1280 4x20000 策略 1 25

1. 信号交叉

为了评估模型鲁棒性,使用 ECG-Image-Kit 选择了导联重叠或交叉的案例。结果表明,即使在 Lead V3 和 Lead II 部分相交的情况下,模型仍然能够生成准确的预测。

信号交叉结果

2. 重采样

比较了使用 scipy.signal.resample 和线性插值进行后处理的 SNR 差异。(仅在本地测试了一张图像)

Scipy.signal.resample 线性插值
SNR 23.834 22.176

3. 重映射

比较了从高分辨率和低分辨率图像重映射的 SNR 差异。(仅在本地测试了一张图像)

从高分辨率重映射 从低分辨率重映射
SNR 23.834 21.267

4. 校正

实施了两种主要增强功能以改进原始校正方法的输出质量:

  1. 网格点位置使用特征图的加权平均值计算,以保留浮点精度。
  2. 利用曲面拟合识别并去除异常值, resulting gaps 通过插值或回归函数本身填充。这种方法确保了平滑的图像边缘,并显著增强了校正图像的整体结构完整性。
校正效果 1 校正效果 2

其他

图像 3 是通过扫描图像 1 生成的,但我们发现图像 3 中网格和信号之间的偏移与图像 1 中的不同。

图像差异对比
同比赛其他方案