Python使用深度神经网络对高光谱图像进行土地覆盖分类

一、前言

高光谱成像是遥感中的一项重要技术,它收集从可见光到近红外波长的电磁波谱。 高光谱成像传感器通常提供来自地球表面同一区域的数百个窄光谱带。 在高光谱图像 (HSI) 中,每个像素都可以看作是一个高维向量,其条目对应于特定波长的光谱反射率。

HSI 具有区分细微光谱差异的优势,已广泛应用于作物分析、地质测绘、矿产勘探、国防研究、城市调查、军事监视、洪水跟踪等各个领域。

二、数据介绍

我们将使用帕维亚大学高光谱图像进行分类。 帕维亚大学 HSI 是在意大利北部帕维亚上空的一次飞行活动中由 ROSIS 传感器获取的。 HSI 数据可在 Group De Inteligencia Computacional (GIC) 上公开获得。

帕维亚大学 HSI 有 103 个光谱波段,包含 610 * 340 像素,但图像的光谱样本不包含定义为零 (0) 的信息,必须在分析前将其丢弃。 几何分辨率为1.3米。 HSI 的 groundtruth 分为 9 类。 ground truth 的信息如下图所示。

三、数据读取

(1)相关依赖库导入

import matplotlib.pyplot as plt

import numpy as np
import earthpy.plot as ep
import seaborn as sns
import earthpy.spatial as es

import plotly.graph_objects as go
import plotly.express as px

from scipy.io import loadmat

import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.metrics import (accuracy_score,
                             confusion_matrix, classification_report)

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Input, Dense, Dropout, BatchNormalization
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

from tqdm import tqdm

(2)数据读入

通常,此类数据采用 .mat 文件的形式。 所以我们需要读取数据并将其转换为 pandas 数据框以供进一步处理。

data = loadmat('PaviaU.mat')['paviaU']

gt = loadmat('PaviaU_gt.mat')['paviaU_gt']

df = pd.DataFrame(data.reshape(data.shape[0]*data.shape[1], -1))

df.columns = [f'band{i}' for i in range(1, df.shape[-1]+1)]

df['class'] = gt.ravel()

(3)真彩色合成

让我们看看 Pavia 大学 HSI 的 ground truth,黑色代表没有信息的像素,在分类过程中将被丢弃。

def plot_data(data):
  fig = plt.figure(figsize=(12, 10))
  plt.imshow(data, cmap='nipy_spectral')
  plt.colorbar()
  plt.axis('off')
  plt.show()

plot_data(gt)

四、神经网络模型构建

一般来说,神经网络是一种用于模拟人脑活动的技术——具体来说,是模式识别和输入通过模拟神经连接的各个层。

深度神经网络定义为具有输入层、输出层和至少一个位于其间的隐藏层的网络。 每个层在一个过程中执行特定类型的排序和排序,有些人将其称为“特征层次结构”。 这些复杂的神经网络的主要用途之一是处理未标记或非结构化数据。 “深度学习”一词也用于描述这些深度神经网络,因为深度学习代表了机器学习的一种特定形式,其中使用人工智能方面的技术寻求以超越简单输入/输出协议的方式对信息进行分类和排序。

在本文中,我们使用具有 12 个全连接层或密集层、批归一化层和 Dropout 层的深度神经网络。

(1)深度神经网络的实现

让我们以 70:30 的比例以分层方式将数据拆分为训练和测试。

X = df[df['class']!=0].iloc[:, :-1].values

y = tf.keras.utils.to_categorical(df[df['class']!=0].iloc[:, -1].values , 
                                  num_classes= np.unique(gt).shape[0], 
                                  dtype='float32') 

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.7, stratify = y)

print(f"Train Data: {X_train.shape}\nTest Data: {X_test.shape}")

让我们使用 Keras 构建深度神经网络 (DNN),用于帕维亚大学 HSI 的土地覆盖分类。 提到的深度神经网络有一个修正线性单元(ReLU)作为激活函数。

model = Sequential(name='Pavia_University')

model.add(Input(shape = X_train[0].shape, name = 'Input_Layer'))

model.add(BatchNormalization(name = 'BatchNormalization'))

model.add(Dense(units = 128, activation= 'relu', name = 'Layer1'))
model.add(Dense(units = 128, activation= 'relu', name = 'Layer2'))
model.add(Dense(units = 128, activation= 'relu', name = 'Layer3'))
model.add(Dense(units = 128, activation= 'relu', name = 'Layer4'))

