天池2019县域农业大脑AI挑战赛总结

赛题数据简介:数据来源是无人机拍摄的某区域的农作物影像,格式是RGBA四通道图像,大小在三万像素左右,要求设计算法区分其中的三种农作物:烤烟”,“玉米”,“薏仁米”。初赛和复赛的任务一致,但由于初赛的数据拍摄的时间段农作物都尚未成熟,所以特征不够明显,最后的大家的IOU都很低,而且和复赛数据分布差异特别大,这里就不过多分析初赛的数据了。复赛数据训练集四张两万像素的图,测试集是两张三万像素的图像。接下来就按照当时的思路介绍具体的过程。
1.数据制作。
(a)验证集划分:划分稳定的验证集是做数据竞赛很重要的一步。但是这个竞赛比较特殊,我们尝试了多种划分数据的方式,但是都不能反映线上的得分。原因主要有两个,第一个是数据分布的问题,测试集各个类的占比和训练数据有较大的差异,第二个是测试集数据很大,数据量和训练集其实差不多,如果从训练集划分子集则很难反映测试。这种情况下其实可以不设本地的验证集,使用early stop的方式训练数据,但是epoch不好设计。为了不让训练过拟合,我们还是保留本地的验证集。划分的方式是对于每张图的数据9:1随机划分,最后使用是通过看验证集不再上升n个epoch则结束训练。
(b)数据分割:为了权衡batchsize和感受野之间的矛盾,我们将数据分割成了512x512,切割的方式是滑窗切割,步长512。为了充分利用数据集,我们加入了不同尺度的图像,随机从原图中crop了768-1024的图像,并resize成512,加入到训练数据,将训练数据扩充了一倍。这么做有两个原因,一个是观察到无人机拍摄的数据本身就存在有这种多个尺度的现象,因为无人机拍摄不可能保持一个高度;第二个原因是针对数据标注不够精细,放弃了一定的图像细节,获取更大的感受野的数据也是有用的。这种数据扩增的方式提了1.5个iou。
(c)数据增强:使用的是上下左右的filp、随机旋转0-30度、shift10个像素这些操作的组合,没有单独验证过数据增强的效果。
2.模型选择。
(a)unet:最开始用的是我自己实现的以senet为编码器的unet结构,可是训练一直不稳定,当时以为是unet结构不适合这个比赛,哭liao。。。所以中间队友就换了deeplabv3+结构,训练完发现确实比我写的那个unet稳定的多,不加任何训练的trick,分数只能到IOU0.74左右,而且由于deeplabv3+的玄学解码结构(论文中经过试验只融合最后一层特征的结果最好),让我们感觉无从优化这个模型,而且从各大分割比赛的结果来看,unet对小数据集的拟合应该是优于deeplabv3+的,所以我们又重新找了一个稳定的unet实现。能到0.753左右。此后一周没再提过分数,一直在玄学调参,尝试了各种魔改的unet结构,比如se编解码,super column,深监督,attention等等,甚至觉得一定会有效的aspp加在unet的中心层都会掉分。此时最终的模型是res34为编码器,双线性插值+3x3卷积为解码器的最原始结构。于是开始思考原因。。。
(b)训练观察:由于中间尝试过训练的epoch代数对最后结果的影响以及看到snapshot ensemble这种训练策略,于是对早期训练的结果直接预测看效果,发现第一类在早期时已经收敛了,在测试集上表现很好,但是再往后训练,就会在训练集变现出过拟合。而且第一类数据在测试集上占比比较大,对最终分数影响很大。分析这种情况出现的原因是第一类的特征明显但是数据量小,很容易在大模型的表现出过拟合。于是我们挑选了多个epoch代数,做了ensemble,但是这种方式测试时间一下增了好多倍,之前40分钟预测完毕,用了snapshot ensemble可能需要5个小时,而且选定的epoch代数有很大的不稳定性。
(c)swa+cos:其实在分析到第一类表现出过拟合之前,我们已经使用了swa策略,当时用的是在认为快到最优epoch代数的附近开始对模型权重进行滑动平均,最后分数并没有多大提升。对我们启发比较大的是看到了师兄组会上讲的这篇论文:https://openreview.net/forum?id=rkgKBhA5Y7。其中分析到了在优化神经网络时出现了loss不下降,但是网络输出的存在多样性的现象,这种现象可以使用cos+swa在多个cos训练过程中滑动平均模型更容易找到优质解。我觉得这和我们的训练情况很相似,于是我们调整了训练策略,使用更快频率的cos迭代周期,以及更早的时刻对模型进行滑动平均。我们最后在训练的第5个epoch就开始滑动平均模型,只到最后的20epoch。这种训练数据的方式得到的结果对第一类的分割结果有了很大的提升,单使用res34为编码器,双线性插值+3x3卷积的unet结构可以到0.758的分数,而且训练出的结果稳定。这种训练的trick可以使魔改的模型有效果,随后我们加上了aspp并且换了更大的backbone,最后在a榜上到了0.782的成绩,排名11。但是试到这里我们已经没有时间了,只能等待b榜开了。感觉还是比较遗憾的。主要还是第一次参赛自己还是比较菜,看问题看的不清楚。。。
(d)模型集成:由于检测建筑物的问题,我们认为和检测农作物的差异比较大,所以我们用unet对建筑物单独训练了一个模型。观察到建筑物的标注更加不精细的现象,我们选用了更大尺度的数据,损失了更多的图像细节。我们分别对原图分别作了0.1,0.25,0.5,0.75的下采样操作,然后裁剪512*512的图像。除此之外,观察到建筑物的模型边缘效应比较明显(好吧,边缘效应是我自己起的名,不知道该怎么描述这种情况O(∩_∩)O,就是遇到像素梯度比较大的地方,网络很容易预测成建筑,因为建筑物的纹理和周围形成鲜明对比),所以我们做了裁剪边缘的操作,只对中心像素的loss做回传,对于建筑物模型的训练有比较大帮助。
(e)其他的小策略:测试时多尺度测试绝对是分割的大杀器,这种操作可以提升1-1.5个iou分数。除此之外,tta也可以一定程度提升分数。在将小图拼接回大图的过程中,可以使用重叠切割的方式,避免边缘效应,这个操作最早出现应该是在unet论文中。
3.总结
比赛最后在b榜第10,感觉还是稍有遗憾。这一个多月来,从一个没搞过分割的小白,学到了好多,同时也体会到团队力量的伟大,感谢各位队友的给力支持。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值