遥感无人机智慧能源发电厂遥感分割数据集 U-Net遥感无人机智慧能源发电厂遥感分割数据集

遥感无人机智慧能源发电厂遥感分割数据集

煤炭,石油,天然气,其他化石燃料,核能等11种类型分割出具体发电厂区域 发电厂分割数据集 自动化监测、分析以及优化各种能源发电厂的运营情况。

数据集文字描述:

遥感无人机智慧能源(煤炭,石油,太阳能等)发电厂遥感分割数据集,4400余对遥感影像(每对影像包含1m分辨率与30m分辨率),19GB,分割类别按照电厂燃料类别区分,共区分为煤炭,石油,天然气,其他化石燃料,核能,水利发电,太阳能,风能,地热能,废热,生物质11种类型,且分割出具体发电厂区域(mask、yolo格式)

✅ 遥感智慧能源发电厂分割数据集

项目详情
数据集名称遥感智慧能源发电厂分割数据集
数据总量4400余对影像(共8800张影像)
数据量大小约19GB
影像分辨率每对影像包括:
- 1米分辨率
- 30米分辨率
影像格式常见遥感影像格式(如GeoTIFF等)
标注格式分割掩膜(mask图像),YOLO格式(txt文件)
应用场景能源监测、环境管理、智能电网规划等
数据集组织结构图像与对应标签一一配对存储

📋 发电厂类型分类表

类别编号英文名称中文解释备注
0coal煤炭主要化石燃料之一
1oil石油另一主要化石燃料
2natural_gas天然气清洁化石燃料
3other_fossil_fuels其他化石燃料包括但不限于油页岩、油砂等
4nuclear核能核反应堆发电
5hydroelectric水利发电利用水力发电
6solar太阳能太阳能光伏发电或热发电
7wind风能风力涡轮机发电
8geothermal地热能地热资源利用发电
9waste_heat废热工业废热回收发电
10biomass生物质生物质能发电

🗂️ 博主建议 数据集目录结构建议

remote_sensing_power_plants/ ├── images/ # 原始遥感影像 │ ├── high_res/ # 1米分辨率影像 │ │ ├── image_0001.tif │ │ └── ... │ └── low_res/ # 30米分辨率影像 │ ├── image_0001.tif │ └── ... ├── masks/ # 对应的分割掩膜(mask图像) │ ├── mask_0001.png # 二值化掩膜图,像素值代表类别ID │ └── ... ├── labels_yolo/ # YOLO格式标注(txt文件) │ ├── label_0001.txt # 每行表示一个bounding box及类别ID │ └── ... └── data.yaml # 数据集配置文件(用于模型训练)

🧪 数据用途与价值

应用方向说明
能源监控与管理实时监测各类能源发电厂的状态,优化能源调度
环境保护与规划分析不同能源发电厂对环境的影响,制定可持续发展规划
智能电网建设支持智能电网中的能源分布可视化,提升电网运行效率
学术研究与教育提供丰富的遥感影像数据,支持相关领域的科研与教学活动
灾害预警与应急响应快速识别受损发电设施,辅助灾后恢复决策

🛠️ 数据增强与处理建议

  • 多尺度分析:结合1米和30米分辨率影像,进行多尺度特征提取。
  • 数据增强:使用旋转、翻转、色彩抖动等方法增加样本多样性,提高模型鲁棒性。
  • 跨域迁移学习:在其他领域预训练的模型基础上进行微调,加速训练过程并提升性能。

此数据集为能源行业提供了一个强大的工具,可用于自动化监测、分析以及优化各种能源发电厂的运营情况。


✅ 一、环境依赖

pipinstalltorch torchvision numpy opencv-python pillow scikit-image albumentations matplotlib

✅ 二、数据集结构

remote_sensing_power_plants/ ├── images/ # 1米分辨率遥感图像(GeoTIFF 或 PNG) │ ├── img_0001.png │ └── ... ├── masks/ # 对应的分割掩膜(单通道 PNG,像素值 0-10 表示类别) │ ├── mask_0001.png │ └── ... └── data.yaml # 类别配置文件(可选)

📌说明

  • 图像尺寸可变(如 512×512 或 1024×1024),建议统一裁剪或缩放。
  • 掩膜为单通道图像,像素值 ∈ [0, 10],分别对应 11 类发电厂类型。
  • 若使用 GeoTIFF,可用rasteriotifffile读取。

✅ 三、数据集类定义(含数据增强)

