【HSI】高光谱的数据集分类深度学习实战及代码理解

常用的高光谱遥感影像数据集(详细介绍+下载链接) 常用的高光谱遥感影像数据集前言数据集Indian PinesSalinasPavia Centre and UniversityPavia CentrePavia UniversityKennedy Space Center (KSC)Botswana下载链接 前言 博主最近在做基于卷积神经网络的高光谱遥感影像分类的研究,所以简要介绍一下常用的高光谱遥感影像数据集。 (1)什么是高光谱遥感? 高光谱分辨率遥感是用很窄而连续的光谱通道对地物持续遥感成像的技术。在可见光到短波红外波段其光谱分辨率高达纳米(nm) 阅读详情
AI摘要

本文介绍了一个基于高光谱图像(HSI)的深度学习分类系统,涵盖了从数据预处理到模型训练的全过程。重点讲解了配置文件编写、图像处理、数据集构建、模型设计、训练流程等内容。

【HSI】高光谱的数据集分类深度学习实战及代码理解


对整个工程的代码框架划分

在这里插入图片描述

将整个深度学习的框架基本划分为:

  • configs:配置文件
  • data:处理数据高光谱图像数据
  • datasets:数据集存放
  • model:深度学习训练模型
  • tool:用于模型的训练、测试和图像的展示
  • weights:梯度权重值的保存
  • main:主函数的运行

在不同的文件下面进行相应的编写,同时便于阅读和后续的修改和移植性的提高

一、配置文件编写

datasets_type = 'HSI Data Sets'
data_root = '/home/students/master/2022/wangzy/PyCharm-Remote/HSIC_train/datasets/PaviaU.mat'
image_name = 'paviaU'
gt_name = 'paviaU_gt'  # 在数据库上标注好的label一般被默认为是真实的值,也就是GT了


phase = ['train', 'test', 'no_gt']
pca_num = 1
train_set_num = 30
patch_size = 27

data = dict(
    data_path=data_root,
    image_name=image_name,
    gt_name=gt_name,
    train_set_num=train_set_num,
    patch_size=patch_size,
    pca=pca_num,
    train_data=dict(
        phase=phase[0]
    ),
    test_data=dict(
        phase=phase[1]
    ),
    no_gt_data=dict(
        phase=phase[2]
    )
)
train = dict(
    # 优化器的相应数据
    optimizer=dict(
        typename='SGD',
        lr=lr,
        momentum=0.9,  # 动量
        weight_decay=1e-4  # 权重衰减
    ),

    train_model=dict(
        gpu_train=True,
        gpu_num=1,
        workers_num=16,
        epoch=100,
        batch_size=32,
        # 学习率的相应参数
        lr=lr,
        lr_adjust=True,
        lr_gamma=0.1,
        lr_step=60,
        save_folder='./weights/',
        save_name='model_CNN1D',
        reuse_model=False,
        reuse_file='./weights/model_CNN1D_Final.pth'
    )
)

test = dict(
    batch_size=1000,
    gpu_train=True,
    gpu_num=1,
    workers_num=16,
    model_weights='./weights/model_CNN1D_Final.pth',
    save_folder='./result'
)

配置文件的编写主要是为了,在后续调整模型时,方便修改相应的数据参数,常用的使用和调整的包含了:

data_root = '/home/students/master/2022/wangzy/PyCharm-Remote/HSIC_train/datasets/PaviaU.mat'   #高光谱数据集
lr = 1e-2		#学习步长
pca_num = 1		#高光谱图像PCA后的通道数
train_set_num = 30		#训练的次数
patch_size = 27			#对高光谱数据集划分patch的尺寸 27*27
epoch=100,				#epoch的次数
batch_size=32,			#图像的数量

在训练模型调参时,基本的改动都在configs的文件中来进行修改

二、高光谱图像的处理

2.1图像数据变换

在现在的处理中,主要时mat文件的导入,一张图像的数据大体上分为了[W,H,C],长宽和通道数,以paviaU数据集来进行举例,torch([32, 103, 610, 340]),大约包含了这些参数,32为图片数量,103的通道数和[610,340]的长宽

对原始图像的处理基本分为:

  • 图像数据归一化
  • 标签转换
  • 提取PCA图像数据
  • 构建样本和划分训练集,测试集和地图信息

可以根据自己对图像处理的需求来构建相应的子函数

