基于 PyTorch 的 TransU-Net 模型进行不同城市建筑物的精准提取 来继续遥感图像语义分割
遥感图像语义分割,遥感建筑物数据集,基于Pytorch框架,针对不同城市建筑物精准提取。
遥感图像中包含丰富的地理空间信息,从遥感图像中了解这些信息对城市规划、
地形图的制作和更ᯠ、林业资源监测和管理等具有重要的实用价值。近年来,遥感图
像语义分割受到人们广泛关注,由于图像的成像过程会受到距离、光照、地理位置、角度等影响,遥感图像中不同类别的物体可能会产生相似的视觉特征,同一类物体则可能存在较大差异,这就导致遥感图像语义分割存在不确定现象。
卷积神经网络凭借其高超的非线性表征能力,能从海量样本ᮠ据中学习到更深
层次、更本质性的特征,已被广泛用于遥感领域。本᮷主要研究了卷积神经网络在遥感图像语义分割中的应用,重点解决分割任务中由遥感图像固有不确定性引起的分割问题,ᨀ升遥感图像语义分割性能。具体研究工作概括如下:
(1)针对遥感图像分割中存在的阴影干扰,分割不准确,背Ჟ信息复杂问题,
ᨀ出了一种模糊邻域卷积神经网络。首先,将模糊学习的思想引入到深度学习中,利用模糊邻域模块计算样本间的模糊相似度,善类内异质与类间复杂造成的分割结果不准确问题,ᨀ高分割准确度。其次,增加一组注意力模块,该模块采用融合深浅特征的权重系ᮠ,突出特征图中目标物体,将目标物体与复杂的背Ჟ信息分离,实现遥感图像的精细分割。最后,在三个遥感ᮠ据集上进行有᭸性验证。结果表᰾,ᨀ出的模糊邻域卷积神经网络具有较高的分割精度。
(2)针对遥感图像分割中尺度信息复杂和物体纹理相似问题,ᨀ出一种模糊多
尺度卷积神经网络,深入探讨基于卷积神经网络遥感图像分割ᯩ法。首先,为了增加
对不同大小和形状物体的感性,利用残差并行分᭟获取各阶段的多级语义信息。然
后通过计算像素样本间的模糊相似度,减少不确定因素对遥感图像分割精度的干扰。
随后,在网络结构中嵌入多尺度特征ᨀ取模块,通过᧗制᧕受域大小,对高级语义特
征图进行有᭸编码,丰富最终特征表达能力。最后,在两个遥感ᮠ据集上进行实验验
证。结果表᰾,所ᨀ出的网络得到了更好的分割结果。
!在这里插入图片描述
TransU-Net
注意力机制起源于人类的视觉系统。
在复杂场Ჟ下,通过注意力机制,人类可以
精确迅速地关注重要部分,忽略不相关的信息,并按重要程度对关注中心进行优先级
排序。与人类视觉注意类似,注意力机制往往关注关键特征,通过赋予权重等ᯩ式将
学习资源偏向信息量大、更具有价值的部分。
注意力机制示例
基于 PyTorch 的 TransU-Net 模型进行遥感图像语义分割,特别是针对不同城市建筑物的精准提取,完成以下几个步骤:
- 数据准备:确保你有合适的遥感图像和对应的标注数据。
- 模型构建:实现 TransU-Net 模型。
- 训练过程:编写训练代码,包括数据加载、损失函数、优化器等。
- 推理与评估:在测试集上进行推理,并评估模型性能。
一、数据准备
假设你同学包含遥感图像和对应标注的数据集。数据集应该分为训练集、验证集和测试集。
二、TransU-Net 模型构建
TransU-Net 是一种结合了Transformer和U-Net结构的模型,用于医学图像分割。我们可以对其进行一些修改以适应遥感图像分割任务。
import torch
import torch.nn as nn
import torch.nn.functional as F
from transformers import ViTModel
class TransUNet(nn.Module):
def __init__(self, img_size=256, patch_size=16, num_classes=2, in_channels=3):
super(TransUNet, self).__init__()
self.vit = ViTModel.from_pretrained('google/vit-base-patch16-224-in21k')
self.decoder = nn.Sequential(
nn.ConvTranspose2d(768, 512, kernel_size=2, stride=2),
nn.BatchNorm2d(512),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(512, 256, kernel_size=2, stride=2),
nn.BatchNorm2d(256),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(256, 128, kernel_size=2, stride=2),
nn.BatchNorm2d(128),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(64, num_classes, kernel_size=1)
)
def forward(self, x):
# 使用ViT提取特征
vit_output = self.vit(x)['last_hidden_state']
b, n, c = vit_output.shape
h, w = int(n**0.5), int(n**0.5)
vit_output = vit_output.permute(0, 2, 1).reshape(b, c, h, w)
# 使用解码器进行上采样
output = self.decoder(vit_output)
return output
# 初始化模型
model = TransUNet()
三、训练过程
import os
import numpy as np
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms
from PIL import Image
# 数据集类
class RemoteSensingDataset(Dataset):
def __init__(self, image_dir, mask_dir, transform=None):
self.image_dir = image_dir
self.mask_dir = mask_dir
self.transform = transform
self.images = os.listdir(image_dir)
def __len__(self):
return len(self.images)
def __getitem__(self, idx):
img_path = os.path.join(self.image_dir, self.images[idx])
mask_path = os.path.join(self.mask_dir, self.images[idx].replace('.jpg', '.png'))
image = Image.open(img_path).convert("RGB")
mask = Image.open(mask_path).convert("L")
if self.transform:
image = self.transform(image)
mask = self.transform(mask)
return image, mask
# 数据预处理
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor(),
])
# 加载数据集
train_dataset = RemoteSensingDataset(image_dir='path/to/train/images', mask_dir='path/to/train/masks', transform=transform)
val_dataset = RemoteSensingDataset(image_dir='path/to/val/images', mask_dir='path/to/val/masks', transform=transform)
train_loader = DataLoader(train_dataset, batch_size=4, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=4, shuffle=False)
# 训练参数
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 训练循环
num_epochs = 10
for epoch in range(num_epochs):
model.train()
for images, masks in train_loader:
images, masks = images.to(device), masks.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, masks.long())
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
# 验证
model.eval()
with torch.no_grad():
total_val_loss = 0
for images, masks in val_loader:
images, masks = images.to(device), masks.to(device)
outputs = model(images)
val_loss = criterion(outputs, masks.long())
total_val_loss += val_loss.item()
avg_val_loss = total_val_loss / len(val_loader)
print(f'Validation Loss: {avg_val_loss:.4f}')
四、推理与评估
# 测试集推理
test_dataset = RemoteSensingDataset(image_dir='path/to/test/images', mask_dir='path/to/test/masks', transform=transform)
test_loader = DataLoader(test_dataset, batch_size=1, shuffle=False)
model.eval()
with torch.no_grad():
for images, masks in test_loader:
images, masks = images.to(device), masks.to(device)
outputs = model(images)
predicted_masks = torch.argmax(outputs, dim=1).cpu().numpy()
# 可视化结果
for i in range(len(predicted_masks)):
plt.figure(figsize=(12, 6))
plt.subplot(1, 3, 1)
plt.imshow(np.transpose(images[i].cpu().numpy(), (1, 2, 0)))
plt.title('Input Image')
plt.axis('off')
plt.subplot(1, 3, 2)
plt.imshow(masks[i].cpu().numpy(), cmap='gray')
plt.title('Ground Truth Mask')
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(predicted_masks[i], cmap='gray')
plt.title('Predicted Mask')
plt.axis('off')
plt.show()
以上代码提供了一个基本框架,你可以根据具体需求进行调整和优化。例如,可以添加更多的数据增强方法、调整模型参数、使用不同的损失函数等。
Potsdam 遥感数据集
结果图
伴随着遥感技术的发展,遥感图像语义分割在遥感的各个应用领域都发挥着十
分重要的作用。但遥感图像固有的不确定性成为遥感图像语义分割发展的重要制约
因素。本᮷回顾已有的研究工作,分析其中的创ᯠ之点与不足之处,结合ᯠ的研究思
路对现有的研究工作进行补充与发展。具体地,本᮷的主要创ᯠ研究成果如下:
(1)ᨀ出一种基于模糊邻域卷积神经网络以解决遥感图像分割问题。首先,利
用模糊邻域模块计算样本间的模糊相似度,克服遥感图像固有的不确定性问题。其次,利用多注意力门᧗模块融合深浅特征,有᭸去除浅层特征图像中的噪声,同ᰦ更稳健地补偿深层特征图像中的细节。最后,在三个遥感ᮠ据集上进行实验,实验结果表᰾,所ᨀᯩ法可以较好地识别阴影信息和较小的目标,并能识别目标边缘边界,同
ᰦ保持较高的准确度。
(2)ᨀ出一种模糊多尺度卷积神经网络用于遥感图像语义分割。首先,该ᯩ法
通过下采样将遥感特征ᮠ据送入主干网络,通过残差并行分᭟连᧕上采样与下采样
获取多级语义特征并融合到主干网络,从而增加对不同大小和形状物体的感性。其次,为了᭦集不同级别的上下᮷信息,通过嵌入多尺度特征ᨀ取模块,实现在不᭩变特征图尺寸大小的情况下,通过᧗制᧕受域大小,有᭸对高级语义特征图进行编码。
最后,通过反卷积输出分割结果。实验选取两组遥感ᮠ据进行地物分割实验,分析验
证了该ᯩ法在遥感图像分割任务上的有᭸性和适用性。
基于卷积神经网络的遥感图像语义分割ᯩ法在实际应用中取得了优秀的表现。
然而,由于遥感图像的稀缺性,᭦集包含各种变化的大尺度遥感图像费ᰦ费力。弱监
督学习ᱟ在标注ᮠ据稀缺的情况下,利用大量未标注ᮠ据训练网络。这样可以有᭸地
利用已有的ᮠ据资源,同ᰦᨀ高分割准确率和泛化能力。因此,弱监督学习将成为今
后研究的重点ᯩ向。
以上文字及代码仅供参考。