比赛记录1 常规赛:PALM眼底彩照视盘探测与分割202105-202205全时段第一名(得分0.97123)方案

比赛记录1 常规赛:PALM眼底彩照视盘探测与分割202105-202205全时段第一名(得分0.97123)方案,第1张

这只是百度的aistudio平台的一个常规赛(可以一直刷榜的比赛,每月计算一次排名),虽然在整个时段是榜1,但只是一个普通的语义分割比赛,参数人数不过百。有意参赛刷榜的的朋友可以访问以下链接

常规赛:PALM眼底彩照视盘探测与分割 - 飞桨AI Studio (baidu.com)https://aistudio.baidu.com/aistudio/competition/detail/87/0/introduction

1、赛题说明

PALM眼底彩照视盘探测与分割

本赛题原型为ISBI2019PALM眼科大赛。 近视已成为全球公共卫生负担。在近视患者中,约35%为高度近视。近视导致眼轴长度的延长,可能引起视网膜和脉络膜的病理改变。随着近视屈光度的增加,高度近视将发展为病理性近视,其特点是病理改变的形成:(1)后极,包括镶嵌型眼底、后葡萄肿、视网膜脉络膜变性等;(2)视盘,包括乳头旁萎缩、倾斜等;(3)近视性黄斑,包括漆裂、福氏斑、CNV等。病理性近视对患者造成不可逆的视力损害。因此,早期诊断和定期随访非常重要。

先秀一波成绩截图,预计在很长的一段时间内很难有人超过这个成绩(因为参赛的人不多),欢迎大家去挑战

1.2 数据说明

ISBI2019 PALM眼科挑战赛赛题再现,提供800张眼底彩照训练数据集, 要求选手训练模型完成眼底视盘结构的探测和分割任务。绝大部分数据的尺寸为2124, 2056,赛题数据如下所示:

 2、方案

通过博主对paddleseg中所支持的模型库进行分析,发现HarDNet的性价比是最高的(从flop与miou的关系),因此选用HarDNet为基准模型。一开始博主在数据的分辨率设置上不够大胆,只选用了512x512,因此成绩一直无法突破0.966,在所有成绩的排名近为第5。后来,在观摩另一位大佬分享的一个目标检测比赛的方案后,在图像分辨率上设置的更加大胆了,最终达到了0.97123。

2.1 基本训练配置

数据集划分:8:2

学习率:0.0005

优化器:AdamW

学习率调度器:周期余弦式衰减

loss:[loss_CrossEntropyLoss,loss_LovaszSoftmaxLoss,loss_DiceLoss],loss_weights=[0.8,0.3,0.4]

2.2 基本涨点技巧

1、训练时random size

size_list=[x+shape[0] for x in range(int(-shape[0]/2),int(shape[0]*0.5),16)]+shape+shape    可以参考以下链接进行实现python工具方法27 训练时在线random resize的实现(支持图像分类与语义分割)_万里鹏程转瞬至的博客-CSDN博客在训练过程中动态调整数据的尺寸可以增强模型对不同size尺寸物体的适应能力,是提升模型泛化能力的一种手段。如在paddledection套件中,就提供了参数设置多种size组合;此外,博主在拜读SegFormer模型论文时,作者也提到了使用0.5-2.0的倍率对训练数据进行缩放(作者 *** 作还包含随机水平翻转和随机裁剪)。为此对该 *** 作进行实现,对于图像的resize均使用PIL.Image实现与ai框架无任何关联,paddle、pytorch、tensorflwo都可以使用https://blog.csdn.net/a486259/article/details/123719284

2、为模型添加dropout与dropblock