(1)图像数据归一化

def one_zero_norm(image):
    channel, height, width = image.shape
    data = image.view(channel, height * width)
    data_max = data.max(dim=1)[0]
    data_min = data.min(dim=1)[0]

    data = (data - data_min.unsqueeze(1)) / (data_max.unsqueeze(1) - data_min.unsqueeze(1))  # 在第二个维度上插入一个维度

    return data.view(channel, height, width)
def pos_neg_norm(image):
    channel, height, width = image.shape
    data = image.view(channel, height * width)
    data_max = data.max(dim=1)[0]
    data_min = data.min(dim=1)[0]

    data = -1 + 2 * (data - data_min.unsqueeze(1)) / (data_max.unsqueeze(1) - data_min.unsqueeze(1))

    return data.view(channel, height, width)
def std_norm(image):
    image = image.permute(1, 2, 0).numpy()
    trans = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize(torch.tensor(image).mean(dim=[0, 1]), torch.tensor(image).std(dim=[0, 1]))
    ])

    return trans(image)

根据要求的不同来对图像进行相应的处理

# (x - mean(x))/std(x) normalize to mean: 0, std: 1
# (x - min(x))/(max(x) - min(x))  normalize to (0, 1) for each channel
# -1 + 2 * (x - min(x))/(max(x) - min(x))  normalize to (-1, 1) for each channel

数据的分布范围不同,采用不同的函数

(2)标签转换

def label_transform(gt):
    '''
        function:tensor label to 0-n for training
        input: gt
        output:gt
        tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
        -> tensor([-1.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.])
    '''
    label = torch.unique(gt)  # 返回标签label中的不同值
    gt_new = torch.zeros_like(gt)  # zeros_like(a)的目的是构建一个与a同维度的数组,并初始化所有变量为零。
    # zeros,则需要代入参数

    for each in range(len(label)):  # 长度为10
        indices = torch.where(gt == label[each])

        if label[0] == 0:
            gt_new[indices] = each - 1
        else:
            gt_new[indices] = each

    # tensor([-1.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.])
    # labeL_new = torch.unique(gt_new)

    return gt_new

将标签依次向下减小,将图像的背景label定义为-1,从而使标签信息可以分隔开来

(3)提取PCA图像数据

高光谱的数据通道数太多了,进行空间卷积的话,会受到影响,通过PCA下降后更方便进行2D卷积

def extract_pc(image, pc=3):

    channel, height, width = image.shape
    data = image.contiguous().reshape(channel, height * width) # 存在contiguous函数,在改变data的值后
    data_c = data - data.mean(dim=1).unsqueeze(1)
    # 计算一个矩阵或一批矩阵 input 的奇异值分解
    u, s, v = torch.svd(data_c.matmul(data_c.T)) # data_c矩阵乘以data_c的转置
    sorted_data, indices = s.sort(descending=True) # 将s中的数按降序进行排列
    image_pc = u[:, indices[0:pc]].T.matmul(data)
    return image_pc.reshape(pc, height, width)

(4)构建样本和划分训练集,测试集和地图信息

def select_sample(gt, ntr):

构建函数用于划分数据集的数量和返回相应的参数

train_num_array = [30, 150, 150, 100, 150, 150, 20, 150, 15, 150, 150, 150, 150, 150, 50, 50]
sel_num = train_num_array[each-1]

sel_num = torch.tensor(sel_num)  # tensor(30)

# 将标签进行打乱
rand_indices0 = torch.randperm(class_num)  # torch.randperm 给定参数n,返回一个从0到n-1的随机整数排列
rand_indices = indices_vector[rand_indices0]

# 划分训练集train,测试集test
# 划分打乱后的随机整数排列
tr_ind0 = rand_indices0[0:sel_num]  # torch.Size([30])
te_ind0 = rand_indices0[sel_num:]  # 将剩下的数据用作测试集

# 划分随机整数排列对应的gt
tr_ind = rand_indices[0:sel_num]  # torch.Size([30])
te_ind = rand_indices[sel_num:]

以数组的形式来存储数据集中不同类别的训练集和划分数据集,将相应的数据和指标进行划分来存储和返回

# 将6种数据参数进行保存
data_sample = {'train_indices': train_indices, 'train_num': train_num,
               'test_indices': test_indices, 'test_num': test_num,
               'no_gt_indices': no_gt_indices, 'no_gt_num': no_gt_num.unsqueeze(0)
               }

