遥感建筑物识别数据集 基于PyTorch的U-Net模型的训练遥感建筑物坍塌评估分割数据集 PART1 20000张左右图像+30GB part2,36000张图像,13.5GB
发布时间:2026/9/2 21:47:47 作者:尧图编辑部 阅读量:1,286

遥感建筑物识别数据集 基于PyTorch的U-Net模型的训练遥感建筑物坍塌评估分割数据集 PART1 20000张左右图像30GB part236000张图像13.5GB遥感建筑物坍塌评估分割数据集part1共20000张左右图像30GB左右统一为1024×1024尺寸part236000张图像13.5GB数据512×512尺寸全球范围选取图像包含灾害类型有洪水地震飓风火山龙卷风分割标签按照损坏程度分为12341代表无损坏2代表建筑物部分烧毁、建筑物周围有水、屋顶构件缺失或可见裂缝3代表部分墙壁或屋顶倒塌4代表结构被烧焦、完全倒塌、部分或完全被水或泥土覆盖或不再存在附训练代码针对遥感建筑物坍塌评估分割数据集我们可以使用深度学习模型进行训练和评估。由于这是一个分割任务我们将使用语义分割模型例如U-Net、DeepLabV3 或者其他适合的分割模型。这里我将提供一个基于PyTorch的U-Net模型的训练代码示例。1. 环境准备首先确保你已经安装了必要的库和工具。你可以使用以下命令安装所需的库pipinstalltorch torchvision pipinstallnumpy pipinstallpandas pipinstallmatplotlib pipinstallopencv-python pipinstallpyyaml pipinstallsegmentation_models_pytorch2. 数据集准备假设你的数据集目录结构如下building_collapse_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── masks/ │ ├── train/ │ ├── val/ │ └── test/ └── building_collapse.yaml每个图像文件和对应的标签文件都以相同的文件名命名例如0001.jpg和0001.png。3. 创建数据集配置文件你已经有一个building_collapse.yaml文件内容如下train_images:../building_collapse_dataset/images/trainval_images:../building_collapse_dataset/images/valtest_images:../building_collapse_dataset/images/testtrain_masks:../building_collapse_dataset/masks/trainval_masks:../building_collapse_dataset/masks/valtest_masks:../building_collapse_dataset/masks/testnc:5names:[No Damage,Partial Damage,Moderate Damage,Severe Damage,Total Collapse]4. 数据加载器创建自定义的数据加载器来读取图像和掩码。importosimportcv2importnumpyasnpfromtorch.utils.dataimportDataset,DataLoaderclassBuildingCollapseDataset(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,idx):img_pathos.path.join(self.image_dir,self.images[idx])mask_pathos.path.join(self.mask_dir,self.images[idx].replace(.jpg,.png))imagecv2.imread(img_path)imagecv2.cvtColor(image,cv2.COLOR_BGR2RGB)maskcv2.imread(mask_path,0)# Read mask in grayscaleifself.transformisnotNone:augmentedself.transform(imageimage,maskmask)imageaugmented[image]maskaugmented[mask]returnimage,mask5. 数据增强使用albumentations库进行数据增强。importalbumentationsasAfromalbumentations.pytorchimportToTensorV2 transformA.Compose([A.Resize(512,512),# 根据需要调整尺寸A.Rotate(limit35,p1.0),A.HorizontalFlip(p0.5),A.VerticalFlip(p0.5),A.Normalize(mean[0.0,0.0,0.0],std[1.0,1.0,1.0],好的我们继续完善这个项目。接下来我们将进一步讨论一些额外的步骤和优化方法以确保模型的性能和泛化能力。### 10. 模型评估在训练完成后我们需要对模型进行详细的评估包括计算各种指标如准确率、召回率、F1分数等并可视化预测结果。#### 10.1 计算评估指标我们可以使用 torchmetrics 库来计算分割任务中的常见指标。 bash pip install torchmetrics然后在验证和测试阶段计算这些指标fromtorchmetricsimportJaccardIndex,Dice,Accuracy# 初始化指标jaccardJaccardIndex(num_classes5).to(device)diceDice(num_classes5).to(device)accuracyAccuracy(num_classes5,averagemacro).to(device)# 验证循环model.eval()withtorch.no_grad():forimages,masksinval_loader:imagesimages.to(device)masksmasks.to(device)outputsmodel(images)predstorch.argmax(outputs,dim1)# 更新指标jaccard.update(preds,masks)dice.update(preds,masks)accuracy.update(preds,masks)# 计算最终指标val_jaccardjaccard.compute()val_dicedice.compute()val_accuracyaccuracy.compute()print(fValidation Jaccard Index:{val_jaccard:.4f})print(fValidation Dice Score:{val_dice:.4f})print(fValidation Accuracy:{val_accuracy:.4f})# 测试循环model.eval()withtorch.no_grad():forimages,masksintest_loader:imagesimages.to(device)masksmasks.to(device)outputsmodel(images)predstorch.argmax(outputs,dim1)# 更新指标jaccard.update(preds,masks)dice.update(preds,masks)accuracy.update(preds,masks)# 计算最终指标test_jaccardjaccard.compute()test_dicedice.compute()test_accuracyaccuracy.compute()print(fTest Jaccard Index:{test_jaccard:.4f})print(fTest Dice Score:{test_dice:.4f})print(fTest Accuracy:{test_accuracy:.4f})11. 可视化预测结果为了更好地理解模型的性能我们可以将预测结果与真实标签进行对比并可视化。importmatplotlib.pyplotaspltdefvisualize_predictions(model,data_loader,num_images5):model.eval()fig,axesplt.subplots(num_images,3,figsize(15,5*num_images))withtorch.no_grad():fori,(images,masks)inenumerate(data_loader):ifinum_images:breakimagesimages.to(device)masksmasks.to(device)outputsmodel(images)predstorch.argmax(outputs,dim1).squeeze().cpu().numpy()masksmasks.squeeze().cpu().numpy()imageimages.squeeze().permute(1,2,0).cpu().numpy()axes[i,0].imshow(image)axes[i,0].set_title(Input Image)axes[i,0].axis(off)axes[i,1].imshow(masks,cmapviridis)axes[i,1].set_title(True Mask)axes[i,1].axis(off)axes[i,2].imshow(preds,cmapviridis)axes[i,2].set_title(Predicted Mask)axes[i,2].axis(off)plt.show()# 使用验证集或测试集进行可视化visualize_predictions(model,val_loader,num_images5)12. 模型优化为了进一步优化模型可以尝试以下方法调整超参数学习率、批量大小、权重衰减等。使用预训练模型使用预训练的编码器作为初始化权重。数据增强增加数据多样性提高模型的泛化能力。模型融合使用多个模型进行集成学习提高预测的准确性。更复杂的网络结构尝试使用更大的U-Net模型或其他高级分割模型如DeepLabV3。类别平衡如果某些类别的样本数量不平衡可以使用类别平衡技术如过采样或欠采样。损失函数尝试不同的损失函数如Dice Loss、Focal Loss等。13. 超参数调优可以使用optuna或Ray Tune等库来进行超参数调优。pipinstalloptuna示例代码importoptunadefobjective(trial):learning_ratetrial.suggest_loguniform(learning_rate,1e-5,1e-1)batch_sizetrial.suggest_categorical(batch_size,[8,16,32])weight_decaytrial.suggest_loguniform(weight_decay,1e-6,1e-3)# 创建数据加载器train_loaderDataLoader(train_dataset,batch_sizebatch_size,shuffleTrue,num_workers4)val_loaderDataLoader(val_dataset,batch_sizebatch_size,shuffleFalse,num_workers4)# 模型、损失函数和优化器modelsmp.Unet(encoder_nameresnet34,encoder_weightsimagenet,in_channels3,classes5).to(device)criterionnn.CrossEntropyLoss()optimizeroptim.Adam(model.parameters(),lrlearning_rate,weight_decayweight_decay)# 训练循环forepochinrange(num_epochs):model.train()running_loss0.0forimages,masksintrain_loader:imagesimages.to(device)masksmasks.to(device)optimizer.zero_grad()outputsmodel(images)losscriterion(outputs,masks)loss.backward()optimizer.step()running_lossloss.item()avg_train_lossrunning_loss/len(train_loader)# 验证model.eval()withtorch.no_grad():running_val_loss0.0forimages,masksinval_loader:imagesimages.to(device)masksmasks.to(device)outputsmodel(images)losscriterion(outputs,masks)running_val_lossloss.item()avg_val_lossrunning_val_loss/len(val_loader)trial.report(avg_val_loss,epoch)# Handle pruning based on the intermediate value.iftrial.should_prune():raiseoptuna.exceptions.TrialPruned()returnavg_val_loss studyoptuna.create_study(directionminimize)study.optimize(objective,n_trials20)print(Best trial:)trialstudy.best_trialprint( Value: ,trial.value)print( Params: )forkey,valueintrial.params.items():print( {}: {}.format(key,value))14. 总结通过以上步骤你可以成功地使用U-Net模型对遥感建筑物坍塌评估分割数据集进行训练、评估和优化。