508. HuBMAP + HPA - Hacking the Human Body | hubmap-organ-segmentation
感谢主办方,并祝贺所有的获奖者!
在这次比赛中,由于基于HPA标记数据的交叉验证(CV)对于提高私有排行榜分数并不可靠,我尽可能多地进行了提交,仅通过Hubmap数据的排行榜分数来确认实验的有效性。最终,以下三点是我解决方案的关键:
总共使用了12个模型进行集成。
我从GTEx Portal下载了外部数据,并为它们制作了伪标签。由于GTEx的.svs图像分辨率太高,在制作伪标签之前将它们裁剪成图块。如果伪标签的掩码区域太小或没有掩码,则排除该图块。伪标签经过人工检查,如果明显错误则进行修改或移除。这些数据通过与原始标记数据混合用于训练。最终,来自40个样本的共650个图块被用于训练。这使我的Hubmap排行榜分数提高了约0.02。
虽然我最多可以使用8种组合模式,但由于9小时的运行时间限制,我将其减少到四种。比例是根据x0.25的训练比例选择的。
虽然没有明确的证据,但特别是对于“脾脏”和“肺”,掩码的边界比较模糊,所以我尝试放大或缩小掩码并在排行榜分数上确认效果。结果,缩小脾脏和肺的预测掩码提高了我的排行榜分数。我没有在最终提交之一中包含后处理,因为我认为存在过拟合公共数据的可能性。然而,如果包含后处理,最终的私有排行榜分数会更好。后处理通过以下代码实现。
SHRINK = {'spleen': 10, 'lung': 10}
def post_proc(preds, organ):
# preds: 二值化后的预测掩码
if organ in SHRINK.keys():
contours, _ = cv2.findContours(preds, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
preds = preds.astype(np.int8)
preds_cont = np.zeros_like(preds)
preds_cont = cv2.drawContours(preds_cont, contours, -1, 1, SHRINK[organ]*2)
preds = (preds - preds_cont).clip(0, 1).astype(np.uint8)
return preds