语义分割任务 如何从准备数据到训练和评估一个基于U-Net的模型。训练使用遥感影像分析研究语义分割数据集

发布时间:2026/9/1 13:14:44
语义分割任务 如何从准备数据到训练和评估一个基于U-Net的模型。训练使用遥感影像分析研究语义分割数据集 使用U-Net处理Postdam数据集进行语义分割任务 如何从准备数据到训练和评估一个基于U-Net的模型。训练使用遥感影像分析研究数据集文章目录使用U-Net处理Postdam数据集进行语义分割任务 如何从准备数据到训练和评估一个基于U-Net的模型。训练使用遥感影像分析研究数据集1. 安装依赖2. 数据准备创建自定义的数据加载器3. 模型定义4. 训练模型5. 可视化预测结果Postdam数据集遥感影像-语义分割数据集Postdam数据集像素大小 512512训练图片为.tif 标签图片为.tif数据集 (train3678张 val920张)使用U-Net处理Postdam数据集进行语义分割但它同样适用于其他类型的分割任务包括遥感影像分析。以下是详细的步骤和代码示例帮助同学从准备数据到训练和评估一个基于U-Net的模型。1. 安装依赖首先确保你的环境中已经安装了必要的库pipinstalltorch torchvision tifffile segmentation-models-pytorch albumentations matplotlib2. 数据准备假设你的Postdam数据集已经被组织为包含.tif格式的图像和标签文件夹。我们将使用segmentation-models-pytorch来简化U-Net的实现并利用albumentations进行数据增强。创建自定义的数据加载器创建一个Python脚本来加载和预处理数据。这里我们假定每个图像都有一个对应的标签也是.tif格式并且它们都位于同一目录下但分别在不同的子文件夹中例如images/和masks/。importosimportnumpyasnpfromPILimportImageimporttorchfromtorch.utils.dataimportDataset,DataLoaderimportalbumentationsasAfromalbumentations.pytorchimportToTensorV2importtifffileclassPostdamDataset(Dataset):def__init__(self,image_dir,mask_dir,transformNone):self.image_dirimage_dir self.mask_dirmask_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])mask_pathos.path.join(self.mask_dir,self.images[index].replace(.tif,_mask.tif))imagenp.array(tifffile.imread(img_path))masknp.array(tifffile.imread(mask_path),dtypenp.float32)mask[mask255.0]1.0# 如果你的标签是以255表示背景或其他值请根据实际情况调整ifself.transformisnotNone:augmentationsself.transform(imageimage,maskmask)imageaugmentations[image]maskaugmentations[mask]returnimage,mask# 数据增强和转换train_transformA.Compose([A.Resize(height512,width512),A.HorizontalFlip(p0.5),A.VerticalFlip(p0.5),A.Normalize(mean[0.0,0.0,0.0],std[1.0,1.0,1.0],max_pixel_value255.0,),ToTensorV2(),],)val_transformA.Compose([A.Resize(height512,width512),A.Normalize(mean[0.0,0.0,0.0],std[1.0,1.0,1.0],max_pixel_value255.0,),ToTensorV2(),],)3. 模型定义我们可以直接使用segmentation-models-pytorch提供的U-Net实现。importsegmentation_models_pytorchassmpdefget_model():modelsmp.Unet(encoder_nameresnet34,# 使用resnet34作为编码器encoder_weightsimagenet,# 使用预训练权重in_channels3,# 输入通道数RGB图像classes6,# 输出类别数根据实际数据集调整)returnmodel4. 训练模型接下来编写Python脚本来训练模型。importtorch.optimasoptimimporttorch.nnasnnfromtorch.utils.dataimportDataLoaderimportmatplotlib.pyplotaspltdeftrain_model(model,train_loader,val_loader,epochs,optimizer,criterion,device):forepochinrange(epochs):model.train()running_loss0.0forimages,masksintrain_loader:imagesimages.to(device)masksmasks.long().to(device)# 确保目标张量类型为longoptimizer.zero_grad()outputsmodel(images)losscriterion(outputs,masks.squeeze(1))# squeeze维度以匹配loss函数要求loss.backward()optimizer.step()running_lossloss.item()*images.size(0)epoch_lossrunning_loss/len(train_loader.dataset)print(fEpoch{epoch1}/{epochs}, Loss:{epoch_loss})# 验证阶段略去通常包括计算验证集上的损失和准确率等指标# 加载数据train_datasetPostdamDataset(image_dirpath/to/train/images/,mask_dirpath/to/train/masks/,transformtrain_transform)val_datasetPostdamDataset(image_dirpath/to/val/images/,mask_dirpath/to/val/masks/,transformval_transform)train_loaderDataLoader(train_dataset,batch_size16,shuffleTrue)val_loaderDataLoader(val_dataset,batch_size16,shuffleFalse)# 初始化模型、优化器和损失函数modelget_model().to(cuda)# 或者 cpuoptimizeroptim.Adam(model.parameters(),lr1e-4)criterionnn.CrossEntropyLoss()# 开始训练train_model(model,train_loader,val_loader,epochs20,optimizeroptimizer,criterioncriterion,devicecuda)5. 可视化预测结果训练完成后可以对测试集中的图片进行预测并可视化结果。defvisualize_predictions(model,loader,device):model.eval()withtorch.no_grad():forimages,masksinloader:imagesimages.to(device)outputsmodel(images)predstorch.argmax(outputs,dim1).cpu().numpy()foriinrange(len(images)):plt.figure(figsize(10,5))plt.subplot(1,2,1)plt.imshow(images[i].permute(1,2,0).cpu().numpy())plt.title(Image)plt.subplot(1,2,2)plt.imshow(preds[i],cmapgray)plt.title(Prediction)plt.show()break# 仅展示一张图片为例# 使用方法visualize_predictions(model,val_loader,cuda)仅供参考代码 步骤提供了一个完整的流程从数据准备、模型定义到训练和结果可视化的完整指南特别适用于使用U-Net进行Postdam数据集的语义分割任务。

相关新闻