686. PhysioNet - Digitization of ECG Images | physionet-ecg-image-digitization
有关完整实现细节和源代码,请参考我们的 GitHub 仓库和 Notebook:
训练代码 (GitHub) https://github.com/tanghaozhe/physionet-ecg-image-digitization-3rd-place 提交 Notebook https://www.kaggle.com/code/hirotetsu/physionet-submission-3rd-place对于掩膜生成,我们使用信号数据绘制一像素宽的线。我们也尝试通过添加高斯模糊使线变宽以创建更柔和的标签,但这并没有改善结果。因此,我们决定保持一像素掩膜,并故意训练一个“过拟合”的模型,使其以高置信度预测细波形。
| 图像尺寸 | 信噪比 SNR (dB) | 备注 |
|---|---|---|
| 2200 x 1700 | 24.2235 | 标准尺寸 (200 DPI) |
| 4400 x 1700 | 31.2271 | 选定尺寸 |
我们评估了不同掩膜尺寸的信噪比,发现较大的掩膜通常能提供更好的信噪比。然而,由于推理内存有限和训练结果,我们选择在保持原始高度的同时将宽度加倍。这里的问题是如何在校正过程中保持图像质量,我们通过将图像变换步骤与校正过程分离来解决这个问题。
校正模型输出的校正图像尺寸相对较小,这可能会在校正过程中导致质量损失。为了避免重复调整大小造成的退化,我们将过程分为两步:
单应性矩阵 (Homography matrix) 和网格坐标被缩放以匹配原始 raw 图像的大小。这种方法在实验中产生了显著的改进。
编码器 (encoder):
在我们的实验中,性能排名为 ConvNeXt V2 > HRNet > EfficientNet V2。对于最终提交,我们通过取后处理信号的加权平均来集成 ConvNeXt V2 和 HRNet 模型,而不是直接平均分割概率。这种信号级集成产生了更好的结果。
解码器 (decoder):
数据增强 (Augmentation):
考虑到隐藏测试数据中的一些样本可能噪声很高,我们在训练期间应用了非常激进的数据增强。我们添加了一个小的 ElasticTransform 来模拟展开图像中的失真,其中波形和网格线都可能因展开过程本身而略微扭曲。
损失函数 (Loss):
我们使用 BCE 损失训练模型。在实践中,即使在最低损失下,预测的波形仍然太粗。为了获得细的、接近一像素宽的波形边界,我们故意继续训练一个“过拟合”的模型,并使用 Dice 分数和 CV 分数作为模型选择的主要标准。
我们尝试了不同的策略将像素位置转换为时间序列值。两种有效的方法是:
我们选择了抛物线插值,因为它在我们的实验中始终提供最佳性能。我们认为这是因为模型输出了非常细、锐利的线,对于这种情况,抛物线插值提供了一种可靠的方法来估计真实位置,而不需要超参数调整。
偏移量计算如下:
最终位置为: