遥感无人机智慧能源发电厂遥感分割数据集 U-Net遥感无人机智慧能源发电厂遥感分割数据集
遥感无人机智慧能源发电厂遥感分割数据集
煤炭,石油,天然气,其他化石燃料,核能等11种类型分割出具体发电厂区域 发电厂分割数据集 自动化监测、分析以及优化各种能源发电厂的运营情况。
数据集文字描述:
遥感无人机智慧能源(煤炭,石油,太阳能等)发电厂遥感分割数据集,4400余对遥感影像(每对影像包含1m分辨率与30m分辨率),19GB,分割类别按照电厂燃料类别区分,共区分为煤炭,石油,天然气,其他化石燃料,核能,水利发电,太阳能,风能,地热能,废热,生物质11种类型,且分割出具体发电厂区域(mask、yolo格式)
✅ 遥感智慧能源发电厂分割数据集
| 项目 | 详情 |
|---|---|
| 数据集名称 | 遥感智慧能源发电厂分割数据集 |
| 数据总量 | 4400余对影像(共8800张影像) |
| 数据量大小 | 约19GB |
| 影像分辨率 | 每对影像包括: - 1米分辨率 - 30米分辨率 |
| 影像格式 | 常见遥感影像格式(如GeoTIFF等) |
| 标注格式 | 分割掩膜(mask图像),YOLO格式(txt文件) |
| 应用场景 | 能源监测、环境管理、智能电网规划等 |
| 数据集组织结构 | 图像与对应标签一一配对存储 |
📋 发电厂类型分类表
| 类别编号 | 英文名称 | 中文解释 | 备注 |
|---|---|---|---|
| 0 | coal | 煤炭 | 主要化石燃料之一 |
| 1 | oil | 石油 | 另一主要化石燃料 |
| 2 | natural_gas | 天然气 | 清洁化石燃料 |
| 3 | other_fossil_fuels | 其他化石燃料 | 包括但不限于油页岩、油砂等 |
| 4 | nuclear | 核能 | 核反应堆发电 |
| 5 | hydroelectric | 水利发电 | 利用水力发电 |
| 6 | solar | 太阳能 | 太阳能光伏发电或热发电 |
| 7 | wind | 风能 | 风力涡轮机发电 |
| 8 | geothermal | 地热能 | 地热资源利用发电 |
| 9 | waste_heat | 废热 | 工业废热回收发电 |
| 10 | biomass | 生物质 | 生物质能发电 |
🗂️ 博主建议 数据集目录结构建议
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,可用
rasterio或tifffile读取。
✅ 三、数据集类定义(含数据增强)
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 | 训练集和验证集性能对比 |
