600. HMS - Harmful Brain Activity Classification | hms-harmful-brain-activity-classification
首先,我要感谢竞赛组织者和社区,提供了如此精彩的挑战以及在笔记本和讨论中度过的有趣时光。遗憾的是,这次我只能作为读者参与,希望通过这份解决方案来弥补。如有任何问题或建议,欢迎随时提出!
以下是我在HMS - 有害脑活动分类竞赛中获得第16名解决方案的高层次描述,以及对最重要主题的更详细说明。
最终方案是在所有数据(>7标签,≤7伪标签)上的6个模型集成,≤7投票部分的伪标签也通过10个模型集成获得。
最有帮助的部分包括:选择>7人投票的高质量标签、将1D数据绘制为2D、使用全局双极导联归一化而非每个对象的min-max、骨干网络的幸运选择以及使用大图像尺寸。伪标签、EMA和TTA仅带来微小改进(约0.001量级)。我未精确测量增强的影响,但可以确认它们显著减少了过拟合。
以下补充材料论文帮助解决了两个问题:


文中还讨论了基于误差均衡的训练-测试分割策略,有助于在训练和测试中更均匀分布困难样本,但我未采用此方法,仍使用熟悉的
核心思想是利用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。