返回列表

12th place solution

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

开始: 2025-10-21 结束: 2026-01-22 医学影像分析 数据算法赛
第 12 名解决方案 - PhysioNet ECG 图像数字化
竞赛: PhysioNet ECG 图像数字化
作者: pln (pondelion)
排名: 第 12 名
发布日期: 2026-01-23

第 12 名解决方案

致谢

我们要感谢 Kaggle 和竞赛组织者提供数据集和参赛机会。我们也感谢社区提供的讨论和分享的想法,这些帮助改进了我们的方法。


1. 整体流程

  1. 使用 OCR 进行方向检测和校正
  2. 使用 OpenCV 检测纸张区域并裁剪
  3. 使用关键点检测模型检测 17 个网格点
  4. 对于检测到的 17 个关键点,扩展四个角关键点并添加四个额外点。然后,对预定义的 Type1 关键点布局应用德劳内三角剖分 (Delaunay triangulation),并将目标图像中由相应检测关键点定义的每个三角区域 warp 到此布局上。为了减少高分辨率图像的信息损失,在 warp 过程中参考关键点被放大了 2 倍 (如下图所示)。
  5. 从步骤 4 的结果中裁剪每个导联 (lead) 区域,并使用信号提取模型预测每个导联的信号。
  • 预测和扩展关键点的可视化。
    关键点检测可视化

  • 显示德劳内三角剖分和 warp 后的图像可视化。边界框表示用作模型输入的每个导联的 ROI (感兴趣区域)。
    Warp 后可视化


2. 数据

仅使用了竞赛数据 (无外部或合成数据)。


3. 网格关键点检测

  1. 使用分割模型预测 17 个独立的关键点掩膜 (17 个输出通道)。
  2. 使用连通组件 (scipy.ndimage.label) 提取关键点坐标并进行加权平均。

模型架构

一个简单的 U-Net 分割模型,带有 convnext_small.dinov3_lvd1689m 骨干网络,一个用于 PAF 辅助损失的额外解码器头,以及一个方向检测头。

损失函数

混合损失包括:

  • Dice 损失
  • BCE 损失
  • PAF 损失
  • 用于方向分类的交叉熵损失

训练过程

  1. 对 N = 350, 450, …, 700 重复以下过程:
    • 手动标注 N 张图像的 17 个网格关键点
    • 使用带有手动标注 ground truth 标签的图像训练模型 (如果有可用则从前一个 checkpoint 初始化权重)
    • 预测所有图像的关键点,并使用 ground truth 和预测的伪关键点微调模型
  2. 在此阶段,准确率通常很好,除了右侧边缘点。因此,将伪关键点导入回标注工具,仅手动校正预测错误的右侧边缘关键点。然后使用完整标注微调模型以获得最终模型。

数据增强

  • OneOf:
    • ElasticTransform (弹性变换)
    • GridDistortion (网格畸变)
    • OpticalDistortion (光学畸变)
  • OneOf:
    • ShiftScaleRotate (平移缩放旋转)
    • Perspective (透视)
  • RandomBrightnessContrast (随机亮度对比度)
  • GaussianNoise (高斯噪声)
  • ImageCompression (图像压缩)
  • CoarseDropout (粗 Dropout)
  • 旋转 90/180/270 度

4. 信号提取

  1. 使用 U-Net 分割模块进行信号分割
  2. 通过 2D 网格采样,使用可学习的 warp 场 (另一个 U-Net 解码器分支的输出) 对掩膜应用 warp
  3. 使用基于一维 CNN 的回归头从 warp 后的分割掩膜预测信号时间序列
  4. 使用带有 1D 网格采样的可学习优化重采样器重采样到 2.5 倍采样频率

上述所有模块均联合训练。
由于重采样引起的相位偏移显著,我引入了一个可学习的重采样器来优化重采样。
(例如,在仅修剪或填充最终预测的 number_of_rows 的最后一个点然后插值回 number_of_rows 的实验中,公开榜从 21.49 退化到 20.12/20.00。)

模型架构

模型架构图

  • 骨干网络:convnext_tiny.dinov3_lvd1689m / convnext_small.dinov3_lvd1689m

损失函数

混合损失包括:

  • 用于信号分割的 Dice 损失
  • 用于信号分割的 BCE 损失
  • 用于信号回归的 SNR 损失
  • 用于网格 warp 正则化的 Warp 平滑损失

数据增强

  • OneOf:
    • ElasticTransform (弹性变换)
    • GridDistortion (网格畸变)
    • OpticalDistortion (光学畸变)
  • RandomBrightnessContrast (随机亮度对比度)
  • GaussianNoise (高斯噪声)
  • ImageCompression (图像压缩)
  • CoarseDropout (粗 Dropout)
  • 使用伪 (预测) 关键点代替 ground truth (手动) 关键点进行区域裁剪
  • 向关键点坐标添加高斯噪声
  • 额外的右侧边缘关键点噪声
  • 随机选择采样频率并重采样 GT 信号

注意: 上述增强不适用于信号分割 ground truth 掩膜。目标是让模型通过 warp 模块学习畸变校正。

预处理 / 训练

  • 对于模型输入图像,使用 GT/预测关键点裁剪每个导联的 ROI,高度恒定。每个调整为 (3, H_lead=384, W_LEAD=1536) 并堆叠为 (n_leads=16, 3, H_lead, W_LEAD)。此外,类似地准备顶部区域图像 (n_leads_top=4, 3, H_lead, W_LEAD)
  • 对于信号分割 GT 掩膜,在绘制目标导联的掩膜后,裁剪包括 y=0 和 ±1 区域的目标区域 (如下图所示),并调整为 (3, 3 × H_lead=1152, W_LEAD=1536),然后为所有导联堆叠为 (n_leads=16, 3, 3×H_lead, W_LEAD)
  • 为了处理信号超出目标导联区域的情况,模型在编码器特征空间中连接相邻 y ±1 区域的特征,因此最终单导联预测分割高度为 3×H_lead,与 GT 掩膜匹配。

V5 导联的 GT 掩膜示例。红色边界框表示用于训练的裁剪区域。
GT 掩膜示例


5. 集成

简单的加权平均集成效果最好。
最终使用了三个模型 (网格关键点检测模型为单个模型)。结合 90 度旋转 TTA,总共 3 × 2 = 6 个预测通过加权平均组合以获得最佳结果。

  • 单一模型
模型名称 骨干网络 使用 FS PE 公开榜 私有榜
A convnext_tiny.dinov3_lvd1689m 21.49 21.18
B convnext_small.dinov3_lvd1689m 21.12 20.84
C (源自 A) convnext_tiny.dinov3_lvd1689m 21.36 21.03
  • 集成
编号 A 权重 B 权重 C 权重 (关键点检测) 90 度旋转 TTA 公开榜 私有榜
1 0.45 0.4 0.15 21.86 21.57
2 0.4 0.4 0.2 21.81 21.50
3 0.5 0.2 0.3 21.76 21.45
同比赛其他方案