kaggle气胸疾病图像分割top5解决方案

2024-02-11 04:50

本文主要是介绍kaggle气胸疾病图像分割top5解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

比赛背景

突然喘气,无缘无故地无助地呼吸,这会是肺衰竭吗?气胸可由胸部钝伤、肺部疾病的损害引起,有时候甚至无法探寻诱因。在某些情况下,肺萎陷可能会危及生命。气胸通常由胸部X射线放射科医生诊断,但有时很难确诊。因此由医学影像信息学学会(SIIM)提供了气胸图片数据,kaggle举办了一场比赛,开发模型,为非放射科医生提供更可靠的诊断,并在疾病早期识别气胸,挽救生命。

数据

图片数据是胸透图片,并标注好了气胸区域。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

第一名

模型

  • AlbuNet(resnet34)(https://github.com/ternaus/TernausNet)
  • Resnet50(https://github.com/SpaceNetChallenge/SpaceNet_Off_Nadir_Solutions/tree/master/selim_sef/zoo)
  • SCSEUnet (seresnext50)(https://github.com/SpaceNetChallenge/SpaceNet_Off_Nadir_Solutions/tree/master/selim_sef/zoo)

三重推理与验证方案

模型输出的是一个像素是mask的概率,作者将这种mask称为sigmoid mask,并使用三种不同阈值:top_score_threshold, min_contour_area, bottom_score_threshold。

基于top_score_threshold, min_contour_area来生成决策规则,而不是单单进行有无气胸的分类。

  • top_score_threshold:二值化阈值,将sigmoid mask转成由0和1组成的离散mask。
  • min_contour_area:值大于top_score_threshold的最大像素数。

没有通过top_score_threshold和min_contour_area这两个阈值的图像则为非气胸图像。

对于剩下的气胸图像,使用bottom_score_threshold阈值(另外一个阈值,小于基于top_score_threshold),大多数参赛者假设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

验证阶段搜索最佳阈值

  • 验证阶段最佳三元阈值:(0.75, 2000, 0.3)
  • public LB最佳三元阈值:(0.7, 600, 0.3)

在最后提交阶段作者选了介于这两者之间的三元阈值。

Combo Loss

使用Combo Loss(https://github.com/SpaceNetChallenge/SpaceNet_Off_Nadir_Solutions/blob/master/selim_sef/training/losses.py),结合BCE,dice,focal损失,损失权重:

  • albunet_valid和seunet为(3,1,4)
  • albunet_public为(1,1,1)
  • resnet50为(2,1,2)

滑动采样率(sample rate)

将气胸图片比例称为采样率,并且在采样的时候控制比例。

每个epoch,选取所有的气胸图片,然后根据这一比例选取非气胸图片,比例从训练开始的0.8减少至0.4。

使用大比例,可以在训练前期加快训练,后期使用小的比例有助于网络收敛。

学习过程

  • 在预训练模型上使用大学习率(1e-3或1e-4)训练10-12轮,大采样率(0.8),使用ReduceLROnPlateau调整学习率。
  • 在前一个模型基础上使用中等学习率(大约1e-5),0.6采样率进行训练,学习率使用CosineAnnealingLR或CosineAnnealingWarmRestarts调整,直到收敛。
  • 在前一个模型基础上使用中等学习率(大约1e-5),0.4采样率,学习率使用CosineAnnealingLR或CosineAnnealingWarmRestarts调整,直到收敛。
  • 使用1e-5或1e-6学习率训练,0.5采样率,学习率使用CosineAnnealingLR或CosineAnnealingWarmRestarts调整。

数据增强

使用albumentations中提供的数据增强方法:

albu.Compose([albu.HorizontalFlip(),albu.OneOf([albu.RandomContrast(),albu.RandomGamma(),albu.RandomBrightness(),], p=0.3),albu.OneOf([albu.ElasticTransform(alpha=120, sigma=120 * 0.05, alpha_affine=120 * 0.03),albu.GridDistortion(),albu.OpticalDistortion(distort_limit=2, shift_limit=0.5),], p=0.3),albu.ShiftScaleRotate(),albu.Resize(img_size,img_size,always_apply=True),
])

其他

  • 在512x512的图像上训练后之后,再在1024x1024的图片上继续训练。
  • 小批量数据训练,批次大小为2-4
  • 水平翻转+TTA

结果

在这里插入图片描述

第二名

分类

判断一张图片是否有气胸,模型为multi-task模型,基于Unet,加上了分类分支。

  • 数据:所有数据。
  • 分类损失函数:BCE+focal loss
  • 分割损失函数:BCE
  • 数据增强:水平翻转,缩放,旋转,亮度,模糊
  • 主干网络:seresnext 50, seresnext101, efficientnet-b3
  • 集成方法:stacking

分割

使用unet和deeplabv3作为分割模型。

  • 数据:气胸图像
  • 损失:dice损失
  • 数据增强:与分类一样
  • 主干网络:seresnext50, seresnext101, efficientnet-b3, efficientnet-b5
  • 集成方法:average

第三名

解决方案

在这里插入图片描述

数据

由于图片太大,作者在1024x1024的图片上训练Unet来分割肺区域。

在这里插入图片描述

作者充分使用了CheXpert和NIH数据集,并且在阅读了相关论文后发现数据标注不是很准确,因此不能直接使用,而是使用伪标签。因此作者使用比赛的数据训练了主干网络为resnet34的Unet模型,在CheXpert上预测标记为正样本的数据,然后从中选出模型预测也为正样本的数据,而由于作者参加的另外一场比赛(Dogs-GAN)推迟结束,参加这个比赛的时间有限,所以直接使用负样本数据,而不进行同样的筛选。而对于NIH数据集,则是直接使用自己的预测结果,不使用数据标记。

在这里插入图片描述

在训练伪标签模型时,保持正负样本比例一样,伪标签样本数为正确标签样本数的一半。

模型

在Unet上主要尝试了resnet34和SE-resnext50两种主干网络,因为resnet34是轻量级的,适合用于实验,而SE-resnext50足够深,适合用于比赛,作者没有更多的时间和资源来训练更大更深的网络。

在这里插入图片描述

作者最后的三个模型:

  • 704x704图像,没有伪标签
  • 576x576图像,CheXpert的伪标签
  • 576x576图像,CheXpert和NIH伪标签

其他

  • 注意力模块:CBAM
  • 损失:Lovasz Loss
  • 不用分类,作者认为像素级别的标签已经够了,如果使用分类模型的话,很难选择阈值。
  • 不使用阈值搜索,直接使用0.5
  • 优化器:Adam,学习率0.0001,学习率不变
  • Epochs:15
  • 训练6轮后对模型参数使用EMA(指数滑动平均)
  • 批次大小:576x576图像时使批次大小为3,不使用BN,704x704图像时批次大小为2。

第四名

在这里插入图片描述

  • 模型:Unet
  • 主干网络:ResNet34,固定BN
  • 预处理:在随机裁剪的512x512图片上训练,768x768上进行预测。
  • 数据增强:albumentations中的ShiftScaleRotate, RandomBrightnessContrast, ElasticTransform, HorizontalFlip。
  • 优化器:Adam,批次大小8
  • Scheduler: CosineAnnealingLR
  • 额外特点:非气胸数据比例在训练过程中逐渐减少,从0.8降至0.22,这样使模型收敛更快。
  • 损失:
2.7 * BCE(pred_mask, gt_mask) + 0.9 * DICE(pred_mask, gt_mask) + 0.1 * BCE(pred_empty, gt_empty)
  • 后处理:
if pred_empty > 0.4 or area(pred_mask) < 800: pred_mask = empty
  • 集成:8折交叉验证得到4个最好模型,使用水平翻转TTA,对结果求平均。

第五名

作者的解决方法基于半监督学习,并且在网络中加入了两个分类器。

  • 网络:带Aspp结构的Unet
  • 主干网络:se50 & se101
  • 图像大小:1024x1024
  • 优化器:Adam
  • 损失:1024 * BCE(results, masks) + BCE(cls, cls_target)
  • 半监督学习: mean-teacher[1-2],使用NIH数据集

扫码关注微信公众号:机器工匠,回复关键字“气胸”获取top5的代码实现。
在这里插入图片描述

这篇关于kaggle气胸疾病图像分割top5解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698876

相关文章

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

Xshell远程连接失败以及解决方案

《Xshell远程连接失败以及解决方案》本文介绍了在Windows11家庭版和CentOS系统中解决Xshell无法连接远程服务器问题的步骤,在Windows11家庭版中,需要通过设置添加SSH功能并... 目录一.问题描述二.原因分析及解决办法2.1添加ssh功能2.2 在Windows中开启ssh服务2

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

SpringBoot嵌套事务详解及失效解决方案

《SpringBoot嵌套事务详解及失效解决方案》在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性,然而,在SpringBoot中,如果嵌套事务的配置不当,可能会导致事务不生效的问题... 目录什么是嵌套事务?嵌套事务失效的原因核心问题:嵌套事务的解决方案方案一:将嵌套事务方法提取到独立类