433. HuBMAP - Hacking the Kidney | hubmap-kidney-segmentation
恭喜所有参加这次比赛的人!对我来说,这是一场情绪像过山车一样的经历。感谢主办方举办了这场拥有有意义数据的有趣比赛。我还要特别感谢 @iafoss,如果没有他的入门笔记(starter notebooks),我在这里什么都做不了,因为我以前从未做过分割任务。顺便说一句,恭喜你离 Grandmaster 更近了一步!看来我们在这次排名波动中都表现得不错。
在比赛接近尾声时,标注问题让我感到非常抓狂,觉得似乎无计可施了。但我不想就这样放弃,所以我选择了一条路:只做那些我认为能尽可能好地泛化的最简单的事情。在这里,我将讨论最重要的细节,并发布用于产生最终结果的所有代码。
我们在最终的集成模型中使用了 reduce=2 和 sz=1024。我们使用的笔记本最初是由 iafoss 发布的:https://www.kaggle.com/iafoss/256x256-images
我们在所有的训练中都使用了 cutout:
def cutout(tensor,alpha=0.5):
x=int(alpha*tensor.shape[2])
y=int(alpha*tensor.shape[3])
center=np.random.randint(0,tensor.shape[2],size=(2))
#perm = torch.randperm(img.shape[0])
cut_tensor=tensor.clone()
cut_tensor[:,:,center[0]-x//2:center[0]+x//2,center[1]-y//2:center[1]+y//2]=0
return cut_tensor
此外,我们使用了以下 albumentations 数据增强:
def get_aug(p=1.0):
return Compose([
HorizontalFlip(),
VerticalFlip(),
RandomRotate90(),
ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=15, p=0.9,
border_mode=cv2.BORDER_REFLECT),
OneOf([
ElasticTransform(p=.3),
GaussianBlur(p=.3),
GaussNoise(p=.3),
OpticalDistortion(p=0.3),
GridDistortion(p=.1),
IAAPiecewiseAffine(p=0.3),
], p=0.3),
OneOf([
HueSaturationValue(15,25,0),
CLAHE(clip_limit=2),
RandomBrightnessContrast(brightness_limit=0.3, contrast_limit=0.3),
], p=0.3),
], p=p)
从 iafoss 的入门笔记本开始,我将其改为纯 PyTorch 实现并加重了数据增强。我集成了两组 5 折交叉验证的模型:一组使用 ResNeXt50,另一组使用 ResNeXt101。EfficientNets 对我来说从来没起过作用,在这里这一趋势仍在继续。说实话,这里没什么更多可说的。
我们在推理过程中使用了我们称之为“扩展切片”的方法,这是我的队友 jj 最初在 PANDA 比赛中提出的。你可以在我们的推理笔记本和下图中看到这是如何实现的。其基本思想是消除边缘效应。为了实现这一点,对于我们运行模型的每个切片,我们在所有 4 个方向上将切片扩展一定数量的像素,但只使用没有边缘的中心区域的预测结果。这样实际上就没有边缘效应