2020 CCF BDCI 遥感影像地块分割冠军竞赛方案 & 语义分割trick整理
共 4703字,需浏览 10分钟
·
2021-01-30 22:12
极市导读
本文是作者参加CCF BDCI获得冠军的比赛经验总结以及语义分割trick的整理。作者的比赛方案最大的特点是将连通性问题转换为二分类问题解决,结果优异,传统图像形态学后处理仍然可靠。且无须针对性设计loss和module,分类器可用多种小模型,实际环境下并行处理也更快。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
赛题分析
赛题分析
这次比赛也是第一次正式参加的比赛,地块分割本质上也是个语义分割的问题,之前没搞过,花了比较多的时间对网上的trick进行了整理学习,见最后附录整理的资料。初赛并不困难,主要考虑7类结果的平均IOU,复赛加入了对水体和道路类的连通性评判指标。最终的方案以较大的优势在A榜和B榜取得了第一名的成绩。
数据分析
数据分析
统计数据集中各类面积占比饼状图如上图所示,可以发现数据集中存在类别不均衡现象,建筑、道路和草地类较少,而其他类较多。进一步的统计,可以得知只有分别约7%/10%/13%的图片满足建筑/道路/草地面积占比大于1%。数据存在极度类别不均衡现象,常规的方法不适于训练。
baseline分析
结合baseline结果可以发现,尽管建筑类数据较少,但由于其地貌容易辨识,分类结果较准确;而道路和草地类则因为与其他类存在相似性,但训练数据不足,结果较差。因此,提升模型分类能力(MIOU)的关键是解决类别不均衡问题,尤其是道路类和草地类。
思路介绍
整体思路
整体思路
要解决这些问题,直接的方式是使用针对IOU设计的损失函数进行re-weighting(如Lovasz-Softmax Loss、 Focal Loss等),但训练较慢,结果收敛不稳定。其次是可以针对特殊类设计模块,但结构复杂且周期长。最终我们借鉴了Adaboost的思想,用不同概率分布的训练数据训练一系列弱分类器,并通过投票融合得到强分类器。这里之所以用类似,是因为与Adaboost不同,我们这里的数据并不是每轮增加错误样本权重,弱分类器的**“弱”**也是指特殊类别上弱,融合权重根据准确率与连通性需求人为规定。
数据处理
数据处理
为了获取不同的训练数据,我们设计了不同数据处理方案:(1) 划分道路草地类正负样本(负样本指不包含该类的样本),多阶段逐步增加负样本比例(借鉴Bengio的curriculum learning的思想由简单到复杂训练,结果更好收敛);(2) 在原数据的基础上,对道路草地类样本re-sampling,为了避免过拟合,对重采样数据进行多种数据增强(水平翻转+垂直翻转+放缩为0.75/0.875/1.125/1.25倍),与re-weighting相比,简单直接效果好;(3) 针对建筑/道路/水体类转换处理得到二分类训练数据(同样进行数据增强并加入随机旋转90/180/270度),训练特殊的二分类器,加强模型对特殊类别的前景后景区分能力。在数据增强时,我们还进行了阈值筛选,仅对面积占比较大的图像进行相应处理,直觉上这些数据对训练更友好。
值得注意的是,上图中预测效果对比可以发现,多分类模型只能识别笔直的道路,部分弯曲的道路难以识别,而二分类模型可以很好地识别弯曲的道路,并且连通性也更好,这也是我们复赛的主要思路(很长一段时间内都比第二名高3-5个点)。
模型训练
模型训练
有了这些数据,我们训练了一系列以HRNet和OCRNet为backbone的模型。并且我们探索了SE、CBAM、scSE等attention module,最后是采用了提升效果最多的SE attention。由于比赛经验生疏,当时训了些许大模型,然而融合后提升微薄,实际上模型差异越大后续融合结果一般更好。实际环境下,若考虑计算开销,也许训练UNet等诸多小模型融合,效果更好,速度更快。
模型预测
模型预测
在测试时,我们进行了多种数据增强,包括尺度放缩、水平/垂直翻转、90度倍数旋转(实际上,原图+水平翻转+垂直翻转+180度旋转足矣,更多的TTA提升效果很小)。得到这些预测后,我们不是进行softmax分数求和的软投票,而是逐像素少数服从多数的硬投票,并且用二分类预测逐优先级覆盖多分类预测,人为地规定了道路>水体>建筑>其他的优先级。这里我们利用多进程+numpy矩阵运算,大大减小了投票花费的时间。
连通性后处理
连通性后处理
最后我们使用形态学处理进一步提高了连通性,首先是用闭运算连接断裂处以及中值滤波去除毛刺;其次用面积和长度筛选阈值孤立像素团,用左边像素类别进行替换去除;第三是设计了骨架连通性增强方案,提取出某类的骨架,并适当地膨胀腐蚀,保证连通的同时不会过度超出原始预测区域;最后是设计了一个动态优先级算法,动态地进行不同类别的覆盖(主要考虑水体与道路类覆盖优先级)。
结果对比
原图(左),单模型预测(中),多模型预测(右)
最终的结果输出如上图右所示,可以看到最终的预测图更加平滑,类别噪点大大减少,并且保证了道路和水体较好的连通性。这里融合的结果更多考虑了连通性,因而可能存在“误判”的结果,实际环境下可考虑准确性和连通性的权衡,调整阈值和权值。
总结
方案最大的特点是将连通性问题转换为二分类问题解决,结果出奇地好,传统图像形态学后处理仍然可靠。无须针对性设计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等
推荐阅读