2.2 数据整合

def get_train_test_set(cfg):

    # 从cfg中导入设定好的参数
    data_path = cfg['data_path']  # 导入存放的地址
    image_name = cfg['image_name']  # paviaU
    # 这个其实就是103通道的整个图像的信息

    gt_name = cfg['gt_name']  # 'paviaU_gt'
    # 这个是地图的特征信息,同时具有标签值
    # [0,0,1,1,1,4,4,4,]这种的标签图

    train_set_num = cfg['train_set_num']  # 30,每一次数据集训练的次数
    patch_size = cfg['patch_size']  # 27,用于切分图像的尺寸
    
    data = io.loadmat(data_path)  # 从相应的文件夹导入

    img = data[image_name].astype('float32')  # .astype转换数组的数据类型  (610, 340, 103) [w,h,c]
    gt = data[gt_name].astype('float32')  # 转换成float32  (610, 340) ,这个数据从数据库中导入,只有一个数据

    img = torch.from_numpy(img)  # 转tensor   # torch.Size(610, 340, 103)
    gt = torch.from_numpy(gt)  # torch.Size(610, 340)

    img = img.permute(2, 0, 1)  # 变换tensor的维度,把channel放到第一维CxHxW  # torch.Size(103, 610, 340)
    img = pre_fun.std_norm(img)  # 归一化,torch.Size(103, 610, 340) 将数据分布在(0,1)之间

    # label transform  0~9 -> -1~8
    # 将标签值进行转换,应该在mat文件中,对不同的物体的label值就做好了定义
    img_gt = pre_fun.label_transform(gt)  # torch.size(610, 340)

    # construct_sample:切分patch,储存每个patch的坐标值
    # img_pad的值为([103, 636, 366]),
    # img_pad_indices的值为([207400, 4])
    img_pad, img_pad_indices = pre_fun.construct_sample(img, patch_size)

    # (1)select_sample:用img_gt的标签信息划分样本
    # (2)得到的data_sample = {'train_indices': train_indices, 'train_num': train_num,
    #                    'test_indices': test_indices, 'test_num': test_num,
    #                    'no_gt_indices': no_gt_indices, 'no_gt_num': no_gt_num.unsqueeze(0)
    #                    }
    data_sample = pre_fun.select_sample(img_gt, train_set_num)

    # data_sample再添加几项数据
    data_sample['pad_img'] = img_pad
    data_sample['pad_img_indices'] = img_pad_indices
    data_sample['img_gt'] = img_gt  # 转化后的特征标签图的数据
    data_sample['ori_gt'] = gt  # 原始特征标签图的数据

    # print('data_sample.keys()',data_sample.keys())
    # dict_keys(['train_indices', 'train_num', 'test_indices', 'test_num',
    # 'no_gt_indices', 'no_gt_num', 'pad_img', 'pad_img_indices', 'img_gt', 'ori_gt'])

    if cfg['pca'] > 0:
        img_pca = pre_fun.extract_pc(img, cfg['pca'])
        img_pca = pre_fun.one_zero_norm(img_pca)
        img_pca = pre_fun.std_norm(img_pca)

        img_pca_pad, _ = pre_fun.construct_sample(img_pca, patch_size)

        data_sample['img_pca_pad'] = img_pca_pad

    return data_sample

主要功能:

  • 数据集train,test
  • 加载数据集,转化为tensor,label transform,
  • 切分patch,储存每个patch的坐标值,
  • 由gt划分样本,最终得到data_sample

在这个函数中主要调用2.1中构建的子函数,来对图像数据进行处理,储存相应的处理完的图像数据

输出参数:

  • ‘train_indices’, ‘train_num’, 训练集的坐标,训练集的数目

  • ‘test_indices’, ‘test_num’, 测试集的坐标,测试集的数目

  • ‘no_gt_indices’, ‘no_gt_num’, 背景图的坐标和数目

  • ‘pad_img’, ‘pad_img_indices’, patch后的图像数据和坐标

  • ‘img_gt’, ‘ori_gt’ 图像划分的原始数据

2.3 数据索引

主要使用的是class HSI_data(data.Dataset),将get_train_test_set(cfg)返回的参数进行带入

(1)函数作用

def __getitem__(self, idx):

