```html
第四名解决方案 - ECG 数字化
第四名解决方案
首先,我要感谢主办方和 Kaggle 组织了这次比赛。
我将解释我的第四名解决方案,重点关注处理流程和模型/训练策略。
方案概述
我的方法侧重于校正,以便模型更容易识别信号,然后使用回归模型估计波形。信号分割仅作为辅助任务处理。
主要要点如下:
- 鲁棒校正 (Robust Rectification):估计网格交点和布局,然后将索引网格映射到归一化坐标系(基于 @hengck23 的讨论)。
- 垂直分割 (Vertical Splitting):按导联垂直分割校正后的图像。这降低了预测任务的复杂性。
- 基于 SNR 的训练 (SNR-based Training):使用基于信噪比 (SNR) 的损失函数,这与评估指标非常接近。
处理流程
从输入图像到信号估计的过程分为 4 个阶段。
第一阶段:网格交点与方向 (Grid Intersection & Orientation)
网格交点与布局检测
对于一张高分辨率图像,我使用滑动窗口(704x704 大小,0.5 重叠)通过多任务模型估计以下内容:
- 网格交点热力图:所有网格交点。
- 布局分割:导联分隔线和校准信号的位置。
方向校正
使用检测到的布局信息,我估计图像方向并将其旋转(0/90/180/270 度)为统一的直立方向。检测到的交点坐标也会相应旋转。
第二阶段:网格线索引 (Grid Line Indexing)
使用校正后的图像,模型估计每个像素的索引,指示它属于哪条垂直线或水平线。
- 输入:调整大小并填充至 1536x1536。
- 输出:垂直线索引(55 类 + 背景),水平线索引(43 类 + 背景)。
- 分配:对于第一阶段检测到的每个交点,我聚合其邻域(半径 6px)内的预测标签,并通过多数投票确定行/列索引。
这确定了每个交点在网格 (row, col) 中的对应位置。
第三阶段:校正与分割 (Rectification & Splitting)
校正(网格展开)
我从索引化的交点创建采样坐标场,并将图像变形为固定大小的坐标系。此方法与 @hengck23 分享的 grid_sample 方法相同。
输出大小固定为 1700x2200。
裁剪与垂直分割
校正后的图像通常包含页眉或边距,因此我裁剪掉顶部 25% 以仅保留信号区域。
然后,我将图像宽度分为 4 个段。段边界是通过将固定列索引转换为校正图像中的像素来确定的。
- 每个段包含 3 个短导联和 2.5 秒的长导联 II,垂直堆叠。
- 目的:
- 降低复杂性:模型不需要在整个图像中空间搜索每个导联的位置。
- 信息插值:由于同一段内的时间轴是对齐的,将 4 个信号作为输入允许模型利用上下信号的信息来填补网格线缺失或噪声造成的空白。
每个段图像的大小调整为 800x800。
第四阶段:信号估计(回归) (Signal Estimation)
波形估计模型
模型将 4 个分段图像作为输入,并回归 12 个导联的时间序列值。
- 输入:800x800 x 3 通道 (x 4 个段)
- 输出:
- 短导联:输出来自 4 个段中每个段对应的 3 个导联的波形。
- 长导联 II:沿时间轴连接 4 个段的特征,并输出全长度波形。
- 重采样:使用线性插值,根据测试数据的
fs(采样频率)将固定长度的输出序列重采样为所需的样本数。
集成 (Ensemble)
我训练了多个具有不同骨干网络的模型,并使用加权中值对它们进行集成。中值比均值对尖峰状异常预测更具鲁棒性。
| 骨干网络 (Backbone) |
权重 |
CV (SNR) |
公共榜 (Public LB) |
私有榜 (Private LB) |
| resnetaa101d.sw_in12k_ft_in1k |
1 |
25.62 |
21.99 |
22.03 |
| tf_efficientnetv2_m.in21k_ft_in1k |
3 |
26.05 |
22.39 |
22.42 |
| tf_efficientnet_b6.ns_jft_in1k |
4 |
26.05 |
22.50 |
22.44 |
| tf_efficientnetv2_l.in21k_ft_in1k |
2 |
26.08 |
22.50 |
22.53 |
| 集成 (均值) |
|
26.58 |
22.30 |
22.37 |
| 集成 (中值) |
|
26.45 |
22.71 |
22.69 |
模型与训练策略
第一阶段和第二阶段模型(网格与索引)
数据集与标注
我自己创建了标注(交点和线索引)。我使用了“基于规则的初步标注” -> “模型训练” -> “手动校正推理结果”的循环,创建了大约 1000 张标注图像。注意,“线”存储为交点序列,而不是像素级的连续曲线。
骨干网络与预训练
我使用 ConvNeXt Small (convnext_small.dinov3_lvd1689m) 作为第一阶段和第二阶段模型的骨干网络。
值得注意的是,我在 ECG 图像域使用 FCMAE(全卷积掩码自动编码器)进行了预训练。这有助于模型更快收敛,即使在标签有限的情况下也能提高检测精度。
第四阶段模型(数字化)
网络架构
我使用了基于 U-Net 的架构,并针对 ECG 数字化进行了特定修改。
- 非对称解码器 (Asymmetric Decoder):
解码器最初执行正常的 2D 上采样。然而,在特征图大小变得足够大(1/8 比例)后,它仅在水平(时间)方向执行上采样。
- 这减少了不必要的垂直分辨率的计算成本,同时确保了高时间分辨率。
- 多头回归 (Multi-head Regression):
- 短导联头:在解码器输出上执行垂直全局平均池化,然后使用 1D 卷积进行回归。
- 长导联 II 头:沿时间轴连接段之间的特征,然后使用另一个 1D 卷积进行回归。
- 辅助头 (Auxiliary Head):
我添加了一个分割头来估计每个导联的信号区域。这是一个辅助任务,旨在提高信号区分度。
损失函数
为了防止与评估指标出现偏差,我设计了一个基于 SNR 的损失函数。我分别优化了 SNR 项和均值项。
外部数据集
除了训练数据外,我还使用了以下使用 ecg-image-kit 转换为图像的外部数据集:
由于生成的数据具有准确的 ground truth 掩码(指示哪个像素对应哪个导联),我能够使用它们来训练辅助分割任务。
参考文献
- Woo, S., Debnath, S., Hu, R., Chen, X., Liu, Z., Kweon, I. S., & Xie, S. (2023). Convnext v2: Co-designing and scaling convnets with masked autoencoders. In Proceedings of the IEEE/CVF conference on computer vision and pattern recognition (pp. 16133-16142).
- Kshama Kodthalu Shivashankara, Deepanshi, Afagh Mehri Shervedani, Matthew A. Reyna, Gari D. Clifford, Reza Sameni (2024). ECG-image-kit: a synthetic image generation toolbox to facilitate deep learning-based electrocardiogram digitization. In Physiological Measurement. IOP Publishing. doi: 10.1088/1361-6579/ad4954
- ECG-Image-Kit: A Toolkit for Synthesis, Analysis, and Digitization of Electrocardiogram Images, (2024). URL: https://github.com/alphanumericslab/ecg-image-kit
- Wagner, P., Strodthoff, N., Bousseljot, R., Samek, W., & Schaeffter, T. (2022). PTB-XL, a large publicly available electrocardiography dataset (version 1.0.3). PhysioNet. RRID:SCR_007345. https://doi.org/10.13026/kfzx-aw45
- Ribeiro, A. H., Paixao, G. M. M., Lima, E. M., Horta Ribeiro, M., Pinto Filho, M. M., Gomes, P. R., Oliveira, D. M., Meira Jr, W., Schon, T. B., & Ribeiro, A. L. P. (2021). CODE-15%: a large scale annotated dataset of 12-lead ECGs (1.0.0) [Data set]. Zenodo. https://doi.org/10.5281/zenodo.4916206
```