Land-cover classification with high-resolution remote sensing images using transferable deep models

两个问题:
1、 深度学习模型的可移植性
2、 缺乏注释良好的大型陆地覆盖数据集
**主要:**使用patch来进行训练。首先使用源数据预训练好一个ResNet50,之后使用伪标签和relevant sample retrieval的方法得到目标集的标签,并用来微调网络;分割、分类用投票法确定patches的类别。
方法:使用有标签的数据训练的深度模型来分辨无标签数据。
主要思想:深度卷积网络展示不同的类别中的上下文信息,为了提高深度模型的可移植性(transferability),提出了一种伪标记和样本选择方案(a pseudo-labeling and sample selection scheme)
方法:首先使用标记好的数据集(源数据,source data)预训练(pre-trained)一个卷积网络(ResNet-50),接着,通过一块一块的方式(a patch-wise manner)使用预训练好的网络对没标签的目标数据集(target image)进行分类。
训练时对通道的处理:
在训练ResNet-50时,对于三通道的影像,把卷积核的大小设置类似于为7×7×3的;对于四通道的影像,把卷积核的大小设置为类似于7×7×4
对目标数据集进行分类的方法-半监督转移学习的多源遥感影像分类方法:
伪标签赋值:基于预测分类置信度从目标域中选择有价值的样本,然而,这些伪标签可能并不可靠。
联合微调(Joint fine-tuning)通过向源域训练集中添加promising目标样本来优化分类模型,然而他需要少量的标记目标样本。
结合两者优点,从未标记的目标域中获得可信赖的训练信息来进行模型优化。
网络包含两部分:pseudo-label assignment and relevant sample retrieval
利用分类预测和CNN生成的深度特征来搜索与源域特征相似的目标样本,这些相关的样本和他们对应的预测类别(伪标签)用于微调CNN模型
在这里插入图片描述
首先使用D_S在RS域预训练模型,在D_T中的一张目标图像X_T,并使用non-overlapping grid partition把它分成块U={x_i }(i=1)^I。我们的方法自动的从U中选择可信赖的训练样本来学习可移植的深度模型用于X_T,随后,我们使用微调后的网络来分类x_i,i∈{1,…,I},我们的分类方法结合patch-wise分类和object-based voting
如何自动的选择训练样本(根据输出选择高于阈值的):pseudo-label assignment
对于一张目标影像X_T把它分为patch setU={x_i }
(i=1)^I,对于每一个x_i,softmax layer都有输出在这里插入图片描述
p_i中的最大值为h=〖max〗(k∈{1,…,K} ) p(i,k),当h≥σ,这个patch x_i被保留了下来,并给它一个伪标签l_i;否则,把x_i从U中移除。等到将U中所有分类置信度较低的patches全部移除,剩下的样本构成了一个新的集合U_1。
relevant sample retrieval(在源域中检索出相似的然后比较真实标签和伪标签是否一样)
在源域中找到和目标域中选择的样本相似的样本,然后使用retrieved源域样本的true-labels来看看伪标签是否是正确的。
具体方法:
先计算信息熵,
在这里插入图片描述
拥有较高信息熵的patches被视为有价值的训练样本,即作为preferred candidates。
在这里插入图片描述

一种混合的土地覆盖分类算法:地物的类别和边界信息是准确分类的基础,结合patch-wise classification and hierarchical segmentation through a majority voting strategy
在这里插入图片描述
Patch-wise classification(分类方法,多尺度,weighted fusion strategy)
由于地物在不同的空间分辨率下表现出不同的特征,在单尺度观测场中很难获取足够的地物信息。为了利用对象的属性及其空间分布,我们提出利用多尺度上下文信息进行分类。
在这里插入图片描述
分块分类:
使用s_1×s_1的方格将目标影像X_T分为不重叠的patches,对于每一个x_i,它的中心像素被作为参考像素z,在z的周围,一系列大小不同的patches被采样得到,s_2×s_2,…,s_N×s_N,因此每个参考像素都拥有N个多尺度样本。之后,将他们统一变成224×224然后送入ResNet-50中。通过前向传播,通过weighted fusion strategy使用多尺度上下文信息,我们可以根据公式算出类别的概率:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
将标签l(z)赋值给patch〖 x〗_i中的每一个像素,在对RS图像中所有的patches进行分类后,获得a patch-wise classification map X_c
Object-based voting
边界问题:为了获得Object精确的边界信息,使用selective search method产生分割图细化初步分类图。当通过patch-wise classification和selective search得到分类图和分割图之后,使用投票策略来统一类别和边界信息。
selective search method是一个分层的分割方法,它利用基于图的方法在不同的颜色空间产生一系列初始区域,然后使用贪婪算法迭代的合并小区域。颜色、纹理、大小和填充相似度用于控制合并级别。
在这里插入图片描述是分割图𝑋𝑆中的homogeneous regions,𝑦𝑗是分类图像𝑋𝐶中相应的区域𝑦𝑓。yf包含的像素的个数是M,像素的第m个label是lm,然后统计m个label中出现频率最高的就是该像素的label.对于每一个分割的对象,相同的被接受,最终的结果即可获得。

综合来说,分类这部分:
使用伪标签分配,并用作从源数据检索相关样本,将检索到的伪标签作为监督信息,对于训练好的模型进行微调。为了获得与目标图像相匹配的像素级地表覆盖分类,我们使用微调后的CNN,并将patch-wise(分块分类)和层次分割(hierarchical segmentation)相结合,形成了一种混合分类(a hybrid classification)。准确来说,在我们的分类过程中,首先利用CNN提取的多尺度上下文信息对图像进行分块分类(patch-wise classification),接着,利用层次分割(hierarchical segmentation)的方法获取边界信息,并将其整合到patch-wise classification中,得到准确结果

好的,以下是使用PyTorch实现 "Learning a Deep ConvNet for Multi-label Classification with Partial Labels" 论文的示例代码。 ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision.transforms import transforms from sklearn.metrics import f1_score from dataset import CustomDataset from model import ConvNet # 设置随机数种子,保证结果可重复 torch.manual_seed(2022) # 定义超参数 epochs = 50 batch_size = 128 learning_rate = 0.001 weight_decay = 0.0001 num_classes = 20 num_labels = 3 # 定义数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # 加载数据集 train_dataset = CustomDataset(root='./data', split='train', transform=transform) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=2) test_dataset = CustomDataset(root='./data', split='test', transform=transform) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2) # 定义模型 model = ConvNet(num_classes=num_classes, num_labels=num_labels) # 定义损失函数和优化器 criterion = nn.BCEWithLogitsLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=weight_decay) # 训练模型 for epoch in range(epochs): # 训练阶段 model.train() running_loss = 0.0 for i, data in enumerate(train_loader): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() train_loss = running_loss / len(train_loader) # 测试阶段 model.eval() y_true, y_pred = [], [] with torch.no_grad(): for data in test_loader: inputs, labels = data outputs = model(inputs) predicted_labels = torch.round(torch.sigmoid(outputs)) y_true.extend(labels.cpu().numpy()) y_pred.extend(predicted_labels.cpu().numpy()) f1 = f1_score(y_true, y_pred, average='macro') print('[Epoch %d] Train Loss: %.3f, Test F1: %.3f' % (epoch + 1, train_loss, f1)) ``` `CustomDataset` 和 `ConvNet` 分别是数据集类和模型类,需要根据您的具体情况进行实现。在训练阶段,使用 `nn.BCEWithLogitsLoss()` 作为损失函数进行优化。在测试阶段,使用 `sklearn.metrics.f1_score()` 计算 F1 值作为模型评估指标。 希望以上示例代码对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值