2019 天池县域农业大脑AI挑战赛_冠军_方案分享


暑假时心血来潮,想找个比赛试水。比赛过程的体验,和在实验室跑实验蛮大区别。学习到了很多trick,每天的“摸奖”也很刺激,认识了很多大神。比赛的时间线也很长,即使是新手也有足够的时间去学习。最终比赛成绩是 1/1520,关于比赛的代码将分享在 github

0 队伍介绍

mrshi12321 : 施江玮 杭州电子科技大学 研二

大黄有故事 : 黄钦建 华南理工大学 研二

now more : 林宏辉 华南理工大学 研一

1. 赛题说明

1.1 赛题任务

通过无人机航拍的地面影像,探索像素级农作物分类的算法,具体的分类目标为薏仁米、玉米、烤烟、人造建筑(复赛新增),其余所有位置归为背景类。

1.2 赛题数据

初赛复赛提供的数据是同一片区域的航拍影像。其中初赛提供数据为农作物生长的早期(大多没长出来),分割难度较大。复赛数据农作物长势良好,并在初赛赛题基础上增加了一类“建筑”。

提供的label为与原始图像1:1大小的单通道图像,像素的大小对应不同的标注类别。其中“烤烟”像素值为1,“玉米”像素值为2,“薏仁米”像素值为3,“人造建筑”像素值为4,背景类像素值为0


上图为复赛训练集数据可视化,其中蓝色区域为烤烟,绿色为玉米,红色为薏仁米,黑色为建筑,其它归为白色。虽然图像分辨率大,但mask无效的区域面积也较大,类别不平衡问题也很突出,背景类占比远高于其它类别。


1.3 评估指标

赛题的评估指标为mIoU,榜上排名分数为所有计算所有类别IoU后取平均的结果。

2 基本方案

2.1 数据切割

切割时主要从三个方面考量:

  • 速度 : 遥感影像分割大多推荐使用使用gdal库,但据说安装蛮坑。我们直接多进程加速,patch为1024时,单张图5~6min可以切完。
  • patch大小 : patch 大小我们也没有实验出哪个效果更好,最后是1024和512两种切割方式都做了,并用来分别训练不同的模型,提高模型的差异度,有利于模型投票。
  • 类别平衡:过滤掉mask无效占比大于7/8的区域,在背景类别比例小与1/3时减小滑窗步长,增大采样率。

最终采取的切割策略如下:

  • 策略一:以1024x1024的窗口大小,步长900滑窗,当窗口中mask无效区域比例大于7/8则跳过,当滑动窗口中背景类比例小于1/3时,增加采样率,减小步长为512;
  • 策略二:以1024x1024的窗口大小,步长512滑窗,当滑动窗口中无效mask比例大于1/3则跳过。

2.2 模型选择

模型上我们队伍没有做很多的尝试,初赛复赛都是基于DeeplabV3plus(决赛5个队伍里有3个用了DeeplabV3plus),backbone为Xception-65和ResNet-101以及DenseNet-121,从 A榜分数看,不加任何trick时,DenseNet分数略高于另外两个,但是显存占用太大以及训练时间太长,在后来的方案里就舍弃了。决赛复现时,使用了两个Xception-65和一个ResNet-101投票,投票每个模型用不同的数据训练,增加模型差异。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mX0IaQYQ-1571396975974)(C:\Users\now more\Desktop\Project\tianchi_2019\素材\DeeplabV3plus.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-03ZVlgXV-1571396975975)(C:\Users\now more\Desktop\Project\tianchi_2019\素材\投票.png)]

3 涨分点 & 改进

3.1 膨胀预测

方格效应:如果直接做不重叠滑窗预测拼接,得到的预测结果拼接痕迹明显。

原因分析:网络卷积计算时,为了维持分辨率进行了大量zero-padding,导致网络对边缘预测不准。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EmB31LJD-1571397043033)(C:\Users\now more\Desktop\Project\tianchi_2019\素材\方格效应.png)]


膨胀预测:预测时,只保留预测结果的中心区域,舍弃预测不准的边缘。

具体实现

  1. 填充右下边界至滑窗预测窗口大小的整数倍(方便切割);
  2. 填充1/2滑窗步长大小的外边框(考虑边缘数据的膨胀预测);
  3. 以1024x1024为滑窗,512为步长,每次预测只保留滑窗中心512x512的预测结果(可以调整更大的步长,或保留更大的中心区域,提高效率)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1M2a3yO3-1571397043034)(C:\Users\now more\Desktop\Project\tianchi_2019\素材\膨胀预测.png)]


3.2 测试增强

测试时,通过对图像水平翻转,垂直翻转,水平垂直翻转等多次预测,再对预测结果取平均可以提高精度,但相对的,推理时间也会大幅度升高。

