基于 PyTorch 的 TransU-Net 模型进行不同城市建筑物的精准提取 来继续遥感图像语义分割
基于 PyTorch 的 TransU-Net 模型进行不同城市建筑物的精准提取 来继续遥感图像语义分割
遥感图像语义分割,遥感建筑物数据集,基于Pytorch框架,针对不同城市建筑物精准提取。
遥感图像中包含丰富的地理空间信息,从遥感图像中了解这些信息对城市规划、
地形图的制作和更ᯠ、林业资源监测和管理等具有重要的实用价值。近年来,遥感图
像语义分割受到人们广泛关注,由于图像的成像过程会受到距离、光照、地理位置、角度等影响,遥感图像中不同类别的物体可能会产生相似的视觉特征,同一类物体则可能存在较大差异,这就导致遥感图像语义分割存在不确定现象。
卷积神经网络凭借其高超的非线性表征能力,能从海量样本ᮠ据中学习到更深
层次、更本质性的特征,已被广泛用于遥感领域。本᮷主要研究了卷积神经网络在遥感图像语义分割中的应用,重点解决分割任务中由遥感图像固有不确定性引起的分割问题,ᨀ升遥感图像语义分割性能。具体研究工作概括如下:
(1)针对遥感图像分割中存在的阴影干扰,分割不准确,背Ჟ信息复杂问题,
ᨀ出了一种模糊邻域卷积神经网络。首先,将模糊学习的思想引入到深度学习中,利用模糊邻域模块计算样本间的模糊相似度,善类内异质与类间复杂造成的分割结果不准确问题,ᨀ高分割准确度。其次,增加一组注意力模块,该模块采用融合深浅特征的权重系ᮠ,突出特征图中目标物体,将目标物体与复杂的背Ჟ信息分离,实现遥感图像的精细分割。最后,在三个遥感ᮠ据集上进行有᭸性验证。结果表᰾,ᨀ出的模糊邻域卷积神经网络具有较高的分割精度。
(2)针对遥感图像分割中尺度信息复杂和物体纹理相似问题,ᨀ出一种模糊多
尺度卷积神经网络,深入探讨基于卷积神经网络遥感图像分割ᯩ法。首先,为了增加
对不同大小和形状物体的感性,利用残差并行分᭟获取各阶段的多级语义信息。然
后通过计算像素样本间的模糊相似度,减少不确定因素对遥感图像分割精度的干扰。
随后,在网络结构中嵌入多尺度特征ᨀ取模块,通过᧗制᧕受域大小,对高级语义特
征图进行有᭸编码,丰富最终特征表达能力。最后,在两个遥感ᮠ据集上进行实验验
证。结果表᰾,所ᨀ出的网络得到了更好的分割结果。
!在这里插入图片描述
TransU-Net
注意力机制起源于人类的视觉系统。
在复杂场Ჟ下,通过注意力机制,人类可以
精确迅速地关注重要部分,忽略不相关的信息,并按重要程度对关注中心进行优先级
排序。与人类视觉注意类似,注意力机制往往关注关键特征,通过赋予权重等ᯩ式将
学习资源偏向信息量大、更具有价值的部分。
注意力机制示例
基于 PyTorch 的 TransU-Net 模型进行遥感图像语义分割,特别是针对不同城市建筑物的精准提取,完成以下几个步骤:
- 数据准备:确保你有合适的遥感图像和对应的标注数据。
- 模型构建:实现 TransU-Net 模型。
- 训练过程:编写训练代码,包括数据加载、损失函数、优化器等。
- 推理与评估:在测试集上进行推理,并评估模型性能。
一、数据准备
假设你同学包含遥感图像和对应标注的数据集。数据集应该分为训练集、验证集和测试集。
二、TransU-Net 模型构建
TransU-Net 是一种结合了Transformer和U-Net结构的模型,用于医学图像分割。我们可以对其进行一些修改以适应遥感图像分割任务。
importtorchimporttorch.nnasnnimporttorch.nn.functionalasFfromtransformersimportViTModelclassTransUNet(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))defforward(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)returnoutput# 初始化模型model=TransUNet()三、训练过程
importosimportnumpyasnpfromtorch.utils.dataimportDataLoader,DatasetfromtorchvisionimporttransformsfromPILimportImage# 数据集类classRemoteSensingDataset(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):returnlen(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")ifself.transform:image=self.transform(image)mask=self.transform(mask)returnimage,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'iftorch.cuda.is_available()else'cpu')model.to(device)criterion=nn.CrossEntropyLoss()optimizer=torch.optim.Adam(model.parameters(),lr=0.001)# 训练循环num_epochs=10forepochinrange(num_epochs):model.train()forimages,masksintrain_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()withtorch.no_grad():total_val_loss=0forimages,masksinval_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()withtorch.no_grad():forimages,masksintest_loader:images,masks=images.to(device),masks.to(device)outputs=model(images)predicted_masks=torch.argmax(outputs,dim=1).cpu().numpy()# 可视化结果foriinrange(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)ᨀ出一种模糊多尺度卷积神经网络用于遥感图像语义分割。首先,该ᯩ法
通过下采样将遥感特征ᮠ据送入主干网络,通过残差并行分᭟连᧕上采样与下采样
获取多级语义特征并融合到主干网络,从而增加对不同大小和形状物体的感性。其次,为了᭦集不同级别的上下᮷信息,通过嵌入多尺度特征ᨀ取模块,实现在不᭩变特征图尺寸大小的情况下,通过᧗制᧕受域大小,有᭸对高级语义特征图进行编码。
最后,通过反卷积输出分割结果。实验选取两组遥感ᮠ据进行地物分割实验,分析验
证了该ᯩ法在遥感图像分割任务上的有᭸性和适用性。
基于卷积神经网络的遥感图像语义分割ᯩ法在实际应用中取得了优秀的表现。
然而,由于遥感图像的稀缺性,᭦集包含各种变化的大尺度遥感图像费ᰦ费力。弱监
督学习ᱟ在标注ᮠ据稀缺的情况下,利用大量未标注ᮠ据训练网络。这样可以有᭸地
利用已有的ᮠ据资源,同ᰦᨀ高分割准确率和泛化能力。因此,弱监督学习将成为今
后研究的重点ᯩ向。
以上文字及代码仅供参考。
