336. SIIM-ACR Pneumothorax Segmentation | siim-acr-pneumothorax-segmentation
首先感谢医学影像信息学学会(SIIM)和 Kaggle 举办了一场非常有趣且充满挑战的比赛。很高兴能参与其中。
这是我第一次接触图像分割,如果事先有人告诉我结果会是这样,我会觉得他疯了)
我的流程代码库:https://github.com/sneddy/kaggle-pneumathorax
假设我们的分割模型输出了包含气胸像素概率的掩码。我将此掩码称为基础 sigmoid 掩码。我使用了三个不同的阈值:(top_score_threshold, min_contour_area, bottom_score_threshold)
决策规则基于一对阈值 (top_score_threshold, min_contour_area)。我用它来代替气胸/非气胸的分类。
那些没有通过这对阈值筛选的图像被计为非气胸图像。
对于剩余的气胸图像,我们使用 bottom_score_threshold(另一个二值化阈值,小于 top_score_threshold)对基础 sigmoid 掩码进行二值化。您可能会注意到,大多数参与者使用相同的方案,但假设 bottom_score_threshold = top_score_threshold。
该方案的简化版本:
classification_mask = predicted > top_score_threshold
mask = predicted.copy()
mask[classification_mask.sum(axis=(1,2,3)) < min_contour_area, :,:,:] = np.zeros_like(predicted[0])
mask = mask > bot_score_threshold
return mask
对于我的最终提交,我选择了介于这些三元组之间的值。
使用了 [combo loss],结合了 BCE、Dice 和 Focal 损失。在最佳实验中,我使用的 (BCE, dice, focal) 权重如下:
我们将气胸图像的比例称为采样率。
主要思想是使用 torch dataset 的采样器来控制这一比例。
在每个 epoch 中,我的采样器从数据集中获取所有气胸图像,并根据采样率采样一些非气胸图像。在训练过程中,我们将此参数从开始的 0.8 降低到结束时的 0.4。
开始时较大的采样率提供了学习过程的快速启动,而结束时较小的采样率