来对具体的数值进行提取,根据之前训练集,测试集划分的不同,会返回相应的不同的长度,在编写训练函数的时候,借由

batch_data = DataLoader(train_data, batch_size, shuffle=True, \
                        num_workers=num_workers, collate_fn=collate_fn, pin_memory=True)

这种形式将相应的数据通过Dataloader来进行加载读入,从而在设定好的epoch里面实现训练

(2)返回的参数

index = self.data_indices[idx]
img_index = self.img_indices[index[0]]  # img_index 坐标

# 从pad_img中根据坐标截取样本
img = self.img[:, img_index[0]:img_index[1], img_index[2]:img_index[3]]
label = self.gt[index[1], index[2]]

以idx来随机定位相应的索引的数据,返回图像数据为(可以根据自己的需求来进行返回):

  • img, 光谱图像信息(原始信息) tensor(103,27,27)
  • label, 标签值
  • index, 相应的坐标(在前面的函数中,将打平的一维坐标和2个二维位标都进行了保存)
  • img_pca 空间图像信息(PCA处理后)tensor(1,27,27)

三、数据集

在深度学习的过程中,主要使用了高光谱图像作为数据集来进行训练
在这里插入图片描述
数据集的格式为mat文件

matdata = scio.loadmat(data_root)
print(matdata.keys())  # 查看mat数据集的key
dict_keys(['__header__', '__version__', '__globals__', 'fea', 'gnd', 'paviaU', 'paviaU_gt'])

读取存放文件的地址位,来调用loadmat读取相应的数据,返回字典中的keys,来查看数据集中存在哪几类数据来进行调用

在读取数据集时,不仅要注意图像的【C,H,W】,还需要注意其中的,keys的选择

例如:

data_root = '/home/students/master/2022/wangzy/PyCharm-Remote/datasets/PaviaU.mat'
image_name = 'paviaU'
gt_name = 'paviaU_gt'
# paviaU的特征分为了9类
# torch([32, 103, 610, 340])

data_root = '/home/students/master/2022/wangzy/PyCharm-Remote/datasets/Indian_pines.mat'
image_name = 'indian_pines_corrected'
gt_name = 'R'
# indian_pines的特征分为了16类
# torch([32, 220, 145, 145])

  paviaU的特征分类为9,在最后模型的全连接过程分类应该为9,在使用不同的数据集时需要注意特征数的不同,indian_pines的特征分为了16类。

  数据集在训练的时候一般会分为空间信息和光谱信息,空间信息一般是pca处理后进行,通道数自己定义,光谱信息一般是对单像素的进行处理,在调用的时候,patch处理后的img图像正中间就是对应的图像原始像素点的数据。

四、深度学习模型

  在整个编写的过程中主要就是模型的编写,其他的部分基本是理解完成后进行细微的调整,这里用最基本的CNN2D来举例

class CNN2D(nn.Module):
    def __init__(self, in_fea_num, out_fea_num):
        super(CNN2D, self).__init__()
        self.conv1 = nn.Conv2d(in_fea_num, 32, kernel_size=4, stride=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=5, stride=1)
        self.fc = nn.Linear(64, out_fea_num)

    def forward(self, origin_data, pca_data):
        output = self.conv1(pca_data)
        output = F.relu(output)
        output = F.max_pool2d(output, 2)
        output = self.conv2(output)
        output = F.relu(output)
        output = torch.flatten(output, 1)
        output = self.fc(output)

        return output

def main():
    net = CNN2D(1, 9)
    tmp = torch.randn(32, 1, 27, 27)
    out = net(tmp)
    print(out.shape)

  这是一个最基本的2D卷积神经网络,2个卷积层,中间插入relu和max_pool来实现卷积,最后进行相应的全连接

  输入的是img_pca,这里是对HSI的空间信息进行处理,一般的空间卷积都是使用pca降维后的来进行使用,因为最后的paviaU的特征分为了9类,所以在后面的全连接层最后输出的为9,代表对9类特征值的判断概率

img

五、训练,测试及图像展示

  训练和测试模型基本上的代码框架差不多,在后面主要就是介绍训练模型使用的代码框架的理解,主体上包含了以下部分:

  • 导入之前设定的参数值

  • 加载模型和设定是否采用上次编写的来进行训练

  • 在设定的epoch中进行数据的遍历

  • 训练模型和存储

  • 打印数据

(1)导入之前设定的参数值

