第 12 名解决方案 - PhysioNet ECG 图像数字化
第 12 名解决方案
致谢
我们要感谢 Kaggle 和竞赛组织者提供数据集和参赛机会。我们也感谢社区提供的讨论和分享的想法,这些帮助改进了我们的方法。
1. 整体流程
- 使用 OCR 进行方向检测和校正
- 使用 OpenCV 检测纸张区域并裁剪
- 使用关键点检测模型检测 17 个网格点
- 对于检测到的 17 个关键点,扩展四个角关键点并添加四个额外点。然后,对预定义的 Type1 关键点布局应用德劳内三角剖分 (Delaunay triangulation),并将目标图像中由相应检测关键点定义的每个三角区域 warp 到此布局上。为了减少高分辨率图像的信息损失,在 warp 过程中参考关键点被放大了 2 倍 (如下图所示)。
- 从步骤 4 的结果中裁剪每个导联 (lead) 区域,并使用信号提取模型预测每个导联的信号。
2. 数据
仅使用了竞赛数据 (无外部或合成数据)。
3. 网格关键点检测
- 使用分割模型预测 17 个独立的关键点掩膜 (17 个输出通道)。
- 使用连通组件 (
scipy.ndimage.label) 提取关键点坐标并进行加权平均。
模型架构
一个简单的 U-Net 分割模型,带有 convnext_small.dinov3_lvd1689m 骨干网络,一个用于 PAF 辅助损失的额外解码器头,以及一个方向检测头。
损失函数
混合损失包括:
- Dice 损失
- BCE 损失
- PAF 损失
- 用于方向分类的交叉熵损失
训练过程
- 对 N = 350, 450, …, 700 重复以下过程:
- 手动标注 N 张图像的 17 个网格关键点
- 使用带有手动标注 ground truth 标签的图像训练模型 (如果有可用则从前一个 checkpoint 初始化权重)
- 预测所有图像的关键点,并使用 ground truth 和预测的伪关键点微调模型
- 在此阶段,准确率通常很好,除了右侧边缘点。因此,将伪关键点导入回标注工具,仅手动校正预测错误的右侧边缘关键点。然后使用完整标注微调模型以获得最终模型。
数据增强
- OneOf:
- ElasticTransform (弹性变换)
- GridDistortion (网格畸变)
- OpticalDistortion (光学畸变)
- OneOf:
- ShiftScaleRotate (平移缩放旋转)
- Perspective (透视)
- RandomBrightnessContrast (随机亮度对比度)
- GaussianNoise (高斯噪声)
- ImageCompression (图像压缩)
- CoarseDropout (粗 Dropout)
- 旋转 90/180/270 度
4. 信号提取
- 使用 U-Net 分割模块进行信号分割
- 通过 2D 网格采样,使用可学习的 warp 场 (另一个 U-Net 解码器分支的输出) 对掩膜应用 warp
- 使用基于一维 CNN 的回归头从 warp 后的分割掩膜预测信号时间序列
- 使用带有 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 掩膜示例。红色边界框表示用于训练的裁剪区域。

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 |