返回列表

2nd place solution

596. SenNet + HOA - Hacking the Human Vasculature in 3D | blood-vessel-segmentation

开始: 2023-11-07 结束: 2024-02-06 医学影像分析 数据算法赛

第二名解决方案

作者:ryo (EXPERT)

竞赛排名:第2名

发布时间:2024-02-09

发生了什么?我的名字出现在第二名?我记得我的公开分数是0.43,排名是1052……

概述

我的解决方案包括U-Net3D(128x128x32)、阈值调整和后处理来移除不连通的血管,因为它们属于假阳性。

  • 使用随机旋转(和位置)的数据增强,与第一名解决方案相同。
  • U-Net3D。我曾认为3D会更准确,因为它提供更多维度的信息。但现在觉得这个假设可能有误,因为第一名使用了2.5D方法。
  • 二元焦点损失(Binary-focal loss)。由于正样本数据较少。
  • 调整阈值。由于不同人之间的血管体积比例没有太大差异,因此根据该比例来设定阈值。
  • 后处理。由于血管应该是连通的,使用深度优先搜索提取小块并移除。

https://github.com/tail-island/blood-vessel-segmentation
Kaggle解决方案笔记本

数据处理

为方便切割数据,我创建了3D Numpy数组并调整了比例。我原本创建了"全部"(all)和"密集"(dense)数据集,计划按"全部"到"密集"的顺序进行课程学习。但由于个人电脑训练时间过长,最终只使用了稀疏数据训练。此外,我认为数据对人眼可见,差异不会太大,因此没有进行归一化或裁剪处理。

数据创建脚本

训练过程

我在每个n个周期(epoch)中从随机位置和旋转角度生成数据。为减少数据生成时间,使用了多进程处理。

数据集处理代码

神经网络采用U-Net3D架构。

模型定义代码

使用二元焦点损失,优化器为AdamW,学习率采用余弦衰减调度。

训练脚本

提交预测

通过平铺(tiling)方式进行预测。get_candidate()函数根据给定比例查找候选区域,get_blood_vessels()函数移除不连通的小块。

提交脚本

在搜索大血管块(并裁剪)的版本中,私有分数为0.756793,公开分数为0.000000...

优化版本脚本

发生了什么?

也许公开数据集只包含前x%的图像,它仅包含血管的末端部分,根部部分没有包含在内。因此,我的后处理在公开榜单上表现不佳。

由于公开分数太低,我很早就放弃了改进程序。而其他参赛者持续针对公开数据中血管末端部分进行优化。我怀疑这些改进在包含血管根部的私有数据上效果不佳。换句话说,我的第二名可能纯属运气...

同比赛其他方案