news 2026/5/1 8:10:40

地震滑坡应急响应、全球灾害制图、遥感 AI 模型泛化性研究无人机(UAV)航拍影像、PlanetScope、Gaofen-6(高分六号)卫星影像 以及 天地图(Map World)数据集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
地震滑坡应急响应、全球灾害制图、遥感 AI 模型泛化性研究无人机(UAV)航拍影像、PlanetScope、Gaofen-6(高分六号)卫星影像 以及 天地图(Map World)数据集

全球分布式大规模滑坡数据集

数据集整合了来自 鲁定(Luding)、尼普斯(Nippes)、北海道(Hokkaido)、九寨沟(Jiuzhaigou)和米林(Mainling) 五个地震滑坡高发区域的多源遥感影像,涵盖了 无人机(UAV)航拍影像、PlanetScope、Gaofen-6(高分六号)卫星影像 以及 天地图(Map World) 数据。数据通过多源高分辨率遥感图像实现全球分布式滑坡样本的构建,旨在支持地震诱发滑坡检测、分割及灾后评估等任务。整个数据集采用 TIFF 格式 存储,包含 训练集(train) 与 验证集(validation) 两部分,按照约 3:1(0.75:0.25)比例 随机划分,且每幅影像均不含重叠区域。

数据集大小:15621张,共26.7G
图像大小:1024×1024
图像分辨率:0.5m-3m
传感器:UAV, Map World,PlanetScope, Gaofen-6
波段:RGB
图片格式:tiff
滑坡地区:Luding, Nippes, Hokkaido,Jiuzhaigou and Mainling


全球分布式大规模滑坡数据集(15,621 张 1024×1024 RGB GeoTIFF 图像,含滑坡掩膜标签)的完整训练代码,基于语义分割任务,使用PyTorch + torchvision + Albumentations + segmentation_models_pytorch,支持多源遥感影像输入,适用于滑坡检测与灾后评估。