num_workers = cfg['workers_num']  # 导入同时工作的线程数
gpu_num = cfg['gpu_num']  # 几个GPU工作

save_folder = cfg['save_folder']  #'./weights/'
save_name = cfg['save_name']      #'model_CNN1D'

lr_init = cfg['lr']
lr_gamma = cfg['lr_gamma']
lr_step = cfg['lr_step']  # 步进为60
lr_adjust = cfg['lr_adjust']  # 设置为Ture

epoch_size = cfg['epoch']
batch_size = cfg['batch_size']

主要是导入在初始文件configs中的设定值,在后面的修改中也基本是在configs里进行相应的修改

(2)加载模型和设定是否采用上次编写的来进行训练

if gpu_num > 1 and cfg['gpu_train']:
    # 采用多卡GPU服务器
    model = torch.nn.DataParallel(model).to(device)
    # 使用样例
    # model = model.cuda()
    # device_ids = [0, 1]  # id为0和1的两块显卡
    # model = torch.nn.DataParallel(model, device_ids=device_ids)
else:
    model = model.to(device)

model.train()

if cfg['reuse_model']:

    print('loading model')
    checkpoint = torch.load(cfg['reuse_file'], map_location=device)  # 用来加载torch.save() 保存的模型文件
    start_epoch = checkpoint['epoch']
    model_dict = model.state_dict()  # state_dict其实就是一个字典,该自点中包含了模型各层和其参数tensor的对应关系。
    pretrained_dict = {k: v for k, v in checkpoint['model'].item() if k in model_dict}  # 再用预训练模型参数更新model_dict
    model_dict.update(pretrained_dict)
    model.load_state_dict(model_dict)  # 装载已经训练好的模型
else:
    start_epoch = 0

可以通过选择是否采用上一次的模型或者,重新开始训练新的模型

(3)在设定的epoch中进行数据的遍历

for epoch in range(start_epoch + 1, epoch_size + 1):
    epoch_time0 = time.time() 
    batch_data = DataLoader(train_data, batch_size, shuffle=True, \
                            num_workers=num_workers, collate_fn=collate_fn, pin_memory=True)
    if lr_adjust:
        lr = adjust_lr(lr_init, lr_gamma, optimizer, epoch, lr_step)
    else:
        lr = lr_init
    epoch_loss = 0
    predict_correct = 0
    label_num = 0

    for batch_idx, batch_sample in enumerate(batch_data):  # 遍历加载的数据集
        iteration = (epoch - 1) * batch_num + batch_idx + 1
        batch_time0 = time.time()
        # (1)导入图片和标签
        if len(batch_sample) > 3:
            img, target, indices, img_pca = batch_sample
            img_pca = img_pca.to(device)
        else:
            img, target, indices = batch_sample

        img = img.to(device)
        target = target.to(device)

  在这里主要是在一个中epoch,对图像数据进行导入和遍历,在DataLoader的作用下,batch_size=32决定了一次提取的图片数目,在HSI_Data的索引下,对划分好的训练集进行相应的随机提取,主要是用的是img和img_pca

  • img patch后的图像数据(32,103,25,25)
  • img_pca patch后pca降维的图像数据(32,1,25,25)

(4)训练模型

# 前向传播
prediction = model(img, img_pca)  # 在CNN2D中只用了img_pca

# 计算损失
loss = loss_fun(prediction, target.long())  # 这里target应该是标签值

# 优化器,反向传播
optimizer.zero_grad()  # 将梯度归零
loss.backward()  # 反向传播计算得到每个参数的梯度值
optimizer.step()  # 通过梯度下降执行一步参数更新

这几步基本上是固定的,先进行前向传播,后面再进行反向传播更新梯度权重

if not os.path.exists(save_folder):
    os.makedirs(save_folder)  # 递归创建目录

 # 存储最终的模型
save_model = dict(
    model=model.state_dict(),
    epoch=epoch_size
)

将训练完成的模型进行存储,用于下次的测试

(5)打印数据

# 将相应的数据进行打印
print('Epoch: {}/{} || lr: {} || loss: {} || Train acc: {:.2f}% || '
      'Epoch time: {:.4f}s || Epoch ETA: {}'
      .format(epoch, epoch_size, lr, epoch_loss/batch_num, 100*predict_correct/label_num,
              epoch_time, str(datetime.timedelta(seconds=epoch_eta))
              )
      )

