遥感图像稀疏表征与智能分析竞赛参赛笔记

遥感图像稀疏表征与智能分析竞赛参赛笔记

前俩个月参加了由国家自然科学基金委信息科学部主办的“遥感图像稀疏表征与智能分析竞赛”,在这里分享一下参加比赛的一些感悟。

数据集

我参加的是语义分割主题,数据来源于高分二号MSS影像,分辨率为四米,影像尺寸为7200x6800,包括NIR,R, G, B四个波段。由于原始影像是用ENVI classic做的预处理,所以会导致一些读取错误,所以我都使用了imageio函数进行读取。数据集主要包含16个类别,如下图:
遥感图像稀疏表征与智能分析竞赛参赛笔记_第1张图片
数据集主要包括八张训练图像以及俩张验证图像,最后需要对十张测试图像进行测试。由于原始影像尺寸较大,受服务器GPU内存的限制,需要对图像进行裁切,通过有重叠的裁切,最终得到了22880张256x256大小的训练图像以及5720张验证图像,同时,还对数据集进行了简单的数据增强,比如随机旋转(random rotate)和水平/垂直翻转(Horizontal/Vertiacal Filp)。
值得注意的是,数据中类别不平衡现象较严重,数据多的样本与数据少的样本之间差距悬殊,如下图;
遥感图像稀疏表征与智能分析竞赛参赛笔记_第2张图片
所以解决类别之间的不平衡问题是取得好名次的关键。

模型训练

由于keras简单的操作逻辑,所以使用了keras进行编码。对于语义分割任务,刚开始想到的就是各种比较经典的网络,比如UNet,SegNet,RefineNet,但是进行了几次实验之后,发现直接堆砌网络,效果都不算太好。尤其是对于相似度极高的河流和湖泊,以及坑塘,很容易分类错误,对于数据较少的样本,时常提取不到,最重要的是,精度上不去,损失下不来。后来就尝试了预训练的网络,主要就是在ImageNet上预训练的DenseNet(如下图)网络,以及Inception_ResNet_v2网络,精度一下子就提升上去了,而且收敛也很快,相比于普通网络,收敛速度快了十倍左右。因为网络主要是基于编码器-解码器结构,所以下采样网络就使用了简单的卷积层以及上采样层,当然,也尝试了经典的Hypercolumns,但是效果提升不大,此外,还使用了一个辅助损失函数来监督训练,对于最后的结果也有些许的提升。
D
对于训练过程,我们把batch size设置为16,这样可以充分发挥BatchNormalization的加速收敛作用,迭代次数为30次,也使用了earlystopping,每次都保存最佳的模型(save_best_only=True),也就是验证集准确率较高的模型,使用Adam优化器优化,初始学习率为le-4,学习率按照特定的迭代次数依次减小。由于使用了预训练模型,所以需要经过归一化并减掉某个均值、除以某个方差,然后才能输入模型。由于最终的测试指标是Kappa,所以我们也把Kappa作为评价指标,Kappa定义如下:
k = p 0 − p e 1 − p e k=\frac{p_0-p_e}{1-p_e} k=1pep0pe
这是遥感影像场景分类常用的评价指标。

测试

对于整张遥感图像,由于GPU限制,不能直接用训练好的模型输入测试图片进行预测。所以采用了拼接的办法,首先给大图做补零操作,得到一副补零的大图,同时我们也生成一个与该图一样大的全零图,把图像的尺寸补齐为1024的倍数,然后以1024为步长切割大图,将切割得到的小图送进模型预测,预测好的小图则放全零图的相应位置上,依次进行,最终得到预测好的整张大图,再对整张大图进行切割,切割成原先图片的尺寸,完成整个预测流程。
除此之外,对于训练得到的模型,采用了集成学习的思想,具体就是对每个像素点采取投票的策略,对每张图相应位置的像素的类别进行投票,票数最多的类别就是该像素的类别,依次进行,这种策略可以最大限度的取长补短,去掉一些明显分类错误的像素点,同时减小拼接痕迹,对于最终的预测结果也有很大的改善。

总结

对于遥感影像的语义分割,思路还有很多,上述只是几个比较简单的tricks,最常用的做法就是不停的训练模型,再对训练得到的模型进行集成,当然还有一些比较具体的细节,这里就不展开阐述,也欢迎留言交流。
编辑人:陈鑫

你可能感兴趣的:(教程)