✅ 一、任务说明

  • 任务类型:二类语义分割(滑坡 vs 非滑坡)
  • 输入:1024×1024 RGB GeoTIFF(*.tif
  • 标签:对应二值掩膜(0=背景,1=滑坡),同样为*.tif
  • 模型建议:U-Net、DeepLabV3+、FPN(推荐使用预训练编码器)

✅ 二、目录结构(要求)

LandslideDataset/ ├── train/ │ ├── images/ # *.tif │ └── masks/ # *.tif (same name as image) └── val/ ├── images/ └── masks/

示例:

  • train/images/Luding_001.tif
  • train/masks/Luding_001.tif

✅ 三、环境安装

pipinstalltorch torchvision torchaudio pipinstallalbumentations opencv-python pillow pipinstallsegmentation-models-pytorch geopandas rasterio scikit-image pipinstalltqdm tensorboard matplotlib
  • segmentation-models-pytorch:提供 SOTA 分割架构
  • rasterio:高效读取 GeoTIFF
  • albumentations:遥感图像增强

✅ 四、完整训练代码:train_landslide.py

# train_landslide.pyimportosimporttorchimporttorch.nnasnnfromtorch.utils.dataimportDataLoaderfromtorch.optimimportAdamWfromtorch.optim.lr_schedulerimportCosineAnnealingLRimportalbumentationsasAfromalbumentations.pytorchimportToTensorV2importsegmentation_models_pytorchassmpfromtqdmimporttqdmimportnumpyasnpimportrasteriofrompathlibimportPathimportargparsefromdatetimeimportdatetime# ----------------------------# Dataset Class# ----------------------------classLandslideDataset(torch.utils.data.Dataset):def__init__(self,image_dir,mask_dir,transform=None):self.image_paths=sorted(Path(image_dir).glob("*.tif"))self.mask_paths=sorted(Path(mask_dir).glob("*.tif"))assertlen(self.image_paths)==len(self.mask_paths),"Image and mask counts mismatch!"self.transform=transformdef__len__(self):returnlen(self.image_paths)def__getitem__(self,idx):img_path=self.image_paths[idx]mask_path=self.mask_paths[idx]# 读取 GeoTIFF(仅取前3波段)withrasterio.open(img_path)assrc:image=src.read([1,2,3])# RGBimage=np.transpose(image,(1,2,0))# HWCwithrasterio.open(mask_path)assrc:mask=src.read(1)# 单通道# 确保 mask 是 0/1(有些可能是 255 表示滑坡)ifmask.max()>1:mask=(mask>0).astype(np.uint8)# 数据增强ifself.transform:augmented=self.transform(image=image,mask=mask)image=augmented['image']mask=augmented['mask']returnimage,mask.long()# mask 转为 LongTensor# ----------------------------# 训练函数# ----------------------------deftrain_one_epoch(model,dataloader,optimizer,criterion,device,epoch):model.train()total_loss=0.0pbar=tqdm(dataloader,desc=f"Epoch{epoch}")forimages,masksinpbar:images=images.to(device)masks=masks.to(device)optimizer.zero_grad()outputs=model(images)loss=criterion(outputs,masks)loss.backward()optimizer.step()total_loss+=loss.item()pbar.set_postfix(loss=loss.item())returntotal_loss/len(dataloader)# ----------------------------# 验证函数# ----------------------------defvalidate(model,dataloader,criterion,device):model.eval()total_loss=0.0total_iou=0.0count=0withtorch.no_grad():forimages,masksintqdm(dataloader,desc="Validation"):images=images.to(device)masks=masks.to(device)outputs=model(images)loss=criterion(outputs,masks)total_loss+=loss.item()# 计算 IoUpreds=torch.argmax(outputs,dim=1)intersection=((preds==1)&(masks==1)).sum((1,2))union=((preds==1)|(masks==1)).sum((1,2))iou=(intersection+1e-6)/(union+1e-6)total_iou+=iou.mean().item()count+=1avg_loss=total_loss/len(dataloader)avg_iou=total_iou/countprint(f"✅ Val Loss:{avg_loss:.4f}, mIoU:{avg_iou:.4f}")returnavg_loss,avg_iou# ----------------------------# 主函数# ----------------------------defmain(args):device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")print(f"Using device:{device}")# 数据增强(遥感专用)train_transform=A.Compose([A.RandomRotate90(p=0.5),A.HorizontalFlip(p=0.5),A.VerticalFlip(p=0.5),A.OneOf([A.MotionBlur(p=0.2),A.MedianBlur(blur_limit=3,p=0.1),A.Blur(blur_limit=3,p=0.1),],p=0.2),A.CLAHE(p=0.2),# 增强对比度(适合遥感)A.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]),# ImageNetToTensorV2(),])val_transform=A.Compose([A.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]),ToTensorV2(),])# 数据集train_dataset=LandslideDataset(image_dir=os.path.join(args.data_root,"train/images"),mask_dir=os.path.join(args.data_root,"train/masks"),transform=train_transform)val_dataset=LandslideDataset(image_dir=os.path.join(args.data_root,"val/images"),mask_dir=os.path.join(args.data_root,"val/masks"),transform=val_transform)train_loader=DataLoader(train_dataset,batch_size=args.batch_size,shuffle=True,num_workers=4)val_loader=DataLoader(val_dataset,batch_size=args.batch_size,shuffle=False,num_workers=4)# 模型(U-Net with ResNet34 encoder)model=smp.Unet(encoder_name="resnet34",encoder_weights="imagenet",in_channels=3,classes=2# 二分类:background + landslide).to(device)# 损失函数(结合 Dice + CrossEntropy)dice_loss=smp.losses.DiceLoss(mode="multiclass")ce_loss=nn.CrossEntropyLoss()defcriterion(y_pred,y_true):returndice_loss(y_pred,y_true)+ce_loss(y_pred,y_true)optimizer=AdamW(model.parameters(),lr=args.lr,weight_decay=1e-4)scheduler=CosineAnnealingLR(optimizer,T_max=args.epochs)best_iou=0.0save_dir=f"runs/landslide_{datetime.now().strftime('%Y%m%d_%H%M')}"os.makedirs(save_dir,exist_ok=True)# 训练循环forepochinrange(1,args.epochs+1):train_loss=train_one_epoch(model,train_loader,optimizer,criterion,device,epoch)val_loss,val_iou=validate(model,val_loader,criterion,device)scheduler.step()# 保存最佳模型ifval_iou>best_iou:best_iou=val_iou torch.save(model.state_dict(),os.path.join(save_dir,"best_model.pth"))print(f"🎉 New best mIoU:{best_iou:.4f}, saved!")# 日志withopen(os.path.join(save_dir,"log.txt"),"a")asf:f.write(f"Epoch{epoch}: Train Loss={train_loss:.4f}, Val Loss={val_loss:.4f}, mIoU={val_iou:.4f}\n")print(f"✅ Training finished! Best mIoU:{best_iou:.4f}")print(f"📁 Model saved to:{save_dir}")if__name__=="__main__":parser=argparse.ArgumentParser()parser.add_argument("--data_root",type=str,default="./LandslideDataset",help="Dataset root directory")parser.add_argument("--batch_size",type=int,default=8,help="Batch size (adjust based on GPU memory)")parser.add_argument("--epochs",type=int,default=50,help="Number of training epochs")parser.add_argument("--lr",type=float,default=1e-3,help="Learning rate")args=parser.parse_args()main(args)

✅ 五、运行命令示例

python train_landslide.py\--data_root./LandslideDataset\--batch_size8\--epochs50\--lr0.001

💡显存提示:1024×1024 图像较大,若 GPU 显存 < 16GB,建议:

  • 使用batch_size=42
  • 或在train_transform中加入A.Resize(512, 512)进行下采样训练(推理时再上采样)

✅ 六、模型选择建议

模型优点适用场景
U-Net (ResNet34)平衡精度与速度推荐默认选择
DeepLabV3+ (ResNet50)边界更精细高精度需求
FPN (EfficientNet-b3)多尺度融合强小滑坡检测

修改方式(在main()中):

model=smp.DeepLabV3Plus(encoder_name="resnet50",encoder_weights="imagenet",classes=2).to(device)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 17:32:33

记一份慈溪备婚攻略:主流婚宴场地特色横评

婚礼是人生的重要仪式&#xff0c;选对场地就成功了一半。针对慈溪及周边地区&#xff0c;结合2025年的市场口碑&#xff0c;我整理了这份更具参考价值的备婚清单&#xff0c;涵盖了从“异域风情”到“高端奢华”的多种选择。 一、 风格派&#xff1a;特色主题宴会厅 如果不想举…

作者头像 李华
网站建设 2026/4/19 13:13:52

推出‘AI绘画对比’系列内容引出多模态生成中语音的重要性

推出‘AI绘画对比’系列内容引出多模态生成中语音的重要性 在“AI绘画”能力已经趋于成熟的今天&#xff0c;图像生成的质量和风格控制已不再是技术瓶颈。用户上传一张草图、输入一段提示词&#xff0c;几秒内就能获得媲美专业画师的作品。然而&#xff0c;当我们将视线从静态画…

作者头像 李华
网站建设 2026/4/27 15:28:19

ChromeDriver下载地址汇总:自动化测试IndexTTS网页前端必备工具

ChromeDriver下载地址汇总&#xff1a;自动化测试IndexTTS网页前端必备工具 在AI内容创作飞速发展的今天&#xff0c;语音合成技术正经历一场从“能说”到“会演”的深刻变革。B站开源的 IndexTTS 2.0 就是这场变革中的代表作——它不仅能生成自然流畅的语音&#xff0c;还能像…

作者头像 李华