图像分类比赛

目录

1 前言

nnUNet的出现,一棒子打死了近年来所有的新的网络结构。作者认为网络结构上的改进并没有什么用,应该更多的关注结构以外的部分,比如预处理、训练和推理策略、后处理等部分。

目前为止nnUNet的代码已经被很多地方使用并且证明了它的效果,这不禁引起我们的深思,确实网络结构在这么多年来的所谓的创新,是不是真的都只是过拟合,都是论文作者的一厢情愿。

在没有充分的理论支撑的情况下,越是复杂的东西,就越容易过拟合,不是没有道理的。在深度学习领域的钻研方向问题上,学术界是不是走了很多弯路?更多的精力放在理解数据上,可能更能得到质的提升。

比赛官网:脑PET图像分析和疾病预测挑战赛

2 算法名称

EfficientNet of auto-adapted feature selection
(基于EfficientNet的自适应特征选择算法)

3 创新点

(1)自适应裁剪填充
(2)迭代微调交叉验证
(3)基于这两个baseline进行改进,原baseline只有0.76左右。参考1 参考2

4 算法描述

4.1 算法思想

本算法是一种以迁移学习为主要思想,结合交叉验证、自适应裁剪以及数据增强的方式,对样本进行分类。算法流程大致如下所示:首先对数据集中图像进行自适应裁剪;将处理后的图像通过一系列数据增强策略提高泛化型;将增强后的数据输入预训练模型”EfficientNetb8”进行分类;最后通过迭代交叉验证策略加速模型收敛以及提高样本精度。
本算法主要分为以下5大技术点,

4.1.1对数据进行裁剪处理

对训练集样本图片和测试集样本图片统一进行自适应裁剪,具体算法思想是,由于训练集中的大脑外壳与图片的边界存在一段真空区域,这部分区域其实是无效区域,如果再进行后续的随机旋转翻转会进一步缩小ROI 的区域,也就是实际有效样本的区域,基于以上情况,本步骤的处理是尽可能针对不同尺度的大脑进行自适应裁剪边界,使得处理后的图片能尽可能贴合大脑外壳,从而增大其ROI的区域。
具体步骤如下:
1)通过遍历像素值获取各个位置的像素点
2)将设置既定像素阈值筛选出阈值之上的像素值的索引坐标
3)根据这些索引坐标进行二次筛选,选出坐标值中横纵坐标位置最大最小值,以这些坐标值来界定大脑极限边界位置;
4)对于获取的最大最小的横纵坐标值加入自适应边界系数,该系数加入的评判条件是对于最大的坐标值进行自适应扩增,对于坐标值进行自适应缩减,然后扩增或缩减后的尺度需要在原来未裁剪前的尺度范围内,否则自适应系数为0。
5)由于神经网络对样本的都会进行resize操作,因此,对于裁剪完成后的样本其尺度都不一样的情况,本步骤算法以该样本的长边为基准对短边方向进行填充扩增,确保每张图片都是以正方形的形式,这样的好处是在进行神经网络数据增强部分时候,可以一直保持着原有的长宽比,不会引发形变。裁剪效果如下图所示(示例图来自训练集AD中的1.png):
在这里插入图片描述
上图中a是原始图片,b是自适应裁剪后的图片,c是在b的基础上自适应填充后的图片。

4.1.2 数据增强

对于数据增强策略上的选择,通过观察可以发现,测试集中的样本具有5种变化特性,一是随机中心旋转,二是随机亮度变化,有些样本很暗,有些样本很白;三是尺度不一样,有些样本很大,有些样本比较小;因此,为增强模型泛化能力,本步骤中将在测试集和验证集统一加入如下策略:
1)随机中心旋转从-180度到180度;并以边界填充的方式进行缩放尺度;
2)随机仿射变换
3)色泽扰动,亮度随机变换幅度为0到0.5;对比度是从0到0.5;饱和度是从0到0.5,在这三种条件中进行随机变换

4.1.3 标签平滑

对于常规的独热标签,为了防止出现局部最优的现象,本步骤中对样本生成的独热编码进行平滑,增大分类的泛化能力,具体步骤如下:
1)获取标签个数
2)根据标签个数和类别个数生成平滑单位矩阵,里面的值以既定平滑系数/(类别数-1)
3)标签数值平滑,即对数值为1的位置项该值减去平滑系数,其余项加上平滑系数的倒数,生成符合原标签数值分布的标签系数矩阵
4)然后对原标签矩阵进行对数交叉熵映射,然后对映射后的结果乘以平滑后的标签系数矩阵生成最终的标签矩阵。

4.1.4 迭代交叉验证

创新点之一,由于传统的10折交叉验证会生成10个模型,本算法为了提高效率,在交叉验证中,进行了改进,具体做法是,在整个交叉验证过程中,只保存一个最好的模型,并从第i折起,加载前面保存好的最好的模型的参数进行迭代微调,最后也只得到唯一一个模型,省去了传统交叉验证的最后还要进行复杂的模型选择的步骤,从而在保障能够尽可能跳出局部最优的同时也可以得出最优模型。

4.1.5 迁移学习

本步骤中通过结合预训练完成的模型efficientNetb8以及交叉验证的方式进行finetune迭代,加速训练的速度;

4.2 流程图

在这里插入图片描述

5 算法实现

5.1 参数设置

5.1.1 数据裁剪部分

自适应系数α=10

5.1.2 数据增强部分

Resize=224;
随机旋转角度(-180≤rotates≤180)
随机仿射变换角度=10
色泽扰动部分:
亮度:0-0.5;
对比度:0-0.5
饱和度:0-0.5
色相:0

5.1.3 网络训练部分

Batchsize=10
n_split=20	(20折交迭代叉验证)
drop_last=True
shuffle=True
optimizer:SGD
scheduler: StepLR
	step_size=4
	gamma=0.5
epoch=30
init_learning_rate=0.01

5.2 实现平台

系统:Ubuntu18/Win10
硬件配置:NVIDIA 2080Ti 显存15G
语言框架:pytorch;torch1.2.0; torchvision0.4.0,tensorboard==2.0

6 结果和分析

实验结果如图2所示,x轴表示折数,y轴表示loss数,曲线表示在本算法中经过20折的迭代过程后,loss的下降情况,由图2可知在第10折的时候,曲线开始趋向平滑趋势,到16折的时候,基本已经趋向稳定不变的状态,最终loss值是0.4039;如图3所示,x轴为折数,y轴为accuracy数,曲线表示在20折迭代下,取出每折最后一次的准确率值,进行准确率统计,其中在第4折时候是曲线的转折点,浅色线是没经过tensorboard可视化平滑参数处理的情况,经过平滑参数降噪后,在10折的时候已经到达最优准确率100%。
在这里插入图片描述

图2 loss变化曲线
在这里插入图片描述
图3 accuracy变化曲线

结果提交记录,经过不断微调,最终得到0.97352分,排名复赛榜前五。
在这里插入图片描述

图4 提交记录

7总结

一句话总结此次比赛:一个好的预处理,能让你赢在起跑线!

8 后继提升

目前,我们在整个比赛过程中都只使用了单模型,在排行榜中前三的队伍基本上都使用了多模型融合,第一名使用了7个模型只比我们分数(0.97352)高出1.5%左右(第一名分数0.98785),可见,我们的单模型已经是比较top的了。所以,如果想进一步提高,可以考虑多模型融合策略来继续提升。

9 源码

脑PET

10 核心成员

洋哥 莹姐 增哥 钦哥 小弟

Logo

助力合肥开发者学习交流的技术社区,不定期举办线上线下活动,欢迎大家的加入

更多推荐