HarDNet是不包含dropout的,但是模型在训练过程中存在过拟合,为了提升性能博主基于hook为模型添加了drop *** 作,并且将dorp.p逐步增大(当达到预期值是停止增加)。可以参考以下链接进行实现paddlepaddle 22 基于hook实现既插既用的dropout_万里鹏程转瞬至的博客-CSDN博客1、paddle中支持的hook通过对paddle中api的查询,发现paddle的layer对象只在前向传播中支持两种hook,pre_hook和post_hook。pre_hook可以对层的输入变量进行处理,用函数的返回值作为新的变量参与层的计算。post_hook则可以对层的输出变量进行处理,将层的输出进行进一步处理后,用函数的返回值作为层计算的输出。paddle的tensor对象只支持反向传播hook,可以用于获取梯度值或返回新的梯度值。1.1layer中forward_pre_hook的.https://blog.csdn.net/a486259/article/details/123965321

3、使用cutmix进行数据增强 

cutmix是一种基于数据混合的数据增强方式,虽然博主使用的是动态图进行训练,但是为了保证代码风格的一致性, 博主是在image load时实现混合增强,具体实现方式可以参考python工具方法 26 应用于图像分类的mixup与cutmix数据混合增强方式实现_万里鹏程转瞬至的博客-CSDN博客_cutmix1、数据增强方式介绍数据增强方式在方法上可以分为仿射变换、色彩变化、混合增强。仿射变换是指对图像进行缩放、旋转、平移和镜像等;色彩变化是指调节图像的明度、亮度和饱和度等(此外还可以使用各种滤波器对图像进行模糊、增强等 *** 作);混合增强是指多图融合的增强手段,如mixup、cutmix等(此外还有cutup(又称random erasing))。这写增强方式也可以分为同类增强和混合增强,同类增强是通过对一张图像进行变化,从而达到增强的目的;而混合增强是指对多张图像进行融合,其返回的标签独热码也按照相应的https://blog.csdn.net/a486259/article/details/123580142

4、逐步增强的数据增强方式

博主认为在训练模型时,不能一下子把数据增强方式设置的太复杂,但在测试模型时使用复杂的数据增强方式训练出的模型又会因为数据分布不一致,导致测序性能下降。因此采用了易->难->易的数据增强方式,通常是在易的阶段生成高精度的模型。博主设置的数据增强模型一共有以下几种

easy:只使用随机翻转

random_size:easy + RandomSizedCrop

random_mask:easy + CoarseDropout

norm:easy+ ShiftScaleRotate + ColorJitter

mix_mode: cutmix方式或者none

这里需要注意的是,只有在easy阶段下训练出的模型,泛化能力最强。具体可见下图

5、保存多个最优模型

在测试时不能仅选用最佳指标模型进行测试,这样子结果会具备一定偶然性,需要结合loss、acc、iou等指标进行遴选。最后剩下的模型要经过测试才能选择出最终的模型取生成结果。

6、多尺度预测试(非数据融合)

因为在训练时,保存的模型比较多,且使用了random size策略,那么测试时就无法了解哪个模型在那个尺度下性能最优,因此使用测试集进行两种数据增强模式(easy模式:水平、垂直翻转,test:无任何数据增强)下的多尺度测试,综合评估选出性能最优的模型和尺度。

然后根据最优模型和2~3个最优尺度,提交3组测试结果,并记录下最优尺度

7、多分辨率迭代(逐步增大分辨率)

一开始使用512做训练,然后在步骤6中得出最优模型和尺寸,进行迭代训练。博主的迭代训练记录如下所示,一共经理了4个阶段的训练,在第4阶段时模型性能下降。然后,博主又使用了第三阶段的模型,在更多的尺度下进行测试,发现性能还能有所提升。最佳成绩为Stage5所提交的0.97123

Stage1 train on 512 random size  lr->0.0005
512->96.14(null-7) 512(dp0.5-t17)->96.04(null-18) 576->96.31(null-6)  576(dp0.1-t17)->96.35(null-?)  640->96.46(null-2)   736->96.47(null-3)  800->96.42(null-0)
#load_weight = paddle.load("mymodel/n5_PALM_HarDNet_ep315_0.0254_0.9575.pdparams"); 

