基于Intel AI 工具实现深度学习的自然灾害遥感影像语义分割
方案介绍
近年来极端天气事件频发,如干旱、洪涝和高温等,这些都会对农作物的生长产生不利影响。AI可以通过大数据分析和预测天气变化,帮助农民制定更加科学的种植计划,选择适应气候变化的农作物品种,预防病虫害以及优化灌溉和施肥策略。
借助此次黑客松大赛,我们计划使用intel one AI工具包,开发一个AI农业防灾预测系统。为农户提供科学、稳定的预测指导。实现将可能出现的灾情提前上报,防患于未然。
基于Intel 工具包生成对抗网络的3层遥感影像语义信息分割模型,通过改进PSPNet网络模型和PSPNet、DeepLab 等网络进行对比,在多层网络模型使用空洞卷积扩大感受野,通常采用编码-解码模型。
PSPNet(Pyramid Scene Parsing Network)简介
PSPNet(Pyramid Scene Parsing Network)是一种用于图像语义分割的深度卷积神经网络模型。
PSPNet的核心思想是利用金字塔池化模块来捕捉不同尺度上的上下文信息,以提高对图像语义的理解和分割准确性。
该模型的主要特点包括:
1.金字塔池化模块(Pyramid Pooling Module):该模块通过在不同尺度上进行池化操作,从不同层次上捕捉图像的全局和局部上下文信息。它能够有效地扩展感受野,使网络能够对不同尺度的对象和场景进行细粒度的分割。
2.ResNet作为主干网络:PSPNet通常使用ResNet作为主干网络,以提取图像特征。
3.融合和上采样:在池化模块之后,PSPNet通过级联融合和上采样操作,将来自不同尺度的特征图进行融合,并将其上采样到原始图像的尺寸。融合后的特征图可以更准确地表示图像中的不同语义区域。
全卷积神经网络(FCN)
现在大多数的语义分割都还是依赖CNN,但是 CNN 对局部接收的卷积会影响语境空间关系的建模;本文使用FCN的方法可以改善CNN对卷积的影响。
FCN 能够输入不同大小的图像。 通过反卷积方法对最后卷积的特征图进行上取样,得到各像素的预测,同时保持其原始图像的空间信息。 然后将上取样的特征图像素进行归类。 FCN 网络主要通过卷积神经网络对图像的强大能力,采用全卷积的方法,利用卷积层代替现有的语义分割深度网络模型。
空洞卷积
空洞卷积的感受野的大小可以用式(1) 表示:
r 设置为"膨胀率", 即孔卷积的步长, 代表输入信号的采样间隔. 当 r = 1 时, 空卷积是标准卷积. 在孔 卷积中, 卷积核以"膨胀率"进行扩展, 在空间维度在相 邻的权系数之间插入 r−1 个零,创建稀疏滤波器
FCN遥感影像分类,数据解析
vgg预训练的网络结构
pretrained_net = models.vgg16_bn(pretrained=False)
pretrained_net.features[:7]
这里我们主要实现FCN 最后一层接softmax并预测 ,FCN 最后一层输出尺寸 eg: 1344 ===>即 1张 3通道的 44特征图
我们希望通过,FCN网格得到的预测分数图,变为一张可视化的图片,即网络的预测的最终结果。
1.FCN8s 网络结构代码实现
CrossEntropyLoss和NLLLoss都是用于多分类问题的损失函数,它们都基于softmax函数。
CrossEntropyLoss:这个损失函数结合了softmax和NLLLoss。在计算CrossEntropyLoss之前,模型会先通过softmax函数将输入概率分布转化为输出概率分布。然后,CrossEntropyLoss按照这个概率分布计算损失。因此,CrossEntropyLoss能够自然地处理多分类问题,并且可以直接用于训练神经网络模型。
NLLLoss:负对数似然损失函数(Negative Log Likelihood Loss)。在计算NLLLoss之前,模型也需要通过softmax函数将输入概率分布转化为输出概率分布。然后,NLLLoss根据这个概率分布和真实标签计算损失。然而,由于NLLLoss没有直接考虑标签的类别分布,它不能直接用于训练神经网络模型,通常用于评估模型的性能。
因此,CrossEntropyLoss和NLLLoss都涉及到softmax函数,区别在于它们如何使用softmax函数计算损失。另外,由于它们的性质和用途不同,选择使用哪一个损失函数取决于具体的应用场景和需求。
# Import Extension
import intel_pytorch_extension as ipex
# Automatically mix precision
ipex.enable_auto_optimization(mixed_dtype = torch.bfloat16)
class FCN8s(nn.Module):
# 定义双线性插值,作为转置卷积的初始化权重参数
def __init__(self,pretrained_net,num_classes):
super(FCN8s,self).__init__()
# (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
# (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
# (2): ReLU(inplace=True)
# (3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1,