基于TransU-Net的遥感图像语义分割与分类,遥感建筑物数据集,基于Pytorch框架,针对不同城市建筑物精准提取
基于TransU-Net的遥感图像语义分割与分类遥感建筑物数据集基于Pytorch框架针对不同城市建筑物精准提取文章目录项目结构数据集准备定义数据集类 (my_dataset.py)数据增强与预处理 (transforms.py)模型定义 (train.py)训练脚本 (train.py)预测脚本 (predict.py)11基于TransU-Net的遥感图像语义分割与分类是一个非常有趣且具有挑战性的任务代码示例包括数据集准备、模型定义、训练和预测等步骤。代码示例仅供参考。项目结构首先确保你的项目结构类似于以下内容transunet_project/ ├── data/ │ ├── train_images/ │ ├── train_labels/ │ ├── val_images/ │ └── val_labels/ ├── src/ │ ├── my_dataset.py │ ├── predict.py │ ├── train.py │ └── transforms.py ├── predictions/ └── save_weights/数据集准备假设同学你已经有了一个包含遥感图像及其对应标签的数据集并且已经按照上述结构组织好。定义数据集类 (my_dataset.py)importosfromtorch.utils.dataimportDatasetfromPILimportImageimportnumpyasnpclassRemoteSensingDataset(Dataset):def__init__(self,image_dir,label_dir,transformNone):self.image_dirimage_dir self.label_dirlabel_dir self.transformtransform self.imagesos.listdir(image_dir)def__len__(self):returnlen(self.images)def__getitem__(self,index):img_pathos.path.join(self.image_dir,self.images[index])label_pathos.path.join(self.label_dir,self.images[index].replace(.jpg,.png))imageImage.open(img_path).convert(RGB)labelImage.open(label_path).convert(L)ifself.transformisnotNone:imageself.transform(image)labelself.transform(label)returnimage,label数据增强与预处理 (transforms.py)fromtorchvisionimporttransformsdefget_transform():returntransforms.Compose([transforms.Resize((256,256)),transforms.ToTensor(),transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225]),])模型定义 (train.py)importtorchimporttorch.nnasnnfromtransformersimportSwinTransformerclassTransUNet(nn.Module):def__init__(self,num_classes2):super(TransUNet,self).__init__()self.swinSwinTransformer()self.decodernn.Sequential(nn.ConvTranspose2d(1024,512,kernel_size2,stride2),nn.ReLU(inplaceTrue),nn.ConvTranspose2d(512,256,kernel_size2,stride2),nn.ReLU(inplaceTrue),nn.ConvTranspose2d(256,128,kernel_size2,stride2),nn.ReLU(inplaceTrue),nn.ConvTranspose2d(128,64,kernel_size2,stride2),nn.ReLU(inplaceTrue),nn.Conv2d(64,num_classes,kernel_size1))defforward(self,x):xself.swin(x)xself.decoder(x)returnx训练脚本 (train.py)importargparseimportosimporttimefromdatetimeimportdatetimeimporttorchimporttorch.optimasoptimfromtorch.utils.dataimportDataLoaderfromtorchvisionimporttransformsfromtqdmimporttqdmfrommy_datasetimportRemoteSensingDatasetfromtransunetimportTransUNetfromtransformsimportget_transformdefparse_args():parserargparse.ArgumentParser(descriptionTrain a segmentation model)parser.add_argument(--model,typestr,defaulttransunet,helpmodel name)parser.add_argument(--epochs,typeint,default100,helpnumber of epochs)parser.add_argument(--batch-size,typeint,default4,helpbatch size)argsparser.parse_args()returnargsdefcreate_model(args):ifargs.modeltransunet:returnTransUNet(num_classes2)else:raiseValueError(Invalid model name)defmain():argsparse_args()devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)train_datasetRemoteSensingDataset(image_dir./data/train_images,label_dir./data/train_labels,transformget_transform())val_datasetRemoteSensingDataset(image_dir./data/val_images,label_dir./data/val_labels,transformget_transform())train_loaderDataLoader(train_dataset,batch_sizeargs.batch_size,shuffleTrue)val_loaderDataLoader(val_dataset,batch_sizeargs.batch_size,shuffleFalse)modelcreate_model(args).to(device)criterionnn.CrossEntropyLoss()optimizeroptim.Adam(model.parameters(),lr0.001)best_val_lossfloat(inf)forepochinrange(args.epochs):model.train()running_loss0.0forimages,labelsintqdm(train_loader):images,labelsimages.to(device),labels.to(device)optimizer.zero_grad()outputsmodel(images)losscriterion(outputs,labels)loss.backward()optimizer.step()running_lossloss.item()avg_train_lossrunning_loss/len(train_loader)print(fEpoch [{epoch1}/{args.epochs}], Train Loss:{avg_train_loss:.4f})model.eval()val_loss0.0withtorch.no_grad():forimages,labelsinval_loader:images,labelsimages.to(device),labels.to(device)outputsmodel(images)losscriterion(outputs,labels)val_lossloss.item()avg_val_lossval_loss/len(val_loader)print(fEpoch [{epoch1}/{args.epochs}], Val Loss:{avg_val_loss:.4f})ifavg_val_lossbest_val_loss:best_val_lossavg_val_loss torch.save(model.state_dict(),fsave_weights/{args.model}/best_model.pth)if__name____main__:main()预测脚本 (predict.py)importargparseimportosimporttimefromdatetimeimportdatetimeimporttorchfromPILimportImagefromtorchvisionimporttransformsfromtqdmimporttqdmfrommy_datasetimportRemoteSensingDatasetfromtransunetimportTransUNetfromtransformsimportget_transformdefparse_args():parserargparse.ArgumentParser(descriptionPredict using a segmentation model)parser.add_argument(--model,typestr,defaulttransunet,helpmodel name)argsparser.parse_args()returnargsdefcreate_model(args):ifargs.modeltransunet:returnTransUNet(num_classes2)else:raiseValueError(Invalid model name)defmain():argsparse_args()devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)test_datasetRemoteSensingDataset(image_dir./data/test_images,label_dir./data/test_labels,transformget_transform())modelcreate_model(args).to(device)model.load_state_dict(torch.load(fsave_weights/{args.model}/best_model.pth))model.eval()test_loaderDataLoader(test_dataset,batch_size1,shuffleFalse)withtorch.no_grad():forimages,labelsintqdm(test_loader):images,labelsimages.to(device),labels.to(device)outputsmodel(images)_,predictedtorch.max(outputs.data,1)# Save the predictionpredictedpredicted.cpu().numpy()[0]predicted_imgImage.fromarray(predicted.astype(np.uint8))predicted_img.save(os.path.join(./predictions,f{datetime.now().strftime(%Y%m%d_%H%M%S)}.png))if__name____main__:main()以上代码提供了一个完整的基于TransU-Net的遥感图像语义分割与分类的实现包括数据集准备、模型定义、训练和预测等步骤。你可以根据自己的需求进行调整和优化。以上文字及代码仅供参考学习使用。