介绍
在农业、自动驾驶、航空或能源领域,预测和了解天气是十分重要的。例如,天气条件对航空和物流公司在规划最快和最安全的航线方面起着重要作用,可再生能源公司也需要根据天气预测他们在给定的一天将生产多少能源。因此,各种天气模型被开发出来并正在世界各地应用。但是这些模型通常需要关于大气和确切条件的高度具体的信息,这样使得模型对数据的需求变得非常复杂。
出于这个原因,Meteomatics (提供对广泛的全球天气、气候预测和环境数据的快速、直接和简单的访问API),已向我们(Lightly.ai)寻求帮助。他们的目标是:在数据稀少且必须依赖卫星图像的地区准确预测降水。在这篇文章中,我们展示了我们如何开发一个神经网络来根据红外卫星数据预测给定区域的降雨量。
数据收集与分析
如果您曾经使用过神经网络,您就会知道它们需要大量数据。出于这个原因,建立一个收集、管理和组装数据的数据管道至关重要。Meteomatics 提供易于使用的 API,使我们能够快速收集训练和真实数据。例如,要在 2021 年 7 月 7 日以 800x600 像素的分辨率获取欧洲的红外图片(坐标从 65, -15 到 35, 20),我们可以简单地进行以下查询:
代码语言:javascript复制wget "https://api.meteomatics.com/2021-07-13T20:15:02Z/sat_ir_108:K/65,-15_35,20:800x600/png"
我们可以每隔15分钟运行一个 Python 脚本,连续几天收集欧洲、北美和墨西哥不同波长的红外图像。然后我们将每个时间戳的不同图像在本地组合成一个 RGB 图像。为了使任务更容易,我们在第一步中掩盖了层状降水。然而,正如我们稍后将看到的,这对模型的准确性只有很小的影响。我们还收集了真实数据用于训练和评估模型的准确性。请注意,真实数据仅适用于欧洲和北美。您可以在下面看到欧洲的一对输入和实际真值数据:
卫星图像示例(左)、神经网络的输入(中)和真实数据(右)。基于指标对输入图像和真实图像的浅灰色区域进行遮挡。这些数据是在 2021 年 7 月 13 日星期二 20:15:02 在欧洲收集的。
为了避免“garbage in garbage out”,肯定要在进行机器学习算法训练之前对收集的数据进行理解和整理。我们的 Lightly 支持快速简便的方法来分析数据集以及更深入的算法来选择最相关的训练点。将的数据集上传到 Lightly 后,我们立即注意到所收集数据的一个重要特性:欧洲、北美和墨西哥的图像在视觉和语义上是分开的。这样我们可以使用一个简单的策略来测试算法的泛化能力:如果我们用来自欧洲的数据训练它并且它在来自北美和墨西哥的看不见的数据上表现良好,那么该算法将很好地泛化。
显示的来自欧洲(蓝色)、北美(绿色)和墨西哥(灰色)的输入图像嵌入。图像在嵌入空间中分离良好。
另一个关键问题是,有许多极其相似的小集群图像。这是因为我们在相对较短的时间内收集了数据。因此,数据集中有很多相似的图像,这使得模型难以很好地泛化。通过一种名为“coreset sampling”的方法帮助我们消除了这些冗余,该方法旨在最大限度地提高数据集的多样性。
在使用 Lightly 管理数据集之前,我们的训练数据集(欧洲)中有 1158 张图像。数据整理后,我们剩下 578 张图像。验证数据集(北美)包含 1107 张图像,而测试数据集(墨西哥)仅包含 43 张图像,因为我们开始数据收集的时间较晚。
我们从 Lightly 下载图像,现在我们准备进行一些机器学习。
神经网络和语义分割
卷积神经网络是一类应用于计算机视觉的人工神经网络。他们的共享权重架构使他们能够有效地处理图像数据并轻松检测相关特征。卫星图像非常适合使用神经网络进行训练。因为输入图像的范围相当有限,可能的原因是卫星总是处于大致相同的高度,因此物体总是以相似的比例出现。
语义分割是为图像的每个像素分配标签的任务。例如,在自动驾驶中,算法通常必须了解图像的哪些像素代表汽车、行人、骑自行车的人、停车标志等。为语义分割设计的典型神经网络架构是 UNet(见下图)。在这里,输入图像通过卷积层的金字塔转换为密集向量,然后通过一系列反卷积层再次扩展为图像的原始形状。此外,共享卷积层和反卷积层的特征以获得输入图像的全局视图。
对于此任务,我们使用了Efficient (或 ENet)的神经网络作为基础架构。我们使用它提取特征,然后用Unet进行分割。
为了将预测降水量的任务构建为语义分割问题,我们根据五分钟时间跨度内以毫米为单位的降水量将输出空间分为以下几类:
- 未标记(如果存在,则掩盖图像的一部分)
- 0.00mm(无雨)
- 0.04mm — 0.07mm
- 0.07mm — 0.15mm
- 0.15mm — 0.30mm
- 0.30mm — 0.60mm
- 0.60mm — 1.20mm
- 1.20mm — 2.40mm
- 2.40mm — 4.80mm
- > 4.80mm
结果展示
除了更改输入的高度和宽度以匹配图像的分辨率 (600x800) 外,我们使用默认设置训练神经网络。在 NVIDIA Tesla P100 上的完整数据集上训练 100 个 epoch 大约需要 1.6 小时。如果从上面对精选数据集进行训练,我们能够将训练时间减少 50% 以上。
下面的表显示了在训练数据集(欧洲)和测试数据集(北美)上的不同类别的预测的 IoU(交集)。
训练集(欧洲)和测试集(北美)上不同预测类的并集交叉(IoU)。注意,对于这类分割任务,IoU是一个次优度量。
正如数字所示,该模型学会了以非常高的准确度区分“下雨”和“不下雨”。不幸的是,精度随着降水量的增加而迅速下降。这可能是因为大量降雨的地区的可用数据比较少(数据不平衡)。表中的数字可能表明该模型的性能相当差。其实这种情况并非如此。下一步就是人肉检查我们模型所做的预测,他们的结论是该模型非常准确——尤其是考虑到它所需的数据量很少。为了让您更好地理解算法所做的预测,我们将向您介绍 Meteomatics 用于进行视觉检查的一些示例。
下图显示了红外图像、真值以及我们的算法对欧洲天气情况(训练集)所做的预测。我们可以立即看到预测的形状非常准确。但是我们观察到模型预测高降水量的像素数量(以红色显示)相当低。这是不平衡数据集的典型示例,收集更多高降水数据可能会解决问题。同样值得注意的是,该模型无法准确预测真实数据的细粒度细节。这只能通过提高分辨率来解决。
来自训练数据集的缩放示例的不同波长的输入红外图像(左)、模型输出(右上)和实际值(右下)。
第二张图显示了红外图像、真值以及我们的算法对北美天气情况(测试集)所做的预测。与训练集中的情况类似,我们可以看到对高降水地区的预测不太准确。但是,该模型正确预测了真值的形状,并且倾向于准确预测降水较多的区域。
最后,将我们的算法与已经在生产中使用的算法进行比较。第三张再次显示了红外图像和我们的算法所做的预测,这次是在墨西哥。然而,它显示了由云和大气的物理模型做出的预测而不是实际的真值。很明显,输出差异很大,并且基于输入图像,我们的算法至少在精度方面似乎优于物理模型。实际上,使用我们的(Lightly)算法观察到的误报更少,因为在没有云的地方无法预测降水。
总结
在本篇文章中,我们开发了一个语义分割模型,该模型可以根据卫星图像以良好的精度预测给定位置的降水量。卷积神经网络在现实生活中的应用可以在改进或补充现有天气模型方面发挥关键作用,从而帮助我们的合作伙伴 Meteomatics 在难以获取数据的地区准确预测降水。
我们可以得出结论,当试图从红外卫星图像中预测降水量时,只有 500 幅图像才有可能获得合理的结果。即使对于考虑层状降水的更困难的情况,性能也仅略有下降(平均约 0.04 的 IoU)。设置的一个关键问题是数据集严重不平衡。为了缓解这种情况,可以在更长的时间内收集更多的训练样本,以确保数据集的多样化。对于更细粒度的结果,最好以更高的分辨率收集图像并将它们切成更小的块以保持较低的内存占用。
希望这篇博文提供了一个示例,说明了数据管理的重要性和神经网络在天气模型中的强大功能。
最后,本篇文章没有代码,如果想实现的话其实不复杂:整理好数据后直接用segmentation_models.pytorch就可以了,有兴趣的可以自己试试
或者去原文看看:https://towardsdatascience.com/predicting-rain-from-satellite-images-c9fec24c3dd1
作者:Philipp Wirth