一、赛题简介
该赛道为第五届“中科星图杯”国际高分遥感图像解译大赛的赛道之一。比赛分为初赛和决赛,分别有各自的测试集。所有模型性能都是线下训练,在线评估打分和排序。初赛截止时需要提交技术报告,排名前列的队伍进入决赛。决赛前6为优胜队伍。 最后成绩是:初赛6/176,top4%,未进决赛。
二、数据分析
高分辨率可见光图像中建筑物普查与变化检测,主要任务包括: 在一定区域内完成两时相(或多时相)建筑物要素提取,并对变化的建筑物进行检测。
1)建筑物提取类别:建筑物和背景。
2)变化检测类别:变化的建筑区域和非变化的建筑区域。
对于后续的损失而言,对不同的类别加入不同的权重进行训练。
三、模型选择
早期的融合方法(1),将不同相位的图像数据组合叠加作为输入送入到网络中,从网络的第一层开始进行图像差异检测,这会导致属于不同相位的特征可能会相互影响,高维原始图像的特征难以保持。
后期的融合方法(2),采用孪生差分网络结构接收不同时间相位的图像数据,通过多层网络将同一网络中原始图像的特征提取函数和差异识别函数联系起来,将大大增加隐藏梯度消失的危险,进而影响原始图像特征提取的结果,导致网络前端提取的原始影响特征的代表性较差。本文对该方法进行了改进,单独使用分割头来优化分割结构,进一步提高了网络提取原始特征的能力。
我们使用的孪生差分网络(siamese differential network)如(3)所示。该网络将两个不同时相的图像作为输入并输出一个变化图。网络包含四个模块:权重共享主干网络、特征差分模块、分割模块(建筑物提取)、变化检测模块。 对于同一区域不同时间的两张图像,将它们输入权重共享主干网络,得到两个大小相同的特征图,然后使用共享参数的分割模块进行语义分割,提取建筑物。
我们在实验中使用的Segmentation Head是经典的FCN Head。为了输出变化检测的结果,将上述两张图像中提取的特征输入到特征差分模块中,得到相同大小的feature map。具体操作是将两个不时项图像的特征图相减,取绝对值。最后,将特征图输入到变化检测模块,经过SoftMax处理后得到概率图,然后通过激活对应的阈值来计算变化检测结果。
3.1 PSPNet
我们使用前面提到的Spatial Pyramid Pool(SPP) Head作为变化检测模块,其他与上述操作一致。 我们使用HRNet 作为两个输入图像之间的权重共享主干网络进行训练。
Spatial Pyramid Pooling 模块
该模块最早出自一篇2015年发表在IEEE上的论文,名为《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》,起初是为了解决不同尺度图像下池化层不同尺寸的输出,导致全连接层无法训练的问题。即使用多个不同尺度的池化层进行特征提取,并融合成一个向量输入至全连接层。
同样的思想,PSPNet也为了消除这一约束,提出了空间金字塔池化模块(Spatial Pyramid Pooling, SPP),进一步避免丢失不同区域之间的语义关系。如上图所示,分别对CNN提取的特征进行不同尺度的全局平均池化,并在每个尺度上使用1x1的卷积核统一维数,最后通过上采样使其与原始特征图尺寸相同,将不同层级的特征图拼接为最终的金字塔池化全局特征。下面为金字塔池化模块对应的代码:
1 | class PyramidPooling(nn.Module): |
3.2 DeepLabv3plus
我们使用提到的 Atrous Spatial Pyramid Pooling (ASPP) Head作为变化检测模块,我们仍然使用论文中提到的 ResNet 作为上文中的权重共享主干网络。 与解码器中的低-高层特征连接操作一样,我们将ASPP头计算出的低级差分特征和高级差分特征连接起来,最后通过上采样得到变化图。 这里我们同样使用 ResNet 的第一阶段输出作为底层特征的输出。
Atrous Spatial Pyramid Pooling 模块
ASPP是出自2016年发表在IEEE上的论文-《DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs》。ASPP(Atrous Spatial Pyramid Pooling)是DeepLab中用于语义分割的一个模块。由于被检测物体具有不同的尺度,给分割增加了难度。DeepLab因此提出了ASPP模块,既能得到多尺度信息,计算量又比较小,其中还使用了空洞卷积(Atrous Convolution)的方法。
空洞空间卷积池化金字塔(atrous spatial pyramid polling)使用多个不同采样率的空洞卷积提取特征,并进行融合,使得目标在图像中表现不同大小时任然具有很好的分割效果。
3.3 U-Net
1)变化检测模块。 首先计算编码器各阶段的差分特征,然后,使用U-Net中的跳转连接,将上采样结果与编码器中相同分辨率的差分特征特征的输出连接 ,作为解码器中下一个子模块的输入。 同时,将SENet中的通道注意力机制加入到连接特征中。
2)分割模块。 对于两幅图像的每个阶段的特征,使用U-Net中的跳跃连接上采样方法计算分割图。
四、损失选择
Segmentation Loss. 用于建筑物提取(分割分支),模型最终需要预测的只有两个类别是背景和建筑物,对于每个类别,我们预测的概率是 $p_i$ 和 $1 - p_i$ ,此时交叉熵方程 损失可以表示为:
其中$y_i$代表样本$i$的标签,正类是$1$,负类是$0$,$p_i$是样本i被预测为正类的概率。
Change Detection Loss. 我们使用BCE loss结合dice loss作为loss来优化change detection的结果掩码,其中dice loss的表达式如下:
直观上,dice指标是计算X和Y之间的相似度,本质上同时意味着精度和召回率。 可以看出,dice loss 是对“F1分数”的直接优化。
Muti-task Loss.综上所述,最终用于训练的损失函数是上述损失函数的加权和:
五、后处理
六、Docker的使用
本次大赛中,各参赛团队需依托阿里云容器镜像服务,以镜像方式提交待测算法软件作为提交结果,因此学习了一些关于Docker容器的操作。同时推荐一本名为《Docker——从入门到实践》的在线文档,非常详细的介绍了Docker的配置及使用,这里简单介绍一下如何创建镜像并提交到阿里云
操作流程
登录阿里云Docker Registry
1 | docker login --username=155****0732 registry.cn-hangzhou.aliyuncs.com |
创建Dockerfile用于配置环境
1 | # 基础镜像若使用cuda,需满足cuda 为10.0,ubuntu16.04 可换成Centos或ubuntu18.04 |
创建镜像,第一次创建非要花费一些时间,后面就快了。
1 | docker build -t gaofenChallenge/detections:v0.1 . # 这里gaofenChallenge/detections:v0.1 为构建的镜像名称 |
运行容器
1 | # 普通运行 |
推送镜像到阿里云镜像
1 | docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ipiu_gaofen/gaofen:[镜像版本号] |