将相应的参数打印,再训练的过程中可以进行观察

Epoch: 6/100 || lr: 0.01 || loss: 0.3411703225639131 || Train acc: 90.74% || Epoch time: 0.7305s || Epoch ETA: 0:01:08
Epoch: 7/100 || lr: 0.01 || loss: 0.2682735058996413 || Train acc: 90.74% || Epoch time: 0.6298s || Epoch ETA: 0:00:58
Epoch: 8/100 || lr: 0.01 || loss: 0.20451137092378405 || Train acc: 93.33% || Epoch time: 0.5340s || Epoch ETA: 0:00:49
Epoch: 9/100 || lr: 0.01 || loss: 0.2426785926024119 || Train acc: 90.74% || Epoch time: 0.6558s || Epoch ETA: 0:00:59

六、主函数的理解

在main函数文件中,主要是调用前面的包装好的子函数进行调用,很简单和容易理解

主体上分为:

  • 基本参数配置
  • 加载模型和优化
  • 训练测试
  • 显示图像

(1)基本参数配置

# 基本参数配置
cfg_data = cfg.data
cfg_model = cfg.model
cfg_train = cfg.train['train_model']
cfg_optim = cfg.train['optimizer']  # 导入优化模型的相应参数
cfg_test = cfg.test

# 数据导入和数据集的划分
data_sets = fun_get_set(cfg_data)

train_data = fun_data(data_sets, cfg_data['train_data'])
test_data = fun_data(data_sets, cfg_data['test_data'])
no_gt_data = fun_data(data_sets, cfg_data['no_gt_data'])

(2)加载模型和优化

device = torch.device("cuda:5")
# 加载模型
model = fun_model(cfg_model['in_fea_num'], cfg_model['out_fea_num']).to(device)
# 损失函数
loss_fun = nn.CrossEntropyLoss()
# 优化器
optimizer = optim.SGD(model.parameters(), lr=cfg_optim['lr'],
                      momentum=cfg_optim['momentum'], weight_decay=cfg_optim['weight_decay'])

(3)训练测试

# 训练
fun_train(train_data, model, loss_fun, optimizer, device, cfg_train)

# 测试
pred_train_label = fun_test(train_data, data_sets['ori_gt'], model, device, cfg_test)
pred_test_label = fun_test(test_data, data_sets['ori_gt'], model, device, cfg_test)
pred_no_gt_label = fun_test(no_gt_data, data_sets['ori_gt'], model, device, cfg_test)

predict_label = torch.cat([pred_train_label, pred_test_label, pred_no_gt_label], dim=0)

(4)显示图像

直接显示相应的图像
HSI = show.Predict_Label2Img(pred_no_gt_label)
plt.imshow(HSI)
plt.show()

  main函数也代表了整个HSI深度学习的代码框架,以这个框架在相应的文件子函数中进行编写和修改,但进行不同模型的训练最主要的还是修改不同的模型和训练集,对模型准确度的判定都差不多

高光谱图像分类常用数据集(二) 本文介绍了四个常用的高光谱图像数据集及其下载链接。数据集包括: 印度松树数据集(1992年采集,145×145像素,224波段,16类) 帕维亚大学数据集(2001年采集,610×340像素,103波段,9类) 帕维亚中心数据集(1096×1096像素,102波段,9类) 萨利纳斯数据集(512×217像素,224波段,16类) 每个数据集包含详细的类别信息和样本数量,适用于高光谱图像处理研究。数据可通过夸克网盘或Google Drive获取。 阅读详情

相关推荐

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

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

雷恩Layne 5568

常用的高光谱数据集介绍(赋下载地址)

高光谱简介与三种常见的高光谱数据集

yyyyyyep的博客 1万+

[HSI论文阅读] | SSRN:Spectral-Spatial residual network for HSI classification

写在前面 论文: Z. Zhong, J. Li, Z. Luo and M. Chapman, “Spectral–Spatial Residual Network for Hyperspectral Image Classification: A 3-D Deep Learning Framework,” in IEEE Transactions on Geoscience and Remote Sensing, vol. 56, no. 2, pp. 847-858, Feb. 2018, doi:

学习笔记 6404

MUUFL Gulfport 高光谱遥感数据集终极指南

