2020 CCF BDCI 地块分割Top1方案 & 语义分割trick整理

本文转载自知乎,已获作者授权转载。

链接:https://zhuanlan.zhihu.com/p/346862877

赛题分析


2020 CCF BDCI 地块分割Top1方案 & 语义分割trick整理_第1张图片 赛题分析

这次比赛也是第一次正式参加的比赛,地块分割本质上也是个语义分割的问题,之前没搞过,花了比较多的时间对晚上的trick进行了整理学习,见最后附录整理的资料。

初赛并不困难,主要考虑7类结果的平均IOU,复赛加入了对水体和道路类的连通性评判指标。最终的方案以较大的优势在A榜和B榜取得了第一名的成绩。


数据分析


2020 CCF BDCI 地块分割Top1方案 & 语义分割trick整理_第2张图片 数据分析

统计数据集中各类面积占比饼状图如上图所示,可以发现数据集中存在类别不均衡现象,建筑、道路和草地类较少,而其他类较多。

进一步的统计,可以得知只有分别约7%/10%/13%的图片满足建筑/道路/草地面积占比大于1%。数据存在极度类别不均衡现象,常规的方法不适于训练。

2020 CCF BDCI 地块分割Top1方案 & 语义分割trick整理_第3张图片 baseline分析

结合baseline结果可以发现,尽管建筑类数据较少,但由于其地貌容易辨识,分类结果较准确;而道路和草地类则因为与其他类存在相似性,但训练数据不足,结果较差。

因此,提升模型分类能力(MIOU)的关键是解决类别不均衡问题,尤其是道路类和草地类。

思路介绍

整体思路

2020 CCF BDCI 地块分割Top1方案 & 语义分割trick整理_第4张图片 整体思路

要解决这些问题,直接的方式是使用针对IOU设计的损失函数进行re-weighting(如Lovasz-Softmax Loss、 Focal Loss等),但训练较慢,结果收敛不稳定。其次是可以针对特殊类设计模块,但结构复杂且周期长。

最终我们借鉴了Adaboost的思想,用不同概率分布的训练数据训练一系列弱分类器,并通过投票融合得到强分类器。

这里之所以用类似,是因为与Adaboost不同,我们这里的数据并不是每轮增加错误样本权重,弱分类器的“弱”也是指特殊类别上弱,融合权重根据准确率与连通性需求人为规定。


数据处理

2020 CCF BDCI 地块分割Top1方案 & 语义分割trick整理_第5张图片 数据处理

为了获取不同的训练数据,我们设计了不同数据处理方案:

(1) 划分道路草地类正负样本(负样本指不包含该类的样本),多阶段逐步增加负样本比例(借鉴Bengio的curriculum learning的思想由简单到复杂训练,结果更好收敛);

(2) 在原数据的基础上,对道路草地类样本re-sampling,为了避免过拟合,对重采样数据进行多种数据增强(水平翻转+垂直翻转+放缩为0.75/0.875/1.125/1.25倍),与re-weighting相比,简单直接效果好;

(3) 针对建筑/道路/水体类转换处理得到二分类训练数据(同样进行数据增强并加入随机旋转90/180/270度),训练特殊的二分类器,加强模型对特殊类别的前景后景区分能力。在数据增强时,我们还进行了阈值筛选,仅对面积占比较大的图像进行相应处理,直觉上这些数据对训练更友好。

值得注意的是,上图中预测效果对比可以发现,多分类模型只能识别笔直的道路,部分弯曲的道路难以识别,而二分类模型可以很好地识别弯曲的道路,并且连通性也更好,这也是我们复赛的主要思路(很长一段时间内都比第二名高3-5个点)。


模型训练

2020 CCF BDCI 地块分割Top1方案 & 语义分割trick整理_第6张图片 模型训练

有了这些数据,我们训练了一系列以HRNet和OCRNet为backbone的模型。并且我们探索了SE、CBAM、scSE等attention module,最后是采用了提升效果最多的SE attention。

由于比赛经验生疏,当时训了些许大模型,然而融合后提升微薄,实际上模型差异越大后续融合结果一般更好。实际环境下,若考虑计算开销,也许训练UNet等诸多小模型融合,效果更好,速度更快。


模型预测

2020 CCF BDCI 地块分割Top1方案 & 语义分割trick整理_第7张图片 模型预测

在测试时,我们进行了多种数据增强,包括尺度放缩、水平/垂直翻转、90度倍数旋转(实际上,原图+水平翻转+垂直翻转+180度旋转足矣,更多的TTA提升效果很小)。

得到这些预测后,我们不是进行softmax分数求和的软投票,而是逐像素少数服从多数的硬投票,并且用二分类预测逐优先级覆盖多分类预测,人为地规定了道路>水体>建筑>其他的优先级。这里我们利用多进程+numpy矩阵运算,大大减小了投票花费的时间。


连通性后处理

2020 CCF BDCI 地块分割Top1方案 & 语义分割trick整理_第8张图片 连通性后处理

最后我们使用形态学处理进一步提高了连通性,首先是用闭运算连接断裂处以及中值滤波去除毛刺;

其次用面积和长度筛选阈值孤立像素团,用左边像素类别进行替换去除;

第三是设计了骨架连通性增强方案,提取出某类的骨架,并适当地膨胀腐蚀,保证连通的同时不会过度超出原始预测区域;

最后是设计了一个动态优先级算法,动态地进行不同类别的覆盖(主要考虑水体与道路类覆盖优先级)。


结果对比

