本项目为Datawhale Ai夏令营第三期cv赛题的个人理解与部分解析。
首先感谢DataWhale提供的学习机会,为其开源精神点赞,希望大家共同进步!
赛题链接如下:脑PET图像分析和疾病预测挑战赛
1.赛题介绍
赛题背景
脑PET全称为脑部正电子发射计算机断层显像(brain positron emission tomography PET),是反映脑部病变的基因、分子、代谢及功能状态的显像。它是利用正电子核素标记葡萄糖等人体代谢物作为显像剂,通过病灶对显像剂的摄取来反映其代谢变化,从而为临床提供疾病的生物代谢信息,为脑癫痫病、脑肿瘤、帕金森病、阿尔茨海默综合征等提供了有效的检测手段。可利用脑PET图像检测出轻度认知障碍病灶,并提前介入治疗,从而延缓发病,对后续患者康复治疗有着积极的意义。因此本赛题以轻度认知障碍为例对脑PET图像进行分析与疾病预测。
赛题任务
为研究基于脑PET图像的疾病预测,本次大赛提供了海量脑PET数据集作为脑PET图像检测数据库的训练样本,参赛者需根据提供的样本构建模型,对轻度认知障碍进行分析和预测。
脑PET图像检测数据库,记录了老年人受试志愿者的脑PET影像资料,其中包括确诊为轻度认知障碍(MCI)患者的脑部影像数据和健康人(NC)的脑部影像数据。
被试者按医学诊断分为两类:
NC:健康
MCI:轻度认知障碍
数据说明
本次大赛所用脑PET图像检测数据库,图像格式为nii。
评估指标
本次竞赛的评价标准采用F1_score,分数越高,效果越好。
2.解析比赛数据集
笔者有话说:对于接触一个比赛,大家往往将时间花在调参上面,调参固然重要,甚至我们所有人都是从“调参侠”走来的,但往往一个比赛,光会调参是远远不够的,还需要学会更多的打榜技巧,现分享一篇笔者常常拜读的文章,虽然是目标检测,却殊途同归,来自前人的经验之谈,这或许能带给大家更多的启发。
好了,言归正传,回到我们的赛题上来。
nii文件
nii 文件是医学图像处理中经常使用的一种 NIFTI 格式图像,在此就不做太多解释,想要了解的小伙伴们详见:
2.1分析图像尺寸
可以看到数据集和测试集多达12种尺寸和对应的尺寸数据。
注:数据集中的 nii 文件包含四维数据:其中前三维确定某一个像素点的空间位置(大家可以把这个想象成一个长方体),第四维记录了该点的状态值(灰度)。
2.2脏数据
对于下列项目的数据集,它对上文的nii图像做了切片操作,举个例子(168,168,82,1)被切成了82个168*168的灰度图像(jpg格式),以此类推。
项目:基于PaddleClas套件的脑PET图像分析和疾病预测挑战赛-baseline
但存在大量的脏数据(包括部分项目对nii图像进行随机50个切片),如下对比
正常数据(左1)与脏数据(左二、左三)对比:
需要人为进行筛选,或者写个脚本进行像素点筛查也是可以的,这会对结果提升有一定帮助
3.一些尝试、猜测
笔者针对该比赛进行了一些尝试,虽然没有较好的提高比赛成绩,但仍有一些想法想分享给大家
3.1 Resnet3D
可参见项目:基于ResNet3D的尝试-脑pet图像分析 - 飞桨AI Studio
介绍一下,
通常做图像分类使用的ResNet网络的卷积核一般只是在2D图像上做滑动窗口,计算特征图,卷积核的形状一般为[out_channel, in_channel, W, H]。而在视频分类任务中一般对网络输入的是视频中的一段序列,比如16帧或32帧,这样在原有WH维度上又增加了一个时间T的维度,卷积核的形状为 [out_channel, in_channel, T, W, H]。这时,卷积核不止在2D平面上滑动,还需要在第三个维度T上移动,提取帧之间的关联特征。这样就需要对2D的ResNet进行改造,将其改造为3D的ResNet网络。ResNet3D保持原有的ResNet的整体架构不变,替换每个block中的basicblock或bottleneckblock中的卷积核为Conv3D,同时池化层也需要替换为3D池化。
由于Resnet3D已有在医学图像影像组学分析的先例,笔者故采取了尝试,采用了MedicalNet训练好的权重与3D类的一些数据增强手段等。
整体项目示意如下:
下面是笔者的训练与评估情况,发现训练效果并不是太好,最后对测试集的测试也全为NC
需要注意的是,由于本比赛训练和验证共50个(25个NC与25个MCI),为小样本数据集,仅需在预训练权重基础上进行微调,故笔者采取了较低的学习率;
此外,小样本数据集不需要过于复杂的网络,故本次测试采取了resnet18。
对于上述结果,笔者认为是由于数据集过小而导致的(训练集40个,验证集10个)。
思路
影像组学,常见的套路对影像图像的病灶进行勾画,制作mask文件。通过特征软件或者pyradiomics库对原始数据文件结合mask的范围,提取几百到几千不等的特征。然后通过统计学对特征进行筛选,然后通过机器学习对筛选后的进行建模,进行分类或者生存预测等任务。
每个原始数据都带有一个对应的mask数据。在输入3D分类模型前,为了让模型更好对病灶区域进行特征提取。根据mask文件对病灶区域进行裁剪,首先根据mask的范围对3D数据三个维度上进行裁剪。然后对裁剪后的数据非前景的区域用0进行填充(这是对磁共振数据的处理,假如是CT数据应该设置窗宽窗位,然后缩放到0~255,再对背景填充0),这样得到的数据只有前景的信息。
这项措施个人认为能较好的提升最后的结果,当然你首先需要是一位专业人员,才能对此进行标注,详见此链接1.4部分,这是来自夏令营其他小伙伴的分享链接:Docs
当然,笔者也是站在了巨人的肩膀上,如果有兴趣尝试resnet3D的小伙伴可以参考以下两项目:
1.ResNet3D论文解读与复现 - 飞桨AI Studio
2.使用ResNet3D加载医学图像预训练权重进行影像组学分析 - 飞桨AI Studio
3.2 CNN 2D
可参见项目:基于PaddleX的尝试-脑pet图像分析 - 飞桨AI Studio
由于笔者在Datawhale夏令营二期cv赛题采用的resnet50_vd_ssld取得了相对不错的结果,故一开始对采用了此模型,训练结果如下
这个训练结果看起来是相当不错的,(训练acc1与评估acc1都接近于1)但测试效果却不佳,约为0.6,笔者一开始认为是过拟合了,于是降低了轮数为10轮,测试效果仍不佳。但至少测试集的NC和MCI的分布相对比较均匀(对标全NC的0.74)
笔者对测试集的数据进行了查看,发现15个已知label的图像对了14个(后续嘉诺大佬会进行分享),可见模型训练效果还是可以的,测试效果不好的话,个人猜测一部分原因是训练集与测试集图像存在一定差距,还有一部分原因来自于比赛的F1-score上面。
测试集的结果是由测试集的nii图像切片产生的图像进行预测而投票产生的,笔者先后尝试了对高置信度的预测结果进行保留而后进行投票;对不同置信度的预测结果进行加权计算而后投票,测试与原结果差距较小,100个中约有1-2个不同,大家可以进行尝试。
4.一些想法
这些都是笔者认为可能有用但未尝试的思路,现分享给大家。
4.1F1-score的思考与测试集分布
4.1.1
在分类模型中,我们经常会遇到两类问题:
第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。
第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,我们可以选择balanced,让类库自动提高非法用户样本的权重。
在这项分类比赛中,F1-score的计算恰恰满足了上述第一种分类模型,不同的是,我们将合法用户(NC)预测为非法用户(MCI)代价很高,我们宁愿将非法用户全分类为合法用户(全NC 0.74的情况),可见训练权重需要偏向NC。
4.1.2
相信很多人都发现了,0.74214的全NC数据,根据F1-score公式推断,可以得出测试集有59个NC,有41个MCI,大家可以在训练时偏向NC给予权重。
4.1.3
类型权重参数: class_weight
class_weight参数用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重,比如对于0,1的二元模型,我们可以定义class_weight={0:0.1, 1:0.9},这样类型0的权重为10%,而类型1的权重为90%。大家可自行查阅资料.
4.2 站在前人的肩膀上
如下链接:科大讯飞2020脑PET图像分析和疾病预测---单模型进决赛前五_脑pet图像分析和疾病预测挑战赛_Li.JJ的博客-CSDN博客
我们ai学习可以站在他人的肩膀上,前辈们给出了一些策略供大家尝试
其中的(1)自适应裁剪填充
(2)迭代微调交叉验证
等一系列策略是非常优秀的思路,大家可以加以尝试。
最后的话
笔者水平有限,若存在不足之处,还请多多见谅。
ai学习需要多看多学多试,前人的思路值得大家学习尝试,须知不可闭门造车。
最后仍感谢DataWhale提供的学习机会,望大家共同进步!