importosfromPILimportImageimportnumpyasnpimporttorchfromtorch.utils.dataimportDataset,DataLoaderimportalbumentationsasAfromalbumentations.pytorchimportToTensorV2classEnergyPlantDataset(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=sorted(os.listdir(image_dir))def__len__(self):returnlen(self.images)def__getitem__(self,idx):img_name=self.images[idx]img_path=os.path.join(self.image_dir,img_name)mask_path=os.path.join(self.mask_dir,img_name.replace('.tif','.png'))# 假设掩膜是PNG# 读取图像(遥感影像通常为多波段,这里简化为RGB)image=np.array(Image.open(img_path).convert("RGB"))mask=np.array(Image.open(mask_path).convert("L"),dtype=np.int64)# 单通道,类别IDifself.transform:augmented=self.transform(image=image,mask=mask)image=augmented["image"]mask=augmented["mask"]returnimage,mask# 数据增强与预处理train_transform=A.Compose([A.Resize(512,512),# 统一分辨率A.Rotate(limit=30,p=0.5),A.HorizontalFlip(p=0.5),A.VerticalFlip(p=0.2),A.ColorJitter(brightness=0.2,contrast=0.2,saturation=0.2,hue=0.1,p=0.5),A.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]),ToTensorV2(),])val_transform=A.Compose([A.Resize(512,512),A.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]),ToTensorV2(),])

✅ 四、U-Net 模型定义(简化版)

importtorch.nnasnnimporttorchclassUNet(nn.Module):def__init__(self,in_channels=3,num_classes=11):super(UNet,self).__init__()# 编码器self.enc1=self.conv_block(in_channels,64)self.pool1=nn.MaxPool2d(2)self.enc2=self.conv_block(64,128)self.pool2=nn.MaxPool2d(2)self.enc3=self.conv_block(128,256)self.pool3=nn.MaxPool2d(2)self.enc4=self.conv_block(256,512)self.pool4=nn.MaxPool2d(2)# 瓶颈层self.bottleneck=self.conv_block(512,1024)# 解码器self.up4=self.up_conv(1024,512)self.dec4=self.conv_block(1024,512)self.up3=self.up_conv(512,256)self.dec3=self.conv_block(512,256)self.up2=self.up_conv(256,128)self.dec2=self.conv_block(256,128)self.up1=self.up_conv(128,64)self.dec1=self.conv_block(128,64)# 输出层self.final=nn.Conv2d(64,num_classes,kernel_size=1)defconv_block(self,in_channels,out_channels):returnnn.Sequential(nn.Conv2d(in_channels,out_channels,3,padding=1),nn.ReLU(inplace=True),nn.BatchNorm2d(out_channels),nn.Conv2d(out_channels,out_channels,3,padding=1),nn.ReLU(inplace=True),nn.BatchNorm2d(out_channels))defup_conv(self,in_channels,out_channels):returnnn.ConvTranspose2d(in_channels,out_channels,kernel_size=2,stride=2)defforward(self,x):# 编码e1=self.enc1(x)e2=self.enc2(self.pool1(e1))e3=self.enc3(self.pool2(e2))e4=self.enc4(self.pool3(e3))# 瓶颈b=self.bottleneck(self.pool4(e4))# 解码 + 跳跃连接d4=self.up4(b)d4=torch.cat((e4,d4),dim=1)d4=self.dec4(d4)d3=self.up3(d4)d3=torch.cat((e3,d3),dim=1)d3=self.dec3(d3)d2=self.up2(d3)d2=torch.cat((e2,d2),dim=1)d2=self.dec2(d2)d1=self.up1(d2)d1=torch.cat((e1,d1),dim=1)d1=self.dec1(d1)out=self.final(d1)returnout

✅ 五、训练主函数

deftrain_model(model,dataloaders,criterion,optimizer,num_epochs=50):device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")model.to(device)forepochinrange(num_epochs):print(f'Epoch{epoch+1}/{num_epochs}')print('-'*30)forphasein['train','val']:ifphase=='train':model.train()else:model.eval()running_loss=0.0running_iou=0.0forinputs,masksindataloaders[phase]:inputs=inputs.to(device)masks=masks.to(device).long()optimizer.zero_grad()withtorch.set_grad_enabled(phase=='train'):outputs=model(inputs)loss=criterion(outputs,masks)ifphase=='train':loss.backward()optimizer.step()running_loss+=loss.item()*inputs.size(0)# 计算 mIoU(简化版)preds=torch.argmax(outputs,dim=1)iou=compute_iou(preds,masks,num_classes=11)running_iou+=iou*inputs.size(0)epoch_loss=running_loss/len(dataloaders[phase].dataset)epoch_iou=running_iou/len(dataloaders[phase].dataset)print(f'{phase}Loss:{epoch_loss:.4f}, mIoU:{epoch_iou:.4f}')returnmodel# IoU 计算函数defcompute_iou(pred,target,num_classes):iou=0forclsinrange(num_classes):pred_cls=(pred==cls)target_cls=(target==cls)intersection=torch.logical_and(pred_cls,target_cls).sum().float()union=torch.logical_or(pred_cls,target_cls).sum().float()ifunion==0:continueiou+=(intersection/union)returniou/num_classes# 数据加载train_dataset=EnergyPlantDataset(image_dir='remote_sensing_power_plants/images',mask_dir='remote_sensing_power_plants/masks',transform=train_transform)val_dataset=EnergyPlantDataset(image_dir='remote_sensing_power_plants/images',# 实际应为验证集路径mask_dir='remote_sensing_power_plants/masks',transform=val_transform)# 划分训练/验证集(示例)train_size=int(0.8*len(train_dataset))val_size=len(train_dataset)-train_size train_dataset,val_dataset=torch.utils.data.random_split(train_dataset,[train_size,val_size])dataloaders={'train':DataLoader(train_dataset,batch_size=4,shuffle=True),'val':DataLoader(val_dataset,batch_size=4,shuffle=False)}# 初始化模型、损失函数和优化器model=UNet(in_channels=3,num_classes=11)criterion=nn.CrossEntropyLoss()optimizer=torch.optim.Adam(model.parameters(),lr=1e-4)# 开始训练trained_model=train_model(model,dataloaders,criterion,optimizer,num_epochs=50)# 保存模型torch.save(trained_model.state_dict(),'unet_energy_plant_segmentation.pth')print("✅ 模型训练完成,已保存为 unet_energy_plant_segmentation.pth")

✅ 六、输出说明

文件/指标说明
unet_energy_plant_segmentation.pth训练好的模型权重
Loss交叉熵损失,反映模型拟合程度
mIoU平均交并比,衡量分割精度
train/val训练集和验证集性能对比