返回列表

16th place write-up: EEG montages -> 2D image + specs

600. HMS - Harmful Brain Activity Classification | hms-harmful-brain-activity-classification

开始: 2024-01-09 结束: 2024-04-08 临床决策支持 数据算法赛
第16名解决方案:EEG导联->2D图像+频谱图
作者:Mikhail Kotyushev | 排名:第16名 | 发布时间:2024年4月9日

概述

首先,我要感谢竞赛组织者和社区,提供了如此精彩的挑战以及在笔记本和讨论中度过的有趣时光。遗憾的是,这次我只能作为读者参与,希望通过这份解决方案来弥补。如有任何问题或建议,欢迎随时提出!

以下是我在HMS - 有害脑活动分类竞赛中获得第16名解决方案的高层次描述,以及对最重要主题的更详细说明。

  • 数据:竞赛提供的10分钟数据与@cdeotte的50秒频谱图(非常感谢他!),并拼接了归一化的EEG双极导联图
  • 模型:timm的tinyViT骨干网络(最佳质量/速度比)
  • 训练:第一阶段仅使用>7人投票的数据,第二阶段通过伪标签(PL)标注其余数据并重新训练
  • 增强:随机选择EEG子ID,在原始EEG和频谱图上进行左右电极通道翻转,图像增强:粗丢弃 + 亮度/对比度调整
  • 其他:带预热的余弦学习率调度,衰减率0.8的EMA,翻转测试时增强(TTA)

最终方案是在所有数据(>7标签,≤7伪标签)上的6个模型集成,≤7投票部分的伪标签也通过10个模型集成获得。

最有帮助的部分包括:选择>7人投票的高质量标签、将1D数据绘制为2D、使用全局双极导联归一化而非每个对象的min-max、骨干网络的幸运选择以及使用大图像尺寸。伪标签、EMA和TTA仅带来微小改进(约0.001量级)。我未精确测量增强的影响,但可以确认它们显著减少了过拟合。

论文中的一些见解

以下补充材料论文帮助解决了两个问题:

  1. 回答关键问题:测试数据是否只包含高票数对象?

训练测试分割

  1. 通道翻转增强技术

通道翻转增强

文中还讨论了基于误差均衡的训练-测试分割策略,有助于在训练和测试中更均匀分布困难样本,但我未采用此方法,仍使用熟悉的

数据处理

核心思想是利用2D视觉模型(特别是Transformer架构)的权重,同时向模型展示与标注员所见完全相同的图像。

标注员界面

实现方式如下:

竞赛频谱图预处理:

spectrogram[np.isnan(spectrogram)] = 0
spectrogram = np.log10(spectrogram + 1e-6)
min_, max_ = np.quantile(spectrogram, 0.01), np.quantile(spectrogram, 0.99)
spectrogram = np.clip(spectrogram, min_, max_)
spectrogram = (spectrogram - min_) / (max_ - min_)

@cdeotte的频谱图:仅进行[0,1]范围转换,无其他处理。两种频谱图均调整为320×320并垂直拼接。

EEG双极导联处理:计算中心20秒数据,滤波范围为1-70Hz以消除电源干扰,并进行归一化。预计算的EEG_DIFF_ABS_MAX[i]值约为100(对应导联的0.05和0.95分位数)。

# 移除50Hz/60Hz噪声
b, a = butter(5, (59, 61), btype='bandstop', analog=False, fs=EED_SAMPLING_RATE_HZ)
y = lfilter(b, a, y, axis=0)

# 1-70Hz带通滤波
b, a = butter(5, (1, 70), btype='bandpass', analog=False, fs=EED_SAMPLING_RATE_HZ)
y = lfilter(b, a, y, axis=0)

# 归一化处理
min_, max_ = \\
    -2 * EEG_DIFF_ABS_MAX[i], \\
    2 * EEG_DIFF_ABS_MAX[i]
y = np.clip(y, min_, max_)
y = (y - min_) / (max_ - min_)
y[0] = 0
y[-1] = 1

20个导联图通过justpyplot库绘制为640×1600的2D数组,每个导联覆盖64×1600区域(含重叠),最后与频谱图拼接。总图像尺寸为640×1920,示例如下:

模型输入图像示例

模型架构

最初选择tiny_vit_21m_512.dist_in22k_ft_in1k模型进行实验,确实轻量且训练快速。尝试其他模型时发现,该模型经过蒸馏后非常强大——要达到相当性能需要如hf_hub:timm/eva02_base_patch14_448.mim_in22k_ft_in22k_in1k这类模型,后者体积大5倍且慢得多。

强烈建议在类似问题中尝试TinyViT模型!

更新:解决方案代码(PyTorch/Lightning/Docker)已发布于GitHub

同比赛其他方案