2020 CCF BDCI 地块分割Top1方案 & 语义分割trick整理_第9张图片 原图(左),单模型预测(中),多模型预测(右)

最终的结果输出如上图右所示,可以看到最终的预测图更加平滑,类别噪点大大减少,并且保证了道路和水体较好的连通性。这里融合的结果更多考虑了连通性,因而可能存在“误判”的结果,实际环境下可考虑准确性和连通性的权衡,调整阈值和权值。


总结

方案最大的特点是将连通性问题转换为二分类问题解决,结果出奇地好,传统图像形态学后处理仍然可靠。无须针对性设计loss和module,分类器可用多种小模型,实际环境下并行处理也更快。来了新的类别,大可以训练二分类器简单投票,数十个迭代即可得到较强的分类器。

整场比赛打下来挺累的,日常翘课熬夜debug,所幸最后结果尚可。答辩时也认识了不少比赛老手,感慨自己经验尚浅,无论是在学术上还是工程上,都有很大的进步空间,继续努力吧~

最后,有各种比赛、论文合作意愿的小伙伴可私戳,带带弟弟,thx~~

附录

语义分割trick整理

基于SegNet和U-Net的遥感图像语义分割

https://zhuanlan.zhihu.com/p/58521469

  • 数据增强:原图与label图旋转90度的整数倍(90/180/270),原图和label图沿y轴旋转,原图做模糊操作,原图做光照调整操作,原图加噪声(高斯/椒盐)

  • 转为二分类:对每一分类训练二分类模型,对预测图进行按优先级叠加

  • 模型融合:对结果进行投票叠加

语义分割训练与优化技巧

https://niecongchong.github.io/2019/08/20/%E8%AF%AD%E4%B9%89%E5%88%86%E5%89%B2%E8%AE%AD%E7%BB%83%E4%B8%8E%E4%BC%98%E5%8C%96%E6%8A%80%E5%B7%A7/

  • 几何变换:水平翻转(遥感还可以垂直翻转)、平移、随机裁剪和缩放(比例需要研究)、旋转

  • 纹理增强:亮度和对比度、色调饱和度对比度HSV、运动模糊、颜色抖动、限制对比度的自适应直方图均衡化

  • 其他增强:超像素、锐化、透视变换

Airbus Ship Detection 卫星图像分割检测

https://zhuanlan.zhihu.com/p/48381892

  • 数据扩增,与前面类似,90度倍数旋转等

  • TTA单图多测,单图多scale投票:

    https://zhuanlan.zhihu.com/p/131539596

Kaggle 气胸识别分割比赛新手铜牌总结及冠军分案

https://zhuanlan.zhihu.com/p/89838787

  • 均衡采样:不同训练阶段不同采样

  • 联合损失函数:BCE+Dice+Focal loss

  • 后处理主要是针对二分类的,感觉借鉴意义不大 (可借鉴)

Kaggle冠军告诉你,如何从卫星图像分割及识别比赛中胜出?

https://zhuanlan.zhihu.com/p/26663913

  • 预处理中,训练集减去平均值,并标准化偏差

  • 不同类别设计不同策略难以借鉴,多种模态输入

Kaggle优胜者详解:如何用深度学习实现卫星图像分割与识别

https://zhuanlan.zhihu.com/p/26377387

  • 和上面同一个比赛,也为不同类别训练特定模型

  • 对数据先归一化为具有零均值和单位方差,之后进行数据增强过采样

  • 在测试的时候滑动窗口拼接(256可否借鉴小窗口滑动拼接?),TTA平均输出

  • 后处理简单使用扩展和腐蚀操作,去除小于给定阈值的物体和小孔

ECCV 2020 大规模实例分割挑战赛(LVIS Challenge)冠军方案

https://zhuanlan.zhihu.com/p/224851085

  • Repeat Factor Sampling 样本采样技术(应该类似于重采样保证样本均衡)

  • 数据增广中使用了Mosaic , 旋转和尺度扰动

  • DCE+weighted BCE

  • 分类器平衡,在表示学习部分结束后,冻结网络的 backbone,使用Balanced GroupSoftmax进行分类器平衡(目标检测长尾效应中使用)

Kaggle TGS 盐体分割任务第五名解决方案):kaglge硬核高中生玩家,模型集成策略太高级了看不懂

https://zhuanlan.zhihu.com/p/47412338

  • 魔改scSE,似乎加了1

  • 在Lovasz loss中我们使用了elu+1而不是默认的relu

Kaggle图像分割比赛中的损失函数及keras实现:介绍了BCE、weighted BCE、Dice和Lovasz loss

https://zhuanlan.zhihu.com/p/80716099

数据增强repo,注意里面做分割的demo ipynb:

https://github.com/albumentations-team/albumentations

CRF后处理

  • 【图像后处理】python实现全连接CRFs后处理,CRF+填孔后处理

    https://zhuanlan.zhihu.com/p/64854535

  • 代码参考:

    https://github.com/Gurupradeep/FCN-for-Semantic-Segmentation、https://github.com/1044197988/Semantic-segmentation-of-remote-sensing-images等

END

备注:分割

图像分割交流群

语义分割、实例分割、全景分割、抠图等技术,若已为CV君其他账号好友请直接私信。

我爱计算机视觉

微信号 : aicvml

QQ群:805388940

微博/知乎:@我爱计算机视觉

投稿:[email protected]

网站:www.52cv.net

在看,让更多人看到  

你可能感兴趣的:(机器学习,人工智能,深度学习,计算机视觉,数据挖掘)