前言
实验目的
- 阅读论文《HybridSN: Exploring 3-D–2-DCNN Feature Hierarchy for Hyperspectral Image Classification》,并思考3D卷积和2D卷积的区别;
- 阅读代码:https://gaopursuit.oss-cn-beijing.aliyuncs.com/202010/AIexp/10%20-%20HybridSN_GRSL2020.mhtml;
- 把代码在 Colab 运行,网络部分需要自己完成;
- 训练网络,然后多测试几次,会发现每次分类的结果都不一样,请思考为什么?
- 同时,思考问题,如果想要进一步提升高光谱图像的分类性能,可以如何使用注意力机制?
- 本次博客关键词:高光谱分类(论文中的),注意力机制(自己加的)。
论文地址
论文下载地址1:https://ieeexplore.ieee.org/document/8736016
论文下载地址2:https://pan.baidu.com/s/1dK811oJrGdhUwDSlel9PZA 提取码:55ty
一、论文解读
1、这篇论文说了啥?
首先,介绍一下本论文的主角——高光谱图像(HyperSpectral Image,简称HSI):
- 即包含光谱信息特别长的图像(包含红外线、紫外线等不可见光光谱),比如:普通照片只有三个通道,即RGB——红、绿、蓝。数据类型是一个 m ∗ n ∗ 3 m*n*3 m∗n∗3的矩阵,而高光谱图像则是 M ∗ N ∗ B M*N*B M∗N∗B(B是光谱的层数:3层RGB+其他光谱层…)。
- 高光谱图像是一个立体的三维结构,x、y表示二维平面像素信息坐标轴,第三维是波长信息坐标轴。
之后,对于卷积网络,处理高光谱图像时,会有一些技术问题:
- 2-D-CNN无法处理数据的第三维度——光谱信息(前两维度是图像本身的x轴和y轴)。
- 传统的2D-卷积处理不好这种三维的高光谱图像;
- 若只使用3D-卷积,虽然可以提取第三维——光谱维度的特征,能同时进行空间和空间特征表示,但数据计算量特别大,且对特征的表现能力比较差(因为许多光谱带上的纹理是相似的)
所以,作者:
- 提出HybirdSN模型(全称是Hybrid SpectralNet——我大致翻译为:混合了2D、3D卷积的光谱网络):将空间光谱和光谱的互补信息分别以3D-CNN和2D-CNN层组合到了一起,从而充分利用了光谱和空间特征图,来克服以上缺点。
- HybirdSN模型比3D-CNN模型的计算效率更高。在小的训练数据上也显示出了优越的性能。
2、实现步骤
(1)PCA主成分分析
- 首先,对于输入的高光谱图像,进行了主成分分析(PCA),减少了第三维数据的一些光谱波段,只保留了对识别物体重要的空间信息;
- 将数据的输入规范化为 M ∗ N ∗ B M*N*B M∗N∗B;
(2)将数据划分为三维小块
- 随后将数据划分为重叠的三维小块 S ∗ S ∗ B S*S*B S∗S∗B(“厚度”不变),小块的label由中心像素的label决定。
(3)三维卷积提取光谱维度特征
- 之后,使用3D-卷积获取光谱维度和图像间的特征;
- 三次三维卷积中,卷积核的尺寸依次为:
- 8×3×3×7×1(8是他自己设计的卷积核的个数, 3 ∗ 3 ∗ 7 3*3*7 3∗3∗7是一个三维卷积核的大小,1是因为一共只有1组图,所以再乘个1)、
- 16×3×3×5×8、
- 32×3×3×3×16。
- 在三维卷积中,生成第i层第j个feature map在空间位置(x, y,z)的激活值,记为 v i , j x , y , z v_{i,j}^{x,y,z} vi,jx,y,z,公式2如下图所示:
(4)二维卷积卷图像特征
- 使用2D-卷积获取图像本身的特征;
- 二维卷积中,卷积核的尺寸为64×3×3×576(576为二维输入特征图的数量)。
- 在二维卷积中,第 i i i层第 j j j个feature map在空间位置(x, y)处的值,记为 v i , j x , y v_{i,j}^{x,y} vi,jx,y,其生成公式1如下:
(5)全连接输出
- 接下来是一个 flatten 操作(为了输出给全连接层,所以必须是一条二维数据),变为 18496 维的向量;
- 接下来依次为256,128节点的全连接层,都使用比例为0.4的 Dropout(就是扔掉40%的数据,防止模型过拟合);
- 最后输出为 16 个节点,是分类的种数(之所以是16类,是因为它选取的数据集,本身的标签最多就是16类,参见下面的表格)。
3、数据集来源
实验使用了三个公开的HSI数据集:Indian Pines (IP)、University of Pavia (UP)和Salinas Scene (SA)。
数据集 | 图像维数 | 波长范围 | 光谱波段个数 | 地面图像被划分为多少类 |
---|---|---|---|---|
Indian Pines (IP) | 145 ∗ 145 145 *145 145∗145 | 400 ~ 2500 nm | 224 | 16 |
University of Pavia (UP) | 610 ∗ 340 610 *340 610∗340 | 430~ 860 nm | 103 | 9 |
Salinas Scene (SA) | 512 ∗ 217 512 * 217 512∗217 | 360 ~2500 nm | 224 | 16 |
4、分类效果对比
5、每层的参数及输出
二、工程实现
注意:
- 本次的实验的运行环境为colab,需要科学上网。
1、数据准备+引入基本函数库
首先取得数据——Indian pines(这是论文中引用的三个数据集中的一个)
#数据准备
! 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
2、定义 HybridSN类
包括:
- 三维卷积部分的定义(细节见 一.2.(3)部分)
- 二维卷积的定义(细节见 一.2.(4)部分)
- flatten 操作(细节见 一.2.(5)部分)
- 全连接层(细节见 一.2.(5)部分)
- 40%的 Dropout(细节见 一.2.(5)部分)
- 最后输出为 16 个节点(细节见一.2.(5)部分)
代码实现:
##定义 HybridSN 类
class_num = 16
class HybridSN(nn.Module