model.add(Dropout(rate = 0.2, name = 'Dropout1',))

model.add(Dense(units = 64, activation= 'relu', name = 'Layer5'))
model.add(Dense(units = 64, activation= 'relu', name = 'Layer6'))
model.add(Dense(units = 64, activation= 'relu', name = 'Layer7'))
model.add(Dense(units = 64, activation= 'relu', name = 'Layer8'))

model.add(Dropout(rate = 0.2, name = 'Dropout2'))

model.add(Dense(units = 32, activation= 'relu', name = 'Layer9'))
model.add(Dense(units = 32, activation= 'relu', name = 'Layer10'))
model.add(Dense(units = 32, activation= 'relu', name = 'Layer11'))
model.add(Dense(units = 32, activation= 'relu', name = 'Layer12'))

model.add(Dense(units = y_train.shape[1], activation= 'softmax', name = 'Output_Layer'))

model.summary()

(2) 神经网络训练

为了训练定义的 DNN,我使用了 Adam 优化器、分类交叉熵、作为度量的准确性和回调。 下面的代码用于编译和训练模型。

# Compile
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

# Callbacks
es = EarlyStopping(monitor = 'val_loss',
                   min_delta = 0,
                   patience = 15,
                   verbose = 1,
                   restore_best_weights = True)

checkpoint = ModelCheckpoint(filepath = 'Pavia_University_Model.h5', 
                             monitor = 'val_loss', 
                             mode ='min', 
                             save_best_only = True,
                             verbose = 1)
# Fit
history = model.fit(x = X_train, 
          y = y_train,
          validation_data = (X_test, y_test), 
          epochs = 100,
          callbacks = [es, checkpoint])

(3)Adam优化函数

Adam 是一种优化算法,可用于替代经典的随机梯度下降程序,以基于训练数据迭代更新网络权重。 使用 adam 优化器的优点是:

  • 易于实施。

  • 计算效率高。

  • 内存需求小。

  • 对梯度的对角线重新缩放不变。

  • 非常适合数据和/或参数较大的问题。

  • 适用于非固定目标。

  • 适用于具有非常嘈杂/或稀疏梯度的问题。

  • 超参数具有直观的解释,通常需要很少的调整。

(4)分类交叉熵

交叉熵是用于多类分类问题的默认损失函数。 在这种情况下,它旨在用于多类分类,其中目标值位于集合 {0, 1, 3, …, n} 中,其中每个类都分配有一个唯一的整数值。 在数学上,它是最大似然推理框架下的首选损失函数。 这是首先要评估的损失函数,只有在有充分理由的情况下才会更改。

交叉熵将计算一个分数,该分数总结了问题中所有类别的实际和预测概率分布之间的平均差异。 分数被最小化,完美的交叉熵值为 0。

通过在编译模型时指定“categorical_crossentropy”,可以将交叉熵指定为 Keras 中的损失函数。

(5)回调

EarlyStopping:减少神经网络过度拟合的一种技术是使用提前停止。 如果模型没有真正学到任何东西,提前停止可以通过终止训练过程来防止模型过度训练。 这非常灵活——您可以控制要监控的指标,需要更改多少才能被视为“仍在学习”,以及在模型停止训练之前它可以连续停顿多少个 epoch。

ModelCheckpoint:此回调将在每个成功的纪元后将您的模型作为检查点文件(hdf5 或 h5 格式)保存到磁盘。 您实际上可以将输出文件设置为根据纪元动态命名。 您还可以将损失值或准确度值作为日志文件名的一部分写入。

(6)构建图

训练期间的准确度和损失图的代码以及输出如下所示,X 轴代表时期,Y 轴代表百分比。

hist = pd.DataFrame(data= history.history)

fig = go.Figure()

fig.add_trace(go.Scatter(x = hist.index, y = hist.loss.values,
                    mode='lines+markers',
                    name='Train Loss'))

fig.add_trace(go.Scatter(x = hist.index, y = hist.accuracy.values,
                    mode='lines+markers',
                    name='Train Accuracy'))

fig.add_trace(go.Scatter(x = hist.index, y = hist.val_loss.values,
                    mode='lines+markers', name='Test loss'))