MUUFL Gulfport 是一个专门用于高光谱遥感和激光雷达研究的开源数据集,由佛罗里达大学GatorSense团队精心打造。该项目为遥感图像分析、目标检测和场景理解提供了完整的实验平台,包含了丰富的地面真值数据和可视化工具。 如果你正在寻找一个能够支持从基础研究到实际应用的全方位遥感数据集,MUUFL Gulfport 将成为你的理想选择。它不仅提供了原始的高光谱和激光雷达数据,还配备了专

gitblog_00747的博客 1275

高光谱图像分类

本文是在学习文章《HybridSN: Exploring 3-D-2-D CNN Feature Hierarchy for Hyperspectral Image Classification》的基础上,产生一些自己的理解,并对该文章代码进行复现。 简介 高光谱图像分类(HSI)被广泛应用于遥感图像分析,而CNN是视觉数据处理中应用最广泛的深度学习方法。近期也有大量科学实验进展将CNN应用于高光谱图像分类(HSI),但这些方法大多都是基于2D CNN网络,而高光谱分类的结果主要依赖于空间信息和光谱信息。目

hahahd3的博客 1万+

[HSI论文阅读]A survey Deep learning for hyperspectral image classification with few labeled samples

文章是伴随论文阅读过程中的内容记录,论文内容基于对现在的HIS分类领域中所流行、存在,或者是仍在发展的各种方法进行了一系列汇总,主要内容有各种方法的来源、之间的关系、它们的详细实现、优缺点特性、在实验过程中表现出来的性能等。Key Words:HSI(Hyperspectral image)classification(高光谱图像分类)、Transfer learning(迁移学习)、Few-shot learning(小样本学习)、Active learning(主动学习)

NaSaNuoSi的博客 1048

高光谱图像通用数据集下载大全(数据太大,提供百度云链接)

资源包括99.9%的常用的实验高光谱图像数据,全部是.mat文件,到手即用(数据集和标签都有,部分还有的图像)数据集包括:Indian pines,pavia university,pavia center,botswana,Houston_2013,Houston_2018,KSC,Salinas,xuzhou,xiongan,由于数据量过大,本资源提供百度云链接,请自行下载

DeepLearning-week07-HSI-X

这是多模态遥感图像分类的核心任务之一,旨在融合不同传感器的数据,提升地物分类精度。模态特点提供信息高光谱(HSI)数百个连续窄波段丰富的光谱特征,可区分材料成分LiDAR激光雷达,返回高程与强度三维结构信息、地形起伏、高度特征SAR合成孔径雷达,全天候成像表面粗糙度、介电常数、穿透能力融合目标:结合 HSI 的“是什么”与 LiDAR/SAR 的“在哪里、有多高、多粗糙”,实现更鲁棒的分类。

luoLTL的博客 883

五种高光谱数据集.rar

包含常用的几种高光谱数据,可以用于遥感图像分类。Washington DC Mal,Indian Pine等。ndian Pines 是最早的用于高光谱图像分类的测试数据,由机载可视红外成像光谱仪(AVIRIS)于 1992 年对美国印第安纳州一块印度松树进行成像,然后截取尺寸为 145×145 的大小进行标注作为高光谱图像分类测试用途。Pavia  University 数据是由德国的机载反射光学光谱成像仪(Reflective  Optics Spectrographic Imaging System,ROSIS-03)在 2003 年对意大利的帕维亚城所成的像的一部分高光谱数据。该光谱成像仪对 0.43-0.86μm 波长范围内的 115 个波段连续成像,所成图像的空间分辨率为 1.3m。其中 12 个波段由于受噪声影响被剔除,因此一般使用的是剩下 103 个光谱波段所成的图像。该数据的尺寸为 610×340,因此共包含2207400 个像素,但是其中包含大量的背景像素,包含地物的像素总共只有 42776 个,这些像素中共包含 9 类地物,包括树、沥青道路(Asphalt)、砖

HSI图像学习路线参考

HSI图像学习路线参考 学习路线大致可以分为代码相关和原理相关。 两者在学习顺序上应当是并行的,两者会自然地相互促进,学习代码也离不开对论文的学习。 但是在不同时期侧重点不同,建议顺序: 入门阶段从一两篇综述、一两篇经典论文开始学习,了解该领域基本术语、要做的任务、大致方向等; 随后进行代码学习,1对已有经典开源代码的学习;2对某篇经典论文进行代码复现; 广泛的阅读前沿论文,激发idea,并通过代码进行初步验证 代码相关 1 对经典代码学习 ​ 借助一份经典代码,通过debug模式逐行运行,理解

