遥感建筑物识别数据集 基于PyTorch的U-Net模型的训练遥感建筑物坍塌评估分割数据集 PART1 20000张左右图像+30GB part2,36000张图像,13.5GB![]()
遥感建筑物坍塌评估分割数据集
part1,共20000张左右图像,30GB左右,统一为1024×1024尺寸,
part2,36000张图像,13.5GB数据,512×512尺寸,全球范围选取图像,包含灾害类型有洪水,地震,飓风,火山,龙卷风
分割标签按照损坏程度分为1,2,3,4
(1代表无损坏,
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,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=cv2.imread(img_path)image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)mask=cv2.imread(mask_path,0)# Read mask in grayscaleifself.transformisnotNone:augmented=self.transform(image=image,mask=mask)image=augmented['image']mask=augmented['mask']returnimage,mask5. 数据增强
使用albumentations库进行数据增强。
importalbumentationsasAfromalbumentations.pytorchimportToTensorV2 transform=A.Compose([A.Resize(512,512),# 根据需要调整尺寸A.Rotate(limit=35,p=1.0),A.HorizontalFlip(p=0.5),A.VerticalFlip(p=0.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# 初始化指标jaccard=JaccardIndex(num_classes=5).to(device)dice=Dice(num_classes=5).to(device)accuracy=Accuracy(num_classes=5,average='macro').to(device)# 验证循环model.eval()withtorch.no_grad():forimages,masksinval_loader:images=images.to(device)masks=masks.to(device)outputs=model(images)preds=torch.argmax(outputs,dim=1)# 更新指标jaccard.update(preds,masks)dice.update(preds,masks)accuracy.update(preds,masks)# 计算最终指标val_jaccard=jaccard.compute()val_dice=dice.compute()val_accuracy=accuracy.compute()print(f'Validation Jaccard Index:{val_jaccard:.4f}')print(f'Validation Dice Score:{val_dice:.4f}')print(f'Validation Accuracy:{val_accuracy:.4f}')# 测试循环model.eval()withtorch.no_grad():forimages,masksintest_loader:images=images.to(device)masks=masks.to(device)outputs=model(images)preds=torch.argmax(outputs,dim=1)# 更新指标jaccard.update(preds,masks)dice.update(preds,masks)accuracy.update(preds,masks)# 计算最终指标test_jaccard=jaccard.compute()test_dice=dice.compute()test_accuracy=accuracy.compute()print(f'Test Jaccard Index:{test_jaccard:.4f}')print(f'Test Dice Score:{test_dice:.4f}')print(f'Test Accuracy:{test_accuracy:.4f}')11. 可视化预测结果
为了更好地理解模型的性能,我们可以将预测结果与真实标签进行对比并可视化。
importmatplotlib.pyplotaspltdefvisualize_predictions(model,data_loader,num_images=5):model.eval()fig,axes=plt.subplots(num_images,3,figsize=(15,5*num_images))withtorch.no_grad():fori,(images,masks)inenumerate(data_loader):ifi>=num_images:breakimages=images.to(device)masks=masks.to(device)outputs=model(images)preds=torch.argmax(outputs,dim=1).squeeze().cpu().numpy()masks=masks.squeeze().cpu().numpy()image=images.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,cmap='viridis')axes[i,1].set_title('True Mask')axes[i,1].axis('off')axes[i,2].imshow(preds,cmap='viridis')axes[i,2].set_title('Predicted Mask')axes[i,2].axis('off')plt.show()# 使用验证集或测试集进行可视化visualize_predictions(model,val_loader,num_images=5)12. 模型优化
为了进一步优化模型,可以尝试以下方法:
- 调整超参数:学习率、批量大小、权重衰减等。
- 使用预训练模型:使用预训练的编码器作为初始化权重。
- 数据增强:增加数据多样性,提高模型的泛化能力。
- 模型融合:使用多个模型进行集成学习,提高预测的准确性。
- 更复杂的网络结构:尝试使用更大的U-Net模型或其他高级分割模型,如DeepLabV3+。
- 类别平衡:如果某些类别的样本数量不平衡,可以使用类别平衡技术,如过采样或欠采样。
- 损失函数:尝试不同的损失函数,如Dice Loss、Focal Loss等。
13. 超参数调优
可以使用optuna或Ray Tune等库来进行超参数调优。
pipinstalloptuna示例代码:
importoptunadefobjective(trial):learning_rate=trial.suggest_loguniform('learning_rate',1e-5,1e-1)batch_size=trial.suggest_categorical('batch_size',[8,16,32])weight_decay=trial.suggest_loguniform('weight_decay',1e-6,1e-3)# 创建数据加载器train_loader=DataLoader(train_dataset,batch_size=batch_size,shuffle=True,num_workers=4)val_loader=DataLoader(val_dataset,batch_size=batch_size,shuffle=False,num_workers=4)# 模型、损失函数和优化器model=smp.Unet(encoder_name="resnet34",encoder_weights="imagenet",in_channels=3,classes=5).to(device)criterion=nn.CrossEntropyLoss()optimizer=optim.Adam(model.parameters(),lr=learning_rate,weight_decay=weight_decay)# 训练循环forepochinrange(num_epochs):model.train()running_loss=0.0forimages,masksintrain_loader:images=images.to(device)masks=masks.to(device)optimizer.zero_grad()outputs=model(images)loss=criterion(outputs,masks)loss.backward()optimizer.step()running_loss+=loss.item()avg_train_loss=running_loss/len(train_loader)# 验证model.eval()withtorch.no_grad():running_val_loss=0.0forimages,masksinval_loader:images=images.to(device)masks=masks.to(device)outputs=model(images)loss=criterion(outputs,masks)running_val_loss+=loss.item()avg_val_loss=running_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 study=optuna.create_study(direction='minimize')study.optimize(objective,n_trials=20)print("Best trial:")trial=study.best_trialprint(" Value: ",trial.value)print(" Params: ")forkey,valueintrial.params.items():print(" {}: {}".format(key,value))14. 总结
通过以上步骤,你可以成功地使用U-Net模型对遥感建筑物坍塌评估分割数据集进行训练、评估和优化。