【代码分析】用于高光谱图像分类的DRCNN代码解析

**这篇文章是DRCNN高光谱图像分类《Diverse Region-Based CNN for Hyperspectral Image Classification》论文解析https://blog.csdn.net/weixin_44794449/article/details/88718383**的相关文章,主要是解析了这篇论文的代码构成以及相关解析

代码文件的构成

【代码分析】用于高光谱图像分类的DRCNN代码解析_第1张图片
用于高光谱分类的代码构成如上图所示,由五个文件构成。其中,construct_multi_mat.py用于构造实验所需要用到的训练集和测试集,data_util.py用于文件的读取与存储操作以及路径操作,HSI_multi_SPA.py用于对六个卷积神经网络分支的训练和测试操作,HSI_multiSPA_union.py用于对整合了六个卷积神经网络分支的大的网络进行训练和测试,main.py分别调用了以上两个函数并对他们的参数进行了设置,控制程序的运行过程。

construct_multi_mat.py的构成和解析

首先从main函数开始
【代码分析】用于高光谱图像分类的DRCNN代码解析_第2张图片
首先将数据集先读取到mdata中,然后将mdata转换为矩阵,然后将转换好的数据集进行标准化操作,此处调用sample_wise_standardization函数
【代码分析】用于高光谱图像分类的DRCNN代码解析_第3张图片
由于要对整个图像划分区域后取patch操作,因此需要对原图像周围进行padding,此处调用image_pad函数,该函数可以对图像以及标签进行padding操作,此处使用了numpy中的pad函数,对于通道数为3的图像来说,采用对称填充的方式(这里的通道数是经过PCA将为之后的高光谱图像的通道),而对于标签来说,同样要进行padding操作,而对于标签使用的是常量填充
【代码分析】用于高光谱图像分类的DRCNN代码解析_第4张图片
然后接下来进入构造函数的主体部分,构造用于训练和测试的patch的函数construct_spatial_patch
【代码分析】用于高光谱图像分类的DRCNN代码解析_第5张图片
首先需要对所构造的数据集的类型进行判断,文中提到要构造六个针对不同区域的卷积神经网络分支来进行训练和测试,如果是训练集的构造,则首先读获取总共有有多少累,然后每个类分别划分上下左右中间全局六个区域,这里主要将区域对应的像素值放到列表中,在所有类的patch全部取完之后将他们转换成矩阵,然后返回。
【代码分析】用于高光谱图像分类的DRCNN代码解析_第6张图片
对于测试集的构造的主题查不多,都是分别在六个区域取patch后放入列表然后又转化成矩阵最后返回
论文中提到本文的创新之处有一点是通过数据增强手段增加了样本的数量,而不同于普通的旋转剪切等手段,本文是用了添加高斯噪声的方式来时样本数量翻倍,而在代码中主要是通过random_flip这一函数实现
【代码分析】用于高光谱图像分类的DRCNN代码解析_第7张图片
首先将六个区域patch数据首先读进去,然后进行逐像素的遍历,datas代表了没有添加高斯噪声的patch数据以及添加了高斯噪声之后的patch数据,他们按照逐像素的原则一起放进了datas中,其他的xrs、xls、xus、xbs、xcs也同理,而标签为两个同样的标签一起放入label中(添加高斯噪声并不改变标签),而numpy中预置了添加高斯噪声的函数numpy.fliplr()。

在这里插入图片描述
之后将他们打乱顺序后返回,至此数据集的构造完成了。执行此程序后生成了mask_train.H和mask_test_patch.H
程序代码的调用主要是通过main.py这个函数来完成,其构造为
【代码分析】用于高光谱图像分类的DRCNN代码解析_第8张图片
其作用主要是封装好一些参数之后通过循环将这些封装好的参数送入到HSI_multi_SPA.py和HSI_multiSPA_union.py中,其中第一个函数为留个小网络分支的训练和测试用的数据,第二个函数是将六个生成好的网络模型放在一起形成大网络的训练和测试用的函数。
首先来看HSI_multi_SPA这个文件,这个文件主要是负责六个分支小网络的训练和测试用的。
【代码分析】用于高光谱图像分类的DRCNN代码解析_第9张图片
首先是为这个命令的调用设置了一些参数,epoch用来控制悬链过程中的epoch轮数,mode用来控制是训练还是测试,train和testkey用来去顶数据集中的数据的title(这个在构造数据集中已经设置好了)ksize1和ksize2用来控制每个区域的行和列的大小。
【代码分析】用于高光谱图像分类的DRCNN代码解析_第10张图片
之后定义了用来训练上下左右以及全局区域的网络结构如下图
【代码分析】用于高光谱图像分类的DRCNN代码解析_第11张图片
其中的输入到3x3的128个卷积核的卷积层为conv0_spat,输入到5x5的64个卷积核的卷积层为conv5_spat,在conv0_spat进行皮归一化和relu函数激活之后在进行的3x3的64 个卷积核的卷积层为conv6_spat,3x3的128个卷积核的卷积层为conv1_spat,在进行relu激活在进行1x1的128 个卷积核的卷积之后形成的是conv3_spat,最后将这三个卷积层进行叠加使用的是L.concatenate([conv3_spat,conv6_spat,conv5_spat],axis=-1),最后将其进行归一化后拉成一个向量,使用softmax输出分类结果,齐总顶一顶鹅学习率的大小为0.001,使用的loss是交叉熵损失以及SGD随机梯度下降法。
对于中央区域来说文中使用了另外一种网络结构
【代码分析】用于高光谱图像分类的DRCNN代码解析_第12张图片
对应的函数名为SMALL_net
【代码分析】用于高光谱图像分类的DRCNN代码解析_第13张图片
其结构比较简单,就是单纯的两次卷积之后全连接,其代码表示也比较清楚,就不再多说了。
【代码分析】用于高光谱图像分类的DRCNN代码解析_第14张图片
之后作者定义了一个函数作为两种网络结构的选择器,如果patch得分大小为3x3则使用上面定义的small_net,若为其他的patch大小则使用gw_net,这也与论文中所写的思路相同。
【代码分析】用于高光谱图像分类的DRCNN代码解析_第15张图片
然后定义了训练和测试函数,这里多为读取数据以及保存训练模型的操作,其中定义了epoch,学习率,验证集比率等参数,而测试函数中则定义了读取模型结构和权重以及预测函数,这里也不在多说了。
与HSI_multi_SPA这个文件对应,HSI_multi_SPA-union这个问价对应的则是融合这六个网络分支的大网络的训练以及测试,其结构与上个文件的结构几乎一致,主要是构造了UNION_net这个函数
【代码分析】用于高光谱图像分类的DRCNN代码解析_第16张图片
【代码分析】用于高光谱图像分类的DRCNN代码解析_第17张图片
这里的函数主要是针对六个已经训练完成的网络进行了读取,并用concatenate函数将他们组合在一起,然后把全连接,在BN归一化,再relu激活,在全连接等等操作,最后把整合整个网络结构,定义其学习率等参数,最后返回模型。
【代码分析】用于高光谱图像分类的DRCNN代码解析_第18张图片
其他部分与六个分支网络的并无不同,因此这个文件不在详细说明了,整个代码的结构解析基本就到此结束了。
结束(2019.4.22完成)

你可能感兴趣的:(代码笔记)