多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

智慧无人机海洋海岸线语义分割数据集 U-Net模型 代码 用于无人机图像海岸线二值分割

智慧无人机海洋海岸线语义分割数据集 U-Net模型 代码 用于无人机图像海岸线二值分割 数据集文字描述:智慧无人机海洋海岸线语义分割数据集用于无人机图像海岸线二值分割的数据集。数量230张图像类别数量2类别类型海岸线、其他用途目标检测、分类分割、多模态111 数据集总体信息表[仅为参考]项目内容数据集名称无人机海岸线语义分割数据集Drone-based Coastline Semantic Segmentation Dataset图像数量230 张图像来源无人机航拍图像UAV imagery分辨率多为 1920×1080 或 4000×3000高清航拍标注类型语义分割Semantic Segmentation任务类型二值分割Binary Segmentation类别数量2 类类别名称海岸线Coastline、其他Background / Other掩膜格式与原图同名的黑白或单通道标签图像0: 背景255: 海岸线数据划分未明确说明需自行按比例划分如 8:2提供内容原始图像 对应分割掩膜mask部分含视频转图脚本️ 类别定义表ID英文名称中文名称说明0Other其他 / 背景包括海水、陆地非海岸区域、植被、建筑等1Coastline海岸线海陆交界带用于提取边界进行地理分析✅ 掩膜为二值图像灰度图像素值 0 表示背景255 表示海岸线区域。 配套代码说明代码功能文件名示例功能描述视频转图像video_to_frames.py将无人机拍摄的视频自动抽帧生成.jpg图像序列便于构建数据集U-Net 模型代码unet_model.py实现带有批量归一化Batch Normalization的 U-Net 网络结构适用于二值分割任务数据预处理dataset.py加载图像和掩膜、归一化、数据增强可选训练脚本train.py使用 Dice Loss 或 Binary Cross-Entropy 训练模型推理与可视化predict.py对新图像进行预测并输出分割结果图 博主推荐目录结构coastline_segmentation/ ├── images/# 原始无人机图像│ └── *.jpg ├── masks/# 分割标签掩膜│ └── *.png(单通道)├── models/ │ └── unet_model.py# 含 BatchNorm 的 U-Net 结构├── scripts/ │ ├── video_to_frames.py# 视频抽帧工具│ └── preprocess.py# 图像预处理├── train.py# 训练主程序├── predict.py# 预测脚本└── data.yaml# 可选配置文件️ 技术用途应用方向说明目标检测❌ 不适用非目标框检测图像分类⚠️ 可用于场景分类是否包含海岸线语义分割✅ 主要用途精确提取海岸线轮廓多模态融合⚠️ 可结合红外、SAR 等遥感数据做跨模态分割研究地理信息系统GIS✅ 输出矢量化的海岸线用于地图更新环境监测✅ 监测海岸侵蚀、海平面上升等变化 注该数据集主要用于海岸线提取与动态监测在智慧海洋、防灾减灾中有重要价值。 模型性能建议指标指标说明IoU (Intersection over Union)衡量分割重合度越高越好Dice Coefficient类似 IoU常用于医学/遥感分割Pixel Accuracy像素级分类准确率F1-Score综合 precision 和 recall使用 PyTorch 框架编写包含模型定义、数据加载、训练与推理全流程。✅ 一、U-Net 模型实现unet_model.py# unet_model.pyimporttorchimporttorch.nnasnnclassDoubleConv(nn.Module):(卷积 BN ReLU) * 2def__init__(self,in_channels,out_channels):super(DoubleConv,self).__init__()self.double_convnn.Sequential(nn.Conv2d(in_channels,out_channels,kernel_size3,padding1),nn.BatchNorm2d(out_channels),nn.ReLU(inplaceTrue),nn.Conv2d(out_channels,out_channels,kernel_size3,padding1),nn.BatchNorm2d(out_channels),nn.ReLU(inplaceTrue))defforward(self,x):returnself.double_conv(x)classDown(nn.Module):下采样块MaxPool 双重卷积def__init__(self,in_channels,out_channels):super(Down,self).__init__()self.maxpool_convnn.Sequential(nn.MaxPool2d(2),DoubleConv(in_channels,out_channels))defforward(self,x):returnself.maxpool_conv(x)classUp(nn.Module):上采样块上采样 双重卷积含跳跃连接def__init__(self,in_channels,out_channels):super(Up,self).__init__()self.upnn.Upsample(scale_factor2,modebilinear,align_cornersTrue)self.convDoubleConv(in_channels,out_channels)defforward(self,x1,x2):x1self.up(x1)# 裁剪并拼接跳跃连接diffYx2.size()[2]-x1.size()[2]diffXx2.size()[3]-x1.size()[3]x1nn.functional.pad(x1,[diffX//2,diffX-diffX//2,diffY//2,diffY-diffY//2])xtorch.cat([x2,x1],dim1)returnself.conv(x)classOutConv(nn.Module):输出层1x1 卷积映射到类别数def__init__(self,in_channels,out_channels):super(OutConv,self).__init__()self.convnn.Conv2d(in_channels,out_channels,kernel_size1)defforward(self,x):returntorch.sigmoid(x)# 二值分割使用 SigmoidclassUNet(nn.Module): 带 BatchNorm 的 U-Net 网络结构 输入(B, 3, H, W) 输出(B, 1, H, W) # 二值分割图 def__init__(self,n_channels3,n_classes1):super(UNet,self).__init__()self.n_channelsn_channels self.n_classesn_classes self.incDoubleConv(n_channels,64)self.down1Down(64,128)self.down2Down(128,256)self.down3Down(256,512)self.down4Down(512,1024//2)# 减少参数以适应小数据集self.up1Up(1024,512//2)self.up2Up(512,256//2)self.up3Up(256,128//2)self.up4Up(128,64)self.outcOutConv(64,n_classes)defforward(self,x):x1self.inc(x)x2self.down1(x1)x3self.down2(x2)x4self.down3(x3)x5self.down4(x4)xself.up1(x5,x4)xself.up2(x4,x3)# 注意这里应是 x3修复拼写错误xself.up3(x3,x2)xself.up4(x2,x1)logitsself.outc(x)returnlogitsif__name____main__:# 测试模型前向传播modelUNet(n_channels3,n_classes1)input_tensortorch.randn(1,3,256,256)outputmodel(input_tensor)print(f输入形状:{input_tensor.shape})print(f输出形状:{output.shape})# 应为 (1, 1, 256, 256) 二、数据集加载器dataset.py# dataset.pyfromtorch.utils.dataimportDatasetfromPILimportImageimportosimporttorchvision.transformsastransformsclassCoastlineDataset(Dataset):def__init__(self,image_dir,mask_dir,transformNone):self.image_dirimage_dir self.mask_dirmask_dir self.transformtransform self.imagesos.listdir(image_dir)def__len__(self):returnlen(self.images)def__getitem__(self,idx):img_nameself.images[idx]img_pathos.path.join(self.image_dir,img_name)mask_pathos.path.join(self.mask_dir,img_name.replace(.jpg,.png))imageImage.open(img_path).convert(RGB)maskImage.open(mask_path).convert(L)# 灰度图# 归一化0~255 → 0~1并转为单通道mask(torchvision.transforms.ToTensor()(mask)0.5).float()ifself.transform:imageself.transform(image)returnimage,mask# 预处理变换transformtransforms.Compose([transforms.Resize((256,256)),transforms.ToTensor(),transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225])# ImageNet 标准化]) 三、训练脚本train.py# train.pyimporttorchimporttorch.optimasoptimfromtorch.utils.dataimportDataLoaderfromunet_modelimportUNetfromdatasetimportCoastlineDataset,transformimporttorch.nnasnnimportos# # 参数设置# DEVICEcudaiftorch.cuda.is_available()elsecpuEPOCHS100LR1e-4BATCH_SIZE4IMG_HEIGHT,IMG_WIDTH256,256IMAGE_DIRdata/imagesMASK_DIRdata/masksMODEL_SAVE_PATHsaved_models/unet_coastline.pthos.makedirs(saved_models,exist_okTrue)# # 数据加载# datasetCoastlineDataset(IMAGE_DIR,MASK_DIR,transformtransform)train_sizeint(0.8*len(dataset))val_sizelen(dataset)-train_size train_dataset,val_datasettorch.utils.data.random_split(dataset,[train_size,val_size])train_loaderDataLoader(train_dataset,batch_sizeBATCH_SIZE,shuffleTrue)val_loaderDataLoader(val_dataset,batch_sizeBATCH_SIZE,shuffleFalse)# # 模型初始化# modelUNet(n_channels3,n_classes1).to(DEVICE)optimizeroptim.Adam(model.parameters(),lrLR)criterionnn.BCELoss()# 二值交叉熵损失scheduleroptim.lr_scheduler.ReduceLROnPlateau(optimizer,patience5,verboseTrue)# # 训练循环# best_lossfloat(inf)forepochinrange(EPOCHS):model.train()train_loss0.0forimages,masksintrain_loader:imagesimages.to(DEVICE)masksmasks.to(DEVICE)optimizer.zero_grad()outputsmodel(images)losscriterion(outputs,masks)loss.backward()optimizer.step()train_lossloss.item()# 验证阶段model.eval()val_loss0.0withtorch.no_grad():forimages,masksinval_loader:imagesimages.to(DEVICE)masksmasks.to(DEVICE)outputsmodel(images)losscriterion(outputs,masks)val_lossloss.item()train_loss/len(train_loader)val_loss/len(val_loader)scheduler.step(val_loss)print(fEpoch [{epoch1}/{EPOCHS}], Train Loss:{train_loss:.4f}, Val Loss:{val_loss:.4f})# 保存最佳模型ifval_lossbest_loss:best_lossval_loss torch.save(model.state_dict(),MODEL_SAVE_PATH)print(f✅ 模型已保存至{MODEL_SAVE_PATH})print( 训练完成) 四、推理与可视化predict.py# predict.pyimporttorchfromPILimportImageimportnumpyasnpimportmatplotlib.pyplotaspltfromunet_modelimportUNetfromtorchvisionimporttransforms# # 推理设置# DEVICEcudaiftorch.cuda.is_available()elsecpuMODEL_PATHsaved_models/unet_coastline.pthIMAGE_PATHtest_images/coastline_001.jpgOUTPUT_PATHpredictions/pred_mask.png# 加载模型modelUNet(n_channels3,n_classes1)model.load_state_dict(torch.load(MODEL_PATH,map_locationDEVICE))model.to(DEVICE)model.eval()# 图像预处理input_imageImage.open(IMAGE_PATH).convert(RGB)transformtransforms.Compose([transforms.Resize((256,256)),transforms.ToTensor(),transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225])])image_tensortransform(input_image).unsqueeze(0).to(DEVICE)# 推理withtorch.no_grad():outputmodel(image_tensor)pred_mask(output.cpu().numpy()[0,0]0.5).astype(np.uint8)*255# 二值化# 保存结果os.makedirs(predictions,exist_okTrue)Image.fromarray(pred_mask,modeL).save(OUTPUT_PATH)# 可视化plt.figure(figsize(12,6))plt.subplot(1,2,1)plt.imshow(input_image)plt.title(原始图像)plt.axis(off)plt.subplot(1,2,2)plt.imshow(pred_mask,cmapgray)plt.title(预测海岸线)plt.axis(off)plt.tight_layout()plt.show()️ 五、视频转图像脚本video_to_frames.py# video_to_frames.pyimportcv2importosdefextract_frames(video_path,output_dir,interval30): 从视频中抽帧 :param video_path: 视频路径 :param output_dir: 输出图像目录 :param interval: 每隔多少帧抽取一帧 capcv2.VideoCapture(video_path)count0saved0os.makedirs(output_dir,exist_okTrue)whileTrue:ret,framecap.read()ifnotret:breakifcount%interval0:cv2.imwrite(os.path.join(output_dir,fframe_{saved:04d}.jpg),frame)saved1count1cap.release()print(f✅ 已从视频中提取{saved}张图像至{output_dir})# 示例调用if__name____main__:extract_frames(videos/drone_coastline.mp4,data/images,interval15) 六、项目结构总结coastline_segmentation/ ├── data/ │ ├── images/ # 原始图像 │ └── masks/ # 分割标签黑白掩膜 ├── models/ │ └── unet_model.py # 含 BN 的 U-Net ├── dataset.py # 数据加载 ├── train.py # 训练主程序 ├── predict.py # 推理与可视化 ├── video_to_frames.py # 视频抽帧 └── saved_models/ # 自动创建存放权重✅ 特性说明功能支持情况批量归一化BN✅ 在每个卷积后添加二值分割✅ 使用 Sigmoid BCELoss跳跃连接✅ 实现精确定位GPU 加速✅ 自动检测 CUDA小样本适配✅ 结构轻量化防止过拟合易于扩展✅ 可替换为 ResUNet、Attention UNet
返回列表