Stage2 train on 736 random size lr->0.0003
800->97.05(null-10)  800(dp0.1-t17)->96.66(null-16)  800(dp0.1-t17)->96.39(null-16)
#load_weight = paddle.load("mymodel/n5_PALM_HarDNet_ep55_0.0255_0.9559.pdparams"); 

Stage3 train on 800 random size lr->0.0003
960->97.06(null-13) 864->97.08(null-13)*** 864(dp0.1-t17)->96.99(null-15)
#load_weight = paddle.load("mymodel/n5_PALM_HarDNet_ep55_0.0250_0.9554.pdparams"); 

Stage4 train on 864 random size lr->0.0002
960->97.01(null-15) 864->97.01(null-14)
#load_weight = paddle.load("mymodel/n5_PALM_HarDNet_ep35_0.0227_0.9607.pdparams"); 


Stage5 使用Stage3的模型
800->0.97054(null-12) 896(dp0.1-t17)->96.94(null-15)   896->97.04(null-13)   832->97.13(null-13)
load_weight = paddle.load("mymodel/n5_PALM_HarDNet_ep55_0.0250_0.9554.pdparams"); 
 2.3 在该比赛中无效的技巧

1、MCdropout   paddlepaddle 9 MC Dropout的使用_万里鹏程转瞬至的博客-CSDN博客_paddle清空显存MC Dropout是指蒙特卡罗Dropout,其可以在不改就网络结构与增加训练的情况下在测试阶段提升模型的性能,本质就是在测试时将dropout一直处于激活阶段。对网络进行多次前向传播,由于dropout每一次激活的神经元都不同,使得每次的结果都会不一样。将多次输出的结果取平均值,可以在一定程度上提升算法的准确性,但是会降低算法的推理速度。在paddlepaddle中dropout中参数列表如下所示:paddle.nn.Dropout(p=0.5,axis=None,mode="upscale_...https://blog.csdn.net/a486259/article/details/122832254

2、TTA

paddlepaddle 8 Image Test Time Augmentation(图像数据测试时增强)_万里鹏程转瞬至的博客-CSDN博客在训练时可以通过数据增强来提升模型的泛化能力,那么在测试时也可以通过测试时增强来提升其精度(牺牲一定的速度),这种 *** 作在比赛中是常见的。图像增强的方法有仿射变化(平移、缩放旋转,镜像等)和色彩变化(对比度、亮度、饱和度、色调、噪声)等,通过对测试数据进行图像增强,然后对多个运算结果进行软投票(按概率值累加)或硬投票(按照argmax分类结果累加),可以在一定程度上提示模型的性能。下面推荐一款应用于paddle框架的TTA框架,GitHub - AgentMaker/PaTTA: A test times .https://blog.csdn.net/a486259/article/details/1227768033、EMA

虽然是在一定的预热阶段后再启用EMA,但是在使用EMA后,模型变得难收敛了。然后博主使用的技巧5:保存多个最优模型,在一定程度上替代了EMA

paddlepaddle 20 指数移动平均(ExponentialMovingAverage,EMA)的实现与使用(支持静态图与动态图)_万里鹏程转瞬至的博客-CSDN博客指数移动平均(ExponentialMovingAverage,EMA)是以指数式递减加权的移动平均,每一次更新都对上一次保留的权重按照decay进行衰减。其计算方式为pram_n''=(pram_n''-1)*decay+(1-decay)*pram_n,其中pram_n''为EMA保存的在n步时的权重,pram_n为算法正常计算得出的权重。EMA是一个不断迭代的运算方式,在第n步时,第k次更新参数被衰减了decay^(n-k)倍。EMA本质就是一种学习率衰减的策略,具体可见博客(https://wwwhttps://blog.csdn.net/a486259/article/details/123830454

此外还有一些多模型融合方案,博主并没有测试。比较已经是全时段的榜首了,好端端的为什么要去做卷王

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/916061.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存