with torch.no_grad():
    for (image,pos_list) in tqdm(dataloader):
        # forward --> predict
        image = image.cuda(device) # 复制image到model所在device上
        predict_1 = model(image)
        
        # 水平翻转
        predict_2 = model(torch.flip(image,[-1]))
        predict_2 = torch.flip(predict_2,[-1])
        # 垂直翻转
        predict_3 = model(torch.flip(image,[-2]))
        predict_3 = torch.flip(predict_3,[-2])
        # 水平垂直翻转
        predict_4 = model(torch.flip(image,[-1,-2]))
        predict_4 = torch.flip(predict_4,[-1,-2])
        
        predict_list = predict_1 + predict_2 + predict_3 + predict_4   
        predict_list = torch.argmax(predict_list.cpu(),1).byte().numpy() # n x h x w

3.3 snapshot ensemble

snapshot ensemble 是一个简单通用的提分trick,通过余弦周期退火的学习率调整策略,保存多个收敛到局部最小值的模型,通过模型自融合提升模型效果。详细的实验和实现可以看黄高老师ICLR 2017的这篇论文


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m6W1pZdQ-1571397043035)(C:\Users\now more\Desktop\Project\tianchi_2019\素材\snapshot.png)]


snapshot ensemble 另一个作用是作新方案的验证。深度学习训练的结果具有一定的随机性,在做新改进方案验证时,有时难以确定线上分数的小幅度提升是来自于随机性,还是改进方案really work。在比赛提交次数有限的情况下,snapshot ensemble 不失为一个稳定新方案验证的方法

3.4 后处理

后处理问题上我们队伍只做了最简单的填充孔洞和去除小连通域。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AQ45LiUL-1571397043036)(C:\Users\now more\Desktop\Project\tianchi_2019\素材\后处理.png)]

3.5 标签平滑

标签平滑想法参考了Hinton大神关于的知识蒸馏When does label smoothing help?的工作,标签平滑训练的模型更加稳定和泛化能力更强。

在知识蒸馏中,用teacher模型输出的soft target训练的student模型,比直接用硬标签(onehot-label)训练的模型具有更强的泛化能力。我对这部分提升理解是:软标签更加合理反映样本的真实分布情况,硬标签只有全概率和0概率,太过绝对。知识蒸馏时teacher模型实现了easy sample 和 hard sample 的“分拣”(标签平滑),对hard sample输出较低的置信度,对easy sample 输出较高的置信度,使得student模型学到了更加丰富的信息。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Co1DEvOv-1571397043037)(C:\Users\now more\Desktop\Project\tianchi_2019\素材\smoothing.png)]

上图截取自When does label smoothing help? ,第一行至第四行分别为CIFAR10、CIFAR100、ImageNet(Course)、ImageNet(fine) 的数据集上训练的网络倒数第二层输出可视化,其中第一列为硬标签训练的训练集可视化,第二列为硬标签训练的测试集可视化,第三列为软标签训练的训练集可视化,第四列为软标签训练的测试集可视化,可以看出软标签训练的模型类内更加凝聚,更加可分。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jx15kXf7-1571397043042)(C:\Users\now more\Desktop\Project\tianchi_2019\素材\hard sample.png)]

在图像分割任务中,每个像素的分类结果很大程度依赖于周围像素,基于此,即使不通过teacher模型,我们也可以发掘部分样本中的hard sample。本次比赛中我们主要考虑了以下两类数据:

  • 图像边缘:卷积时零填充太多,信息缺少,难以正确分类(参考3.1的方格效应)
  • 不同类间交界处:
    • 类间交界难以界定,存在许多标注错误,训练时梯度不稳定
    • 类间交界的点,往往只相差几个像素偏移,对网络来说输入信息高度相似,但 训练时label 却不同,也是训练过程的不稳定因素。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vf3MGFrX-1571397043043)(C:\Users\now more\Desktop\Project\tianchi_2019\素材\image_3可视化.png)]

上图从上到下分别为image_3原图,不加膨胀预测的模型预测结果,模型对每个像素点的预测置信度可视化图(将置信度p<0.8可视化为黑色,p>=0.8可视化为白色),可以明显看出,对于图像边缘数据,信息缺失网络难以作出正确分类。对于类间交界,由于训练过程梯度不稳定,网络对这部分数据的分类把握较低。

我们采取的方式是在图像边缘和类间交界设置过渡带,过渡带内的像素视为 hard sample作标签平滑处理,平滑的程度取决于训练时每个batch中 hard sample 像素占总输入像素的比例。而过渡带w的大小为一个超参数,在本次比赛中我们取w=11。


3.6 伪标签 + 软标签

伪标签是分类比赛中常用的trick之一,在模型分数已经较高的情况下可以尝试。提分显著,但对A榜过拟合的风险极大。具体实施是:

  1. 利用在测试集表现最好的融合模型结果作伪标签,用多组不同置信度阈值过滤数据,结合训练集训练模型;
  2. 对所有伪标签数据进行标签平滑,缓解伪标签中错误数据对网络训练影响;
  3. 选取多个snapshot的方法对模型进行自融合提高模型的泛化能力;
  4. 利用3的结果,更新伪标签,重复步骤1~3。

4 总结

  1. 膨胀预测消除边缘预测不准问题;
  2. 使用测试增强、消除空洞和小连通域等后处理提高精度;
  3. 使用snapshot模型自融合、标签平滑、伪标签等方法提高模型稳定性;
评论 114
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值