基于UNet的灾后高分辨率无人机图像语义分割:水体、建筑损毁与复杂场景精准识别实战 洪水、飓风等灾后救援无人机图像语义分割数据集
基于UNet的灾后高分辨率无人机图像语义分割:水体、建筑损毁与复杂场景精准识别实战 洪水、飓风等灾后救援无人机图像语义分割数据集 无人机洪水等灾害数据集的训练及应用
文章目录
- 🎨 语义分割类别表
- 1. 环境搭建
- 2. 数据预处理
- 3. UNet模型构建
- 4. 训练模型
- 5. 结果展示与评估
以下文字及代码仅供参考学习
灾害类数据集的训练及应用 洪水、飓风等灾后救援高分辨率无人机图像语义分割数据集
1.高分辨率图像:22GB数据量,数据集中的图像具有高清晰度(4000*3000分辨率),能够捕捉更多细节,有利于识别小尺度目标。
2.丰富的语义标注:包含多种灾害场景下的像素级标注,涵盖水、建筑物、车辆、道路、树木和池塘等10个类别。
3.多样的灾害场景:数据集包含多种灾害类型(如飓风、洪水等)的场景,覆盖不同的光照和天气条件。
4.损坏程度分类:除了语义分割标注外,还提供了建筑物和道路的损坏程度分类(如轻微损坏、中度损坏、严重损坏等)。
5.图像数量:共4494张图像。
6.语义分割类别:包括水、无损坏建筑、轻微损坏建筑、严重损坏建筑、完全损毁建筑、车辆、畅通道路、阻塞道路、树木和池塘。
语义分割类别的英文表格,
🎨 语义分割类别表
| 序号 | 中文名称 | 英文名称 | 颜色编码 |
|---|---|---|---|
| 0 | 背景 | Background | |
| 1 | 水 | Water | |
| 2 | 无损坏建筑 | Building-No-Damage | |
| 3 | 轻微损坏建筑 | Building-Medium-Damage | |
| 4 | 严重损坏建筑 | Building-Major-Damage | |
| 5 | 完全损毁建筑 | Building-Total-Destruction | |
| 6 | 车辆 | Vehicle | |
| 7 | 畅通道路 | Road-Clear | |
| 8 | 阻塞道路 | Road-Blocked | |
| 9 | 树木 | Tree | |
| 10 | 池塘 | Pool |
使用UNet进行语义分割是一个经典的选择,尤其适合处理高分辨率图像。基于你提供的关于灾后救援高分辨率无人机图像的数据集信息,
下面将指导你如何准备数据、训练UNet模型,并对结果进行评估和展示。仅供参考学习。
1. 环境搭建
首先,确保你的环境中安装了必要的库:
pipinstalltorch torchvision numpy matplotlib opencv-python如果你想要更高效的训练(特别是在GPU上),请确认PyTorch已经正确配置为使用CUDA。
2. 数据预处理
假设你的数据集结构如下:
dataset/ ├── images/ # 原始图像 └── masks/ # 标注图像(每个像素值代表类别ID)创建一个自定义的Dataset类来加载图像和对应的标签:
importosfromtorch.utils.dataimportDataset,DataLoaderfromPILimportImageimportnumpyasnpimporttorchfromtorchvisionimporttransformsclassDisasterRecoveryDataset(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","_mask.png"))image=np.array(Image.open(img_path).convert("RGB"))mask=np.array(Image.open(mask_path).convert("L"),dtype=np.float32)# 转换为灰度图ifself.transformisnotNone:augmentations=self.transform(image=image,mask=mask)image=augmentations["image"]mask=augmentations["mask"]# Normalize and convert to tensorimage=transforms.ToTensor()(image)mask=torch.tensor(mask,dtype=torch.long)returnimage,mask定义一些基本的图像增强操作:
importalbumentationsasAfromalbumentations.pytorchimportToTensorV2 transform=A.Compose([A.Resize(height=4000,width=3000),# 根据需要调整大小A.Normalize(mean=[0.0,0.0,0.0],std=[1.0,1.0,1.0],max_pixel_value=255.0,),ToTensorV2(),],)3. UNet模型构建
这里提供了一个简单的UNet实现:
importtorch.nnasnnimporttorchclassUNet(nn.Module):def__init__(self,in_channels=3,out_channels=10):# 根据类别数量调整out_channelssuper(UNet,self).__init__()# 定义UNet的各层...# 这里省略了具体的网络结构定义,请根据实际需求或参考官方UNet实现添加代码。passdefforward(self,x):# 前向传播逻辑...pass# 实例化模型model=UNet(in_channels=3,out_channels=10).cuda()# 如果有GPU的话请注意,上述代码中的UNet架构部分被简化了。你需要根据实际情况或者参考UNet的原始论文来完成整个网络的设计。
4. 训练模型
定义损失函数、优化器,并开始训练:
criterion=nn.CrossEntropyLoss()optimizer=torch.optim.Adam(model.parameters(),lr=1e-4)deftrain_model(model,dataloaders,criterion,optimizer,num_epochs=25):forepochinrange(num_epochs):print('Epoch {}/{}'.format(epoch,num_epochs-1))print('-'*10)forphasein['train','val']:ifphase=='train':model.train()else:model.eval()running_loss=0.0forinputs,labelsindataloaders[phase]:inputs=inputs.cuda()labels=labels.cuda()optimizer.zero_grad()withtorch.set_grad_enabled(phase=='train'):outputs=model(inputs)loss=criterion(outputs,labels)ifphase=='train':loss.backward()optimizer.step()running_loss+=loss.item()*inputs.size(0)epoch_loss=running_loss/len(dataloaders[phase].dataset)print('{} Loss: {:.4f}'.format(phase,epoch_loss))returnmodel# 加载数据集dataset_train=DisasterRecoveryDataset(image_dir="path/to/train_images/",mask_dir="path/to/train_masks/",transform=transform)dataset_val=DisasterRecoveryDataset(image_dir="path/to/val_images/",mask_dir="path/to/val_masks/",transform=transform)dataloader_train=DataLoader(dataset_train,batch_size=2,shuffle=True)dataloader_val=DataLoader(dataset_val,batch_size=2,shuffle=False)dataloaders_dict={"train":dataloader_train,"val":dataloader_val}# 开始训练trained_model=train_model(model,dataloaders_dict,criterion,optimizer,num_epochs=25)5. 结果展示与评估
在验证集或测试集上进行预测并可视化结果:
importmatplotlib.pyplotaspltdefvisualize_predictions(model,dataloader):model.eval()withtorch.no_grad():fori,(inputs,labels)inenumerate(dataloader):inputs=inputs.cuda()outputs=model(inputs)_,preds=torch.max(outputs,1)fig,axarr=plt.subplots(1,3)axarr[0].imshow(inputs.cpu().numpy()[0].transpose(1,2,0))axarr[1].imshow(labels.cpu().numpy()[0],cmap='gray')axarr[2].imshow(preds.cpu().numpy()[0],cmap='gray')plt.show()break# 只显示一张图片作为示例visualize_predictions(trained_model,dataloader_val)基础框架,具体细节如UNet的具体实现、超参数调整等可能需要根据实际情况进一步优化。仅供参考学习使用。