使用HybridSN进行高光谱图像分类

一、前言高光谱图像(Hyperspectral image,以下简称HSI)分类广泛应用于遥感图像的分析,随着深度学习和神经网络的兴起,越来越多的人使用二维CNN对HSI进行分类,而HSI分类性能却高度依赖于空间和光谱信息,但由于计算复杂度增加,很少有人将三维CNN应用于HSI分类中。这篇 Exploring 3-D–2-D CNN Feature Hierarchy for Hyperspectral Image Classification构建一种混合网络(HybridSN)解决了HSI分类所遇到的问
摘要由CSDN通过智能技术生成

一、前言

高光谱图像(Hyperspectral image,以下简称HSI)分类广泛应用于遥感图像的分析,随着深度学习和神经网络的兴起,越来越多的人使用二维CNN对HSI进行分类,而HSI分类性能却高度依赖于空间和光谱信息,由于计算复杂度增加,很少有人将三维CNN应用于HSI分类中。这篇 Exploring 3-D–2-D CNN Feature Hierarchy for Hyperspectral Image Classification构建一种混合网络(HybridSN)解决了HSI分类所遇到的问题,它首先用三维CNN提取空间-光谱的特征,然后在三维CNN基础上进一步使用二维CNN学习更多抽象层次的空间特征,这与单独使用三维CNN相比,混合的CNN模型既降低了复杂性,也提升了性能。经实验证明,使用HybridSN进行HSI分类,能够获得非常不错的效果。

二、高光谱图像

在进行高光谱图像分类之前,我认为有必要了解什么是高光谱图像。从计算机的角度来说,高光谱图像(Hyperspectral image)就是由多通道(几十甚至几百个)的数组构成的图像,每个像素点都有很多的数来描述,单个通道上的“灰度值”反映了被拍摄对象对于某一波段的光的反射情况。

我们知道,常见的RGB彩色图像只有三个通道,而高光谱图像有几十甚至几百个通道,所以高光谱图像包含包含更多的目标信息,利用高光谱图像进行目标的分类识别也必然比采用RGB图像具有更高的准确度。如下图所示,利用高光谱相机可以拍摄出由不同波长组成的空间立方体图像(即高光谱图像),用一个光谱曲线将其显示出来,横轴表示波长,纵轴表示反射系数,由于同一物体对不同波长的光反射因子不一样,因此利用高光谱图像更能反映出不同物体的差异性。

其实高光谱成像技术在很早以前就已经被广泛应用了,天上的卫星拍摄到的就是高光谱图像,通过分析每个像素点的光谱曲线,可以把不同地面目标对应的像素点分类,从而在高光谱图像中把地面、建筑物、草坪、江河等等区分开。

三、HybridSN模型

对于HSI分类问题,我们在提取空间信息的同时,也希望能获取到不同波长的光谱信息,而二维CNN是无法处理光谱信息的,也就无法提取到更具有判别性的特征图。幸运的是,三维CNN能够同时提取光谱和空间的特征,但代价是增加计算复杂度。为了充分发挥二维和三维CNN的优势,Swalpa Kumar Roy等人提出了HSI分类模型HybridSN,其模型图如下图所示,它由三个三维卷积、一个二维卷积和三个全连接层组成。

在HybridSN模型中,三维卷积核的尺寸分别为8×3×3×7×1(即图中 K 1 1 K_1^1 K11=3 , K 2 1 K_2^1 K21=3 , K 3 1 K_3^1 K31=7)、16×3×3×5×8(即图中 K 1 2 K_1^2 K12=3 , K 2 2 K_2^2 K22=3 , K 3 2 K_3^2 K32=5)和32×3×3×3×16(即图中 K 1 3 K_1^3 K13=3 , K 2 3 K_2^3 K23=3 , K 3 3 K_3^3 K33=3),分别位于第一、第二和第三卷积层中。其中,16×3×3×5×8表示输入特征图的个数为8,输出特征图个数为16,三维卷积核大小为3x3x5,可理解为有两个空间维度和一个光谱维度。二维卷积在flatten之前被应用一次,它能有效的判别空间信息,也不会大量损失光谱信息,这是对HSI数据非常重要

模型的详细参数配置如下表所示,可以看出,第一个FC层(即dense1)参数量最多,最后一个全连接层(dense3)的输出为16,这是因为Indian Pines (IP)数据集的类别数为16。HybridSN中可训练的权重参数总数为5122176,所有参数都是随机初始化的,使用Adam优化器,交叉熵损失函数,学习率为0.001,batch大小为128,训练100个epoch。

下面是我实现的HybridSN模型:

class_num = 16
class HybridSN(nn.Module):  
  def __init__(self, in_channels=1, out_channels=class_num):
    super(HybridSN, self).__init__()
    self.conv3d_features = nn.Sequential(
        nn.Conv3d(in_channels,out_channels=8,kernel_size=(7,3,3)),
        nn.ReLU(),
        nn.Conv3d(in_channels=8,out_channels=16,kernel_size=(5,3,3)),
        nn.ReLU(),
        nn.Conv3d(in_channels=16,out_channels=32,kernel_size=(3,3,3)),
        nn.ReLU()
    )

    self.conv2d_features = nn.Sequential(
        nn.Conv2d(in_channels=32 * 18, out_channels=64, kernel_size=(3,3)),
        nn.ReLU()
    )

    self.classifier = nn.Sequential(
        nn.Linear(64 * 17 * 17, 256),
        nn.ReLU(),
        nn.Dropout(p=0.4),
        nn.Linear(256, 128),
        nn.ReLU(),
        nn.Dropout(p=0.4),
        nn.Linear(128, 16)
    )
 
  def forward(self, x):
    x = self.conv3d_features(x)
    x = x.view(x.size()[0],x.size()[1]*x.size()[2],x.size()[3],x.size()[4])
    x = self.conv2d_features(x)
    x = x.view(x.size()[0],-1)
    x = self.classifier(x)
    return x

带有Batch Normalization的HybridSN模型:

class HybridSN_BN(nn.Module):  
  def __init__(self, in_channels=1, out_channels=class_num):
    super(HybridSN_BN, self).__init__()
    self.conv3d_features = nn.Sequential(
        nn.Conv3d(in_channels,out_channels=8,kernel_size=(7,3,3))<
  • 13
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷恩Layne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值