fig.add_trace(go.Scatter(x = hist.index, y = hist.val_accuracy.values,
                    mode='lines+markers', name='Test Accuracy'))

fig.show()

五、结果

分类模型的实证结果显示在表格分类报告中。

# predictions
pred = np.argmax(model.predict(X_test), axis=1)

# Classification Report
print(classification_report(pred, np.argmax(y_test, 1),
      target_names = ['1. Asphalt', '2. Meadows', '3. Gravel', '4. Trees', 
                 '5. Painted metal sheets','6. Bare Soil', '7. Bitumen', 
                 '8. Self-Blocking Bricks', '9. Shadows']))

让我们看看混淆矩阵——一种表格表示形式,通常用于描述分类模型(或“分类器”)在一组真实值已知的测试数据上的性能。

plt.figure(figsize = (10,7))

classes = ['Asphalt', 'Meadows', 'Gravel', 'Trees', 'Painted metal sheets',
            'Bare Soil', 'Bitumen', 'Self-Blocking Bricks', 'Shadows']

mat = confusion_matrix(np.add(pred, 1), np.add(np.argmax(y_test, 1), 1))

df_cm = pd.DataFrame(mat, index = classes, columns = classes)

sns.heatmap(df_cm, annot=True, fmt='d')

plt.show()

最后,让我们可视化分类图:

l = []

for i in tqdm(range(df.shape[0])):
  if df.iloc[i, -1] == 0:
    l.append(0)
  else:
    l.append(np.argmax(model.predict(df.iloc[i, :-1].values.reshape(-1, 103)), 1))
    
q = np.array(l).reshape(gt.shape).astype('float')

plot_data(q)

六、结论

本文正式介绍了帕维亚大学 HSI 的高光谱图像及其应用、深度神经网络 (DNN) 土地覆盖分类的实现,并以分类报告、混淆矩阵和分类图的形式对结果进行了解释。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/5150.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue项目的打包上线步骤

Vue项目的打包上线步骤一、打包之前的路由模式二、性能分析和CDN的应用2.1 性能分析2.2 webpack排除打包2.3 CDN文件配置2.4 注入CDN文件到模板一、打包之前的路由模式 两种路由模式 hash模式 : #后面是路由路径,特点是前端访问,#后面的变化不…

[架构之路-144]-《软考-系统分析师》- 7-企业信息化战略与实施-1-概念、方法、与企业战略/IT战略/业务重组的关系

前言:所谓系统,系统是由相互作用相互依赖的若干组成部分结合而成的,具有特定功能的有机整体,而且这个有机整体又是它从属的更大系统的组成部分。任何现实世界的一定的活动范围,都是系统,任何计算机组成的软…

泰克示波器校准失败

全球每10位工程师中就有8位信赖泰克示波器,帮助他们诊断和测试明天的设计,泰克拥有全部的示波器系列,丰富的产品功能,广泛的分析功能,然而示波器会随着使用年限、使用频率以及操作等出现各种各样的问题,那么…

【深入理解二叉树OJ题】

文章目录一、单值二叉树二、二叉树最大深度三、翻转二叉树四、检查两棵树是否相同五、对称二叉树六、二叉树遍历一、单值二叉树 航班直达! 前序遍历的思想。 思路:先判断左右节点是否存在,再判断根分别和左右节点的值是 否相等。 1.如果左…

智联物联分享之物联网协议MQTT简述,MQTT协议特点

接触过物联网设备的朋友们对于MQTT应该都不陌生吧,那MQTT是什么呢?智联物联小编为大家分享下MQTT的简述与特点。 MQTT(Message Queuing Telemetry Transport)基于客户端/服务器的信息发布/订阅的物联网常用传输协议。1999年由开发…

今年面试好激烈!

金三银四过去一半,市场火热,但是大家就业压力却没有缓解多少。 很多粉丝后台留言,Java程序员面临的竞争太激烈了…… 我自己也有实感,多年身处一线互联网公司,虽没有直面过求职跳槽的残酷,但经常担任技术面…

主成分分析(PCA)原理

主成分分析(PCA)原理 在高维数据处理中,为了简化计算量以及储存空间,需要对这些高维数据进行一定程度上的降维,并尽量保证数据的不失真。PCA和ICA是两种常用的降维方法。 PCA:principal component analysi…

计算机软件著作权登记申请流程和需要的时间

