使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

LITElric 2018-10-21

在本文中,我将分享其中一项任务的结果(从卫星图像中识别屋顶)。

由于来自印度(大多数发展中国家)的卫星图像质量低,因此手头任务的复杂性增加了。包括Google Sunroof项目在内的大多数类似解决方案都适用于高分辨率图像。

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

德里的卫星图像

我们的第一步是确定适合该任务的最佳算法。

第1步:识别算法

我们最初开始使用计算机视觉的图像分割算法。目标是通过识别屋顶的边缘将图像分割成屋顶和非屋顶。我们的第一次尝试是使用Watershed图像分割算法。当提取图像中的重叠对象时,Watershed算法特别有用。该算法非常快并且计算成本低廉。在我们的例子中,一幅图像的平均计算时间为0.08秒。

以下是Watershed算法的结果。

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

原始图像(左)。Watershed模型的输出(右)

如你所见,输出效果不是很好。接下来,我们实施了Canny边缘检测。与Watershed一样,该算法也广泛用于计算机视觉,并试图从不同的视觉对象中提取有用的结构信息。在传统的Canny边缘检测算法中,有两个固定的全局阈值来滤除伪边缘。然而,随着图像变得复杂,不同的局部区域将需要非常不同的阈值以准确地找到真实边缘。所以有一种叫做auto canny的技术,其中自动设置下限和上限。下面是auto canny的Python函数:

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

Canny边缘检测器在一张图像上的平均时间约为。0.1秒,非常好。结果优于Watershed算法,但实际使用的准确性还不够。

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

Canny Edge检测算法的输出

以上两种技术都使用图像分割,并且在不理解我们试图检测的对象(即屋顶)的上下文和内容的情况下工作。当我们用物体(比如屋顶)的样子训练一个算法时,我们可能会得到更好的结果。卷积神经网络是理解图像上下文和内容的最先进的技术。

正如前面提到的,我们想把图像分割成两部分——屋顶或不是屋顶。这是一个语义分割问题。语义分割试图将图像分割成语义上有意义的部分,并将每个部分划分为预定的类。

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

语义分割

在我们的例子中,图像的每个像素都需要标记为屋顶的一部分或不标记。

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

第2步:生成训练数据

为了训练卷积神经网络(CNN)模型,我们需要一个带有印度建筑和相应masks的屋顶卫星图像数据集。目前还没有印度建筑物屋顶上带masks的公共数据集。因此,我们必须创建我们自己的数据集。一组学生标记了这些图像,并创建了masked图像(如下所示)。

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

通过标记边来生成数据集

以下是masking后的最终输出。

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

虽然已知U-Net模型可以使用较少数量的图像进行数据开始,但我们的训练集中只有20张图像,对于任何神经网络模型来说,即使对于我们的U-Net也能得到结果。处理较少数据的最流行技术之一是数据增强。通过数据增强,我们可以使用数据集中的数据生成更多数据图像,方法是在原始数据中添加一些基本的更改。

例如,在我们的例子中,任何屋顶的图像,当旋转几度或水平或垂直翻转时,就会成为一个新的屋顶图像,考虑到旋转或翻转的方式,对于屋顶图像和它们的masks来说都是一样的。我们在已经标记的图像上使用了Keras Image Generator来创建更多图像。

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

数据增强

第3步:预处理输入图像

我们试图锐化这些图像。我们使用了两种不同的锐化filters -low/soft sharpening和high/strong sharpening。在锐化之后,我们应用Bilateral filter来降低锐化产生的噪声。下面是一些用于锐化的Python代码行

low/soft sharpening:

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

high/strong sharpening

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

以下是输出。

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

第4步:训练和验证模型

我们生成了445张图像的训练数据。接下来,我们选择使用U-Net架构。U-net最初用于生物医学图像分割,但由于其能够实现的良好结果,U-net正在应用于各种其他任务中。是图像分割的最佳网络架构之一。在我们使用U-Net模型的第一种方法中,我们选择使用RMSProp优化器,学习率为0.0001,二元交叉熵与Dice损失(从这里开始实现)。我们进行了200个epochs的训练,平均(最后5个epochs)训练dice系数为.6750,验证dice系数为.7168

以下是验证集中的第一种方法的结果(40张图片):

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

预测(左),目标(右)

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

预测(左),目标(右)

如您所见,在预测图像中,预测mask的中间和角落处存在一些建筑结构的3D痕迹。我们发现这是由于dice损失。接下来,我们使用学习率为1e-4和衰减率为1e-6的Adam优化器,而不是RMSProp。我们使用IoU损失代替BCE+dice损失和Keras的二元精度度量。训练进行了45次。平均(最近5个epoch)训练精度为:0.862,平均验证精度为:0.793。下面是来自第二种方法的验证集上预测的masks:

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

以下是测试数据的结果

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

测试数据

使用机器学习语义分段来识别低分辨率卫星图像中的屋顶

测试数据

我们很高兴看到当前的结果,并希望通过更多的数据进一步改善结果。

相关推荐