qq_36338830的博客 656

高光谱数据集

该网址包含 Indian_pines, Salinas, Pavia Centre and University, Cuprite, Kennedy Space Center, Botswana等常用高光谱数据及其标签,数据格式为mat 网址链接:Hyperspectral Remote Sensing Scenes 数据目录 ...

haoji007的博客 3万+

MUUFL Gulfport高光谱与LiDAR数据集:遥感研究者的终极实战指南

MUUFL Gulfport数据集是遥感领域的重要开源资源,为研究人员提供了**高光谱成像(HSI)**与**激光雷达(LiDAR)**融合的多模态数据。这个数据集不仅包含丰富的场景标注和实地照片,还提供了完整的目标检测算法和评分工具,是学习遥感分析和计算机视觉的绝佳起点。无论你是遥感新手还是经验丰富的研究者,这份完整指南都将帮助你快速上手并充分利用这一宝贵资源。 ## 🚀 项目亮点与独特价值

gitblog_00992的博客 966

常用的高光谱图像分类数据集

主要包括:Indian Pines;Pavia Centre;Pavia University;Salinas;Salinas-A;Washington_DC。

HSI-分类高光谱图像分类资源集

HSI-分类高光谱图像分类资源集 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 HSI-分类是一个集成了多种高光谱图像分类算法的资源库,旨在推动像素级智能分析技术的发展。该资源集不仅包括传统机器学习算法,如KNN和SVM,还涵盖了一系列基于深度学习的方法,如1D-CNN、2D-CNN和3D-CNN。通过HSI-分类,研究人员和开发者可以高效地探索和实现高光谱图像的分类...

gitblog_06793的博客 293

【高光谱图像数据集】ksc

The NASA AVIRIS (Airborne Visible/Infrared Imaging Spectrometer) instrument acquired data over the Kennedy Space Center (KSC), Florida, on March 23, 1996. AVIRIS acquires data in 224 bands of 10 nm width with center wavelengths from 400 - 2500 nm. The KSC data, acquired from an altitude of approximately 20 km, have a spatial resolution of 18 m. After removing water absorption and low SNR bands, 176 bands were used for the analysis. Training data were selected using land cover maps derived from color infrared photography provided by the Kennedy Space Center and Landsat Thematic Mapper (TM) imagery. The vegetation classification scheme was developed by KSC personnel in an effort to define functional types that are discernable at the spatial resolution of Landsat and these AVIRIS data. Discrimination of land cover for this environment is difficult due to the similarity of spectral signatures for certain vegetation types. For classification purposes, 13 classes representing the various land cover types that occur in this environment were defined for the site.

高光谱cuprite数据集

为了大家更好学习高光谱编程,讲一些常用的高光谱数据集上传,仅仅针对MATLAB用户,直接load就能使用。

高光谱图像分类项目开发进展

这次的项目有点点困难,我们需要对高光谱图像进行精确的划分,然后还需要做成web端,供用户使用,现在处于项目的起始阶段,对这些了解的不多,所以难度较大。高光谱图像分类项目是一个复杂且挑战性较大的任务,尤其对于没有相关经验的人来说,可能会遇到一些特定的难点。

m0_73966002的博客 1165

ISP一键下载电路分析+74HC1G66GW(信号图)

之前要不用的最小系统的开发板要不就是用的SWD调试口,没有注意过ISP一键下载电路是个怎么回事,因为需要就简单的看了一下野火的ISP一键下载电路。 默认情况一下,一般我们的程序都是从用户闪存也就是内部的FLASH启动的, 对于F103RCT6来说ROM的大小是512kb,启动地址位0x8000000,这个在IDE keil里可以看的到,如下图。 首先简单理解一下ISP是什么: 可以把他理解为芯片厂商出场时固化在ROM当中的一段程序,它的功能就是把你写的程序一点点的搬运到FLASH当中,它引出了两个引脚

lipengyu1363658871的博客 4861
上一篇: 【git】从零实现git到github的连接和上传文件(最完整)
下一篇: 【论文阅读】结合空洞卷积的 FuseNet变体网络高分辨率遥感影像语义分割
川川子溢
博客等级 码龄7年 389粉丝 42原创
评论 44
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值