计算机软件著作权登记申请流程主要包含: 1、系统网页登记 官网 中国版权保护中心 —我要登记(软件登记)—计算机软件著作权登记申请—登陆机构账号—开始填写信息登记。如果著作权人是个人点击个人,如果著作人是单位点击机构。 网…

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

本文目录 前言一、创建Maven项目二、三层架构说明三、搭建三层架构1. 创建父子Maven项目2. 定义依赖关系2.1 父项目统一管理依赖2.2 子项目增加依赖四、常见问题QA1. JDK问题2. Maven问题最后前言 因为可能还有很多同学还不清楚上下文,所以简单介绍一下这个专栏要做的事: 天…

离线GPU服务器配置虚拟环境

给linux服务器安装Anaconda 按理说,应该装miniconda,原因如下 anaconda 是包含常用包的版本,miniconda 是精简版,推荐使用 miniconda。Anaconda同时打包了1500个常用的软件包, 可以一次性安装到你到python环境中, 这样你就不用再一个个安装软…

日入500+的程序员都在用的“接私活”平台

网上总说程序员的薪资很高,这我可就不同意了: 程序员的薪资哪里是很高,而是非常高!而会接私活的程序员更是能拿到更高的收入!作为一个程序员,这些接私活的网站一定要收藏起来,让你在“八小时外…

Excel使用技巧:如何打印指定区域?如何设置禁止打印?

我们在打印Excel表格的时候,有时候只需要打印部分内容,那如何设置Excel打印选定的区域呢?如果不想他人随意打印表格,又该如何设置呢?下面小编就来分享一下设置的方法。 Excel打印指定区域(方法一&#xff0…

华为路由器 高级ACL配置

高级ACL 与基本ACL相比,高级ACL提供了更准确、丰富、灵活的规则定义方法。比如根据源IP地址、目的IP地址、IP协议类型、TCP源/目的端口、UDP源/目的端口号、分片信息和生效时间段等信息来定义规则,对IPv4报文进行过滤。 高级 ACL 接口调用方向的建议 …

图解Redis,Redis主从复制与Redis哨兵机制

目录专栏导读一、Redis复制是什么?二、Redis复制能干嘛?三、Redis复制的缺点1、复制延迟2、master宕机四、乐观复制策略五、Redis复制常用命令1、info replication2、replicaof 主库Ip 主库port3、slaveof 主库IP 主库port4、slaveof no one六、Redis复制…

centos 7安装mysql

今天在centos 7上安装mysql数据库,遇到了些问题以及解决方法,记录一下。1、下载mysql安装包wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm出现跟上面界面这样子,说明是ok的了,接下来&#xf…

盒子拖拽效果,原生js实现

原生js实现拖拽效果 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevic…

【Linux内网穿透】使用SFTP工具快速实现内网穿透

文章目录内网穿透简介1. 查看地址2.局域网测试连接3.创建tcp隧道3.1. 安装cpolar4.远程访问5.固定TCP地址内网穿透简介 是一种通过公网将内网服务暴露出来的技术&#xff0c;可以使得内网服务可以被外网访问。以下是内网穿透的一些应用&#xff1a; 远程控制&#xff1a;通过内…

【C语言】文件操作

这里写目录标题文件1.文件的打开和关闭2.文件操作函数1.字符操作函数2.文本行操作函数3.格式化输入输出4.二进制输入输出5.文件的随机读写fseekftellrewind3.文本文件和二进制文件4.文件读取结束的判定5.文件缓冲区文件 使用文件可以将数据直接存放再电脑的硬盘上&#xff0c;…

yolov5模型训练流程

yolov5简介 YOLOv5(You Only Look Once)是由 UitralyticsLLC公司发布的一种单阶段目标检测算 法&#xff0c;YOLOv5 相比YOLOv4 而言&#xff0c;在检测平均精度降低不多的基础上&#xff0c;具有均值权重文件更小&#xff0c;训练时间和推理速度更短的特点。YOLOv5 的网络结构…

11 容器常用命令

查看当前正在运行的容器有哪些&#xff1f; docker ps [options] exit &#xff1a;推出容器并停止 ctrl p q : 推出&#xff0c;但是容器还是运行 docker start id : 启动容器 docker restart id: 重启容器 docker stop id/name: 通过id或者name去停止容器 docker kill…
最新文章