高光谱分类
文章目录
一、作业要求
本次作业的主要内容为:
1.高光谱分类,注意力机制阅读论文《HybridSN: Exploring 3-D–2-DCNN Feature Hierarchy for Hyperspectral Image Classification》,思考3D卷积和2D卷积的区别。
2.阅读代码,把代码敲入 Colab 运行,网络部分需要自己完成。训练网络,然后多测试几次,会发现每次分类的结果都不一样,请思考为什么?
3.思考问题,如果想要进一步提升高光谱图像的分类性能,可以如何使用注意力机制?
二、论文阅读
2.1论文内容
- 高光谱图像(Hyperspectral Image):在光谱的维度进行了细致的分割,不仅仅是传统的黑,白或者RGB的区别,而是在光谱维度上也有N个通道。
- 本文介绍了一种用于HSI分类的混合三维和二维模型。 所提出的混合SN模型基本上将空间光谱和光谱的互补信息分别以三维和二维卷积的形式结合起来。 与最近最先进的方法相比,三个基准数据集的实验证实了该方法的优越性。 该模型比三维CNN模型具有计算效率。 它还显示了小训练数据的优越性能。
- 光谱-空间高光谱数据立方体用如下公式表示,其中I是原始数据,M是宽度,N是高度,D是光谱带/深度的数目
用如下公式表示PCA还原数据立方体,其中X是PCA后的修正输入,M是宽度,N是高度,B是PCA后的光谱带数。
在二维卷积中,使用以下方程生成第一层jth特征映射中空间位置(x,y)的激活值,表示为vix,jy
在三维卷积中,第一层jth特征映射中空间位置(x,y,z)的激活值,表示为vix,jy,z,生成如下,其中2η1是沿光谱维数核的深度
- 混合特征学习框架hybrid feature learning framework网络结构如下图所示
- 实验数据集:三种开源高光谱图像数据集,Indian Pines(IP), University of Pavia(UP) and Salinas Scene(SA)
- 实验结果
2.2 思考题1:3D卷积与2D卷积的区别
答:
- 3D卷积相较于2D卷积增加了一个深度,2D卷积可看作是深度为1的3D卷积
- 仅使用二维CNN或三维CNN分别存在缺失信道关系信息或非常复杂的模型等缺点。它还阻止了这些方法在HSIS上获得更好的准确性。主要原因是HSI是体积数据,也有光谱维数。单是二维CNN无法从光谱维度提取出良好的识别特征映射。同样,一个深的三维CNN在计算上更复杂,这本身似乎对在许多谱带上具有相似纹理的类执行更差。这就是我们提出一个混合CNN模型的动机,它克服了以前模型的这些缺点。将三维-CNN和二维-CNN层组装为所提出的模型,使它们充分利用光谱图和空间特征图,以达到最大可能的精度。
三、代码练习
3.1 代码练习
- 首先取得数据,并引入基本函数库
! wget http://www.ehu.eus/ccwintco/uploads/6/67/Indian_pines_corrected.mat
! wget http://www.ehu.eus/ccwintco/uploads/c/c4/Indian_pines_gt.mat
! pip install spectral
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as sio
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report, cohen_kappa_score
import spectral
import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
- 定义HybridSN类
三维卷积:
conv1:(1, 30, 25, 25), 8个 7x3x3 的卷积核 ==>(8, 24, 23, 23)
conv2:(8, 24, 23, 23), 16个 5x3x3 的卷积核 ==>(16, 20, 21, 21)
conv3:(16, 20, 21, 21),32个 3x3x3 的卷积核 ==>(32, 18, 19, 19)
接下来要进行二维卷积,因此把前面的 32*18 reshape 一下,得到 (576, 19, 19)
二维卷积:(576, 19, 19)64个3x3 的卷积核,得到(64, 17, 17)接下来是一个flatten操作,变为18496维的向量,接下来依次为256,128节点的全连接层,都使用比例为0.4的Dropout,最后输出为16个节点,是最终的分类类别数。
class HybridSN(nn.Module):
def __init__(self):
super(HybridSN, self).__init__()
self.conv3d_1 = nn.Sequential(
nn.Conv3d(1, 8, kernel_size=(7, 3, 3), stride=1, padding=0),
nn.BatchNorm3d(8),
nn.ReLU(inplace = True),
)
self.conv3d_2 = nn.Sequential(
nn.Conv3d(8, 16, kernel_size=(5, 3, 3), stride=1, padding=0),
nn.BatchNorm3d(16),
nn.ReLU(inplace = True),
)
self.conv3d_3 = nn.Sequential(
nn.Conv3d(16, 32, kernel_size=(3, 3, 3), stride=1, padding=0),
nn.BatchNorm3d(32),
nn.ReLU(inplace = True)
)
self.conv2d_4 = nn.Sequential(
nn.Conv2d(576, 64, kernel_size=(3, 3), stride=1, padding=0),
nn.BatchNorm2d(64),
nn.ReLU(inplace = True),
)
self.fc1 = nn.Linear(18496,256)
self.fc2 = nn.Linear(256,128)
self.fc3 = nn.Linear(128,16)
self.dropout = nn.Dropout(p = 0.4)
def forward(self,x):
out = self.conv3d_1(x)
out = self.conv3d_2(out)
out = self.conv3d_3(out)
out = self.conv2d_4(out.reshape(out.shape[0],-1,19,19))
out = out.reshape(out.shape[0],-1)
out = F.relu(self.dropout(self.fc1(out)))
out