无人机河道航拍语义分割数据集 | 水利巡检、水体识别、洪涝监测、水资源AI分析数据集10330期

摘要:一套面向无人机航拍河道场景的水体语义分割开源数据集,适配主流深度学习语义分割框架,可直接用于水体区域提取、常态化河道巡检、洪涝灾害范围评估、水资源动态监测等水利AI业务,标注规范、开箱即用,适配算法原型开发、模型迭代与工程落地。

标签:#无人机河道巡检 #水体语义分割 #水利AI #洪涝灾害监测 #水资源智能分析 #航拍图像分割 #深度学习数据集 #环境监测CV #河流区域识别


在这里插入图片描述

传统河道、流域、水资源监测长期依靠人工徒步、船只巡航完成巡查与水体范围统计,河道跨度大、沿岸地形复杂,部分浅滩、急流、偏远水域人员与船只难以抵达,巡检覆盖不全、作业风险高、人力与时间成本居高不下。在汛期洪涝灾害场景中,人工排查受淹区域速度慢、范围统计误差大,无法为应急指挥提供实时、精准的可视化数据支撑;同时,传统监测手段难以实现全天候、高频次流域动态追踪,无法满足现代化智慧水利、河湖长制的数字化管理需求。

如今无人机航拍+语义分割已成为水利行业智能化升级的主流路线,依靠AI自动分割水体区域,可快速划定河流、湖泊、积水、受淹区域边界。但目前行业普遍存在专业水体分割标注数据稀缺、通用分割数据集与河道航拍场景不匹配、标注格式混乱、复杂水面场景样本不足等问题,大幅抬高了水利AI算法落地门槛。

本次分享的河道航拍语义分割数据集,聚焦真实野外河道、自然水域场景,专门针对水体区域做精细化像素级标注,格式兼容主流语义分割框架,数据场景丰富,能够有效解决水利视觉算法研发过程中数据短缺、场景适配差的痛点。


在这里插入图片描述

二、数据集整体详情

2.1 核心基础信息

本数据集为纯语义分割任务专用标注数据集,区别于图像分类、目标检测数据集,以像素级水体区域分割为核心标注目标,所有数据均来源于无人机实地航拍,贴合真实水利巡检作业画面。

  1. 标注目标:单类别语义分割,仅区分水体区域与背景区域,标注聚焦水域边界、水面范围,精准适配河道识别、积水提取、洪区划定等核心业务。
  2. 数据规模:总计644张高清航拍标注图像,数据体量适中,兼顾模型训练效率与泛化能力,非常适合语义分割算法入门验证、中小型模型训练、企业原型项目开发、高校水利AI实训。
  3. 场景覆盖:样本涵盖不同光照、不同岸线形态、不同水流状态的河道场景,有效降低单一环境数据造成的模型过拟合问题,提升模型在野外复杂水域的鲁棒性。
  4. 数据格式:采用计算机视觉语义分割任务通用标准格式,图像与掩码标签一一对应,兼容U-Net、PSPNet、SegFormer、YOLO-Seg等主流深度学习框架,无需复杂格式转换,下载后可直接加载训练。
    在这里插入图片描述

2.2 核心落地应用价值

  1. 算法研发支撑:为水体语义分割模型提供标准化训练、验证数据,助力开发者调试网络结构、优化损失函数、对比不同分割算法性能。
  2. 常态化水资源监测:结合无人机航拍,自动分割、统计流域水体面积,实现水资源分布常态化盘点与动态追踪,替代人工丈量统计。
  3. 洪涝灾害应急处置:汛期快速分割识别积水、淹没区域范围,输出精准水域边界数据,辅助灾情评估、人员转移、抢险路线规划。
  4. 生态环境监测:应用于河湖生态管护、水域岸线监管、黑臭水体范围圈定等场景,推动计算机视觉技术在水利、环保垂直领域规模化落地。
    在这里插入图片描述

2.3 数据集核心优势

  • 场景垂直化:原生无人机河道航拍数据,水面反光、岸线遮挡、远景水域等真实干扰场景全覆盖,远优于通用户外分割数据集;
  • 标注轻量化:单类别分割任务,学习门槛低、训练收敛速度快,新手可快速上手;
  • 算力友好:644张图像体量小,普通家用GPU、边缘算力设备即可完成全流程训练与推理,无需高性能集群;
  • 全框架兼容:标准掩码标注格式,适配PyTorch、TensorFlow两大主流生态,适配绝大多数开源语义分割项目。

三、深度学习实战代码(附河道场景专属注释)

基于水利行业语义分割常用框架 U-NetUltralytics YOLO-Seg 编写全套代码,包含环境部署、数据集加载、模型训练、图像推理、结果可视化全流程,所有代码结合河道航拍、水面分割场景做针对性注释与参数调优。

3.1 运行环境依赖安装

适配 Python 3.8 ~ 3.11,支持 Windows / Linux 系统,CUDA 10.2 及以上版本均可运行。

# 安装语义分割核心依赖库
pip install torch torchvision  # 深度学习基础框架
pip install segmentation-models-pytorch==0.3.3  # 快速调用U-Net等经典分割模型
pip install opencv-python pillow numpy  # 图像处理、矩阵运算
pip install albumentations  # 图像增强,适配水面反光、光照变化场景
pip install tqdm  # 训练进度可视化

3.2 数据集标准目录结构(通用语义分割格式)

遵循行业通用目录规范,图像与掩码标签文件名一一对应,解压后直接使用,无需重构路径:

water_segment_dataset/
├── images/                # 无人机航拍原图(总计644张)
│   ├── train/             # 训练集图像
│   ├── val/               # 验证集图像
│   └── test/              # 测试集图像
├── masks/                 # 语义分割掩码标签(单通道PNG,像素值代表类别)
│   ├── train/
│   ├── val/
│   └── test/
└── water_config.yaml      # 数据集配置文件(类别、路径、超参数)

3.3 数据集配置文件 water_config.yaml

针对水体单类别分割场景编写配置文件,适配YOLO-Seg系列框架:

# 无人机河道水体语义分割 - 数据集配置文件
# 数据集根路径(根据本地实际存放路径修改)
path: ./water_segment_dataset
# 训练、验证、测试集图像路径
train: images/train
val: images/val
test: images/test

# 分割类别数量:2类(背景、水体)
nc: 2
# 类别名称映射
names:
  0: 背景
  1: 水体

# 河道航拍专属数据增强(针对水面反光、逆光、画面翻转优化)
fliplr: 0.5    # 左右翻转,提升模型对不同走向河道的适应性
hsv_h: 0.015   # 色相微调,适配早晚光照变化
hsv_s: 0.7     # 饱和度微调,削弱水面反光干扰

3.4 自定义数据集加载脚本 water_dataset.py

基于PyTorch Dataset 封装数据集类,适配U-Net训练,适配航拍图像与掩码读取逻辑:

"""
河道水体分割 - 自定义数据集加载类
适配场景:无人机航拍河道图像、像素级水体掩码标签
适配框架:PyTorch + segmentation-models-pytorch
"""
import os
import numpy as np
from PIL import Image
from torch.utils.data import Dataset
import albumentations as A
from albumentations.pytorch import ToTensorV2

class WaterSegmentDataset(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([f for f in os.listdir(image_dir) if f.endswith(('.jpg', '.png'))])

    def __len__(self):
        # 返回数据集总样本数
        return len(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(".jpg", ".png"))

        # 读取航拍图像与分割掩码
        image = np.array(Image.open(img_path).convert("RGB"))
        mask = np.array(Image.open(mask_path), dtype=np.float32)

        # 掩码二值化:1=水体,0=背景(适配单类别水体分割)
        mask[mask > 0] = 1.0

        # 执行数据增强(针对水面反光、光照干扰做增强)
        if self.transform:
            aug = self.transform(image=image, mask=mask)
            image = aug["image"]
            mask = aug["mask"]

        return image, mask

# 定义训练集数据增强策略(河道场景专属)
def get_train_aug():
    return A.Compose([
        A.Resize(640, 640),  # 统一图像尺寸,适配航拍宽画幅
        A.HorizontalFlip(p=0.5),  # 随机左右翻转
        A.RandomBrightnessContrast(p=0.3),  # 明暗、对比度调整,削弱水面反光
        A.Normalize(),
        ToTensorV2()
    ])

# 定义验证集数据增强(仅归一化,不做随机变换)
def get_val_aug():
    return A.Compose([
        A.Resize(640, 640),
        A.Normalize(),
        ToTensorV2()
    ])

3.5 U-Net 模型训练脚本 train_unet_water.py

选用水利分割场景常用的U-Net模型,结合644张样本特性与河道航拍场景调优超参,防止小数据集过拟合:

"""
无人机河道水体分割 - U-Net训练脚本
数据集规模:644张航拍图像
适配场景:水面反光、岸线遮挡、野外河道全域水体分割
核心优化:小数据集防过拟合、水面特征强化
"""
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
import segmentation_models_pytorch as smp
from tqdm import tqdm
from water_dataset import WaterSegmentDataset, get_train_aug, get_val_aug

# ===================== 全局配置(河道场景专属参数)=====================
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 数据集路径
TRAIN_IMG = "./water_segment_dataset/images/train"
TRAIN_MASK = "./water_segment_dataset/masks/train"
VAL_IMG = "./water_segment_dataset/images/val"
VAL_MASK = "./water_segment_dataset/masks/val"
# 训练超参(644张小数据集,降低batch、减少轮次防过拟合)
BATCH_SIZE = 8
EPOCHS = 50
LEARNING_RATE = 1e-4
# =====================================================================

def train():
    # 1. 加载训练集、验证集
    train_dataset = WaterSegmentDataset(TRAIN_IMG, TRAIN_MASK, transform=get_train_aug())
    val_dataset = WaterSegmentDataset(VAL_IMG, VAL_MASK, transform=get_val_aug())

    train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=2)
    val_loader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=2)

    # 2. 初始化U-Net模型,骨干网络选用efficientnet-b0(轻量化,适配边缘部署)
    model = smp.Unet(
        encoder_name="efficientnet-b0",
        encoder_weights="imagenet",  # 使用预训练权重,小数据集加速收敛
        in_channels=3,
        classes=1,  # 输出单通道掩码,二分类分割
        activation="sigmoid"
    ).to(DEVICE)

    # 3. 损失函数 + 优化器(水体分割二分类任务首选BCE损失)
    loss_fn = nn.BCELoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=LEARNING_RATE)

    # 4. 开始迭代训练
    for epoch in range(EPOCHS):
        # 训练阶段
        model.train()
        train_loss = 0.0
        pbar = tqdm(train_loader, desc=f"Epoch {epoch+1}/{EPOCHS} Train")
        for imgs, masks in pbar:
            imgs, masks = imgs.to(DEVICE), masks.to(DEVICE)
            optimizer.zero_grad()
            outputs = model(imgs)
            loss = loss_fn(outputs, masks.unsqueeze(1))
            loss.backward()
            optimizer.step()
            train_loss += loss.item()
            pbar.set_postfix({"loss": loss.item()})

        # 验证阶段
        model.eval()
        val_loss = 0.0
        with torch.no_grad():
            pbar_val = tqdm(val_loader, desc=f"Epoch {epoch+1}/{EPOCHS} Val")
            for imgs, masks in pbar_val:
                imgs, masks = imgs.to(DEVICE), masks.to(DEVICE)
                outputs = model(imgs)
                loss = loss_fn(outputs, masks.unsqueeze(1))
                val_loss += loss.item()

        # 打印每轮平均损失
        avg_train_loss = train_loss / len(train_loader)
        avg_val_loss = val_loss / len(val_loader)
        print(f"平均训练损失: {avg_train_loss:.4f} | 平均验证损失: {avg_val_loss:.4f}")

    # 保存训练完成的模型权重
    torch.save(model.state_dict(), "./water_unet_best.pth")
    print("模型训练完成,权重已保存为 water_unet_best.pth")

if __name__ == "__main__":
    train()

3.6 图像推理与可视化脚本 predict_water.py

加载训练好的模型,对无人机航拍图像做水体分割推理,输出水体掩码与叠加效果图,适配巡检业务可视化需求:

"""
河道水体分割推理脚本
功能:单张/批量航拍图像水体提取、分割结果可视化
落地场景:无人机实时巡检画面分析、洪涝区域离线统计
"""
import torch
import cv2
import numpy as np
import os
import segmentation_models_pytorch as smb
from PIL import Image

# 全局配置
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
MODEL_PATH = "./water_unet_best.pth"  # 训练好的权重路径
TEST_IMG_DIR = "./water_segment_dataset/images/test"  # 测试图像目录
SAVE_RESULT_DIR = "./segment_result"  # 结果保存目录
os.makedirs(SAVE_RESULT_DIR, exist_ok=True)

# 加载模型
model = smb.Unet(
    encoder_name="efficientnet-b0",
    encoder_weights=None,
    in_channels=3,
    classes=1,
    activation="sigmoid"
).to(DEVICE)
model.load_state_dict(torch.load(MODEL_PATH, map_location=DEVICE))
model.eval()

def predict_single_image(img_path):
    # 读取航拍图像
    image = cv2.imread(img_path)
    h, w = image.shape[:2]
    # 图像预处理
    img_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    img_resize = cv2.resize(img_rgb, (640, 640))
    img_tensor = torch.from_numpy(img_resize).permute(2, 0, 1).float() / 255.0
    img_tensor = img_tensor.unsqueeze(0).to(DEVICE)

    # 模型推理(阈值0.5区分水体与背景,适配水面模糊边界)
    with torch.no_grad():
        output = model(img_tensor)
        pred_mask = (output > 0.5).float().squeeze().cpu().numpy()

    # 掩码还原原图尺寸
    pred_mask = cv2.resize(pred_mask, (w, h))
    # 生成蓝色掩码图层,叠加到原图(直观展示水体区域)
    mask_color = np.zeros_like(image)
    mask_color[pred_mask == 1] = [255, 0, 0]  # 蓝色标注水体
    # 原图+掩码融合
    result = cv2.addWeighted(image, 0.7, mask_color, 0.3, 0)
    return result

# 批量处理测试图像
if __name__ == "__main__":
    for img_name in os.listdir(TEST_IMG_DIR):
        if img_name.endswith((".jpg", ".png")):
            img_full_path = os.path.join(TEST_IMG_DIR, img_name)
            seg_result = predict_single_image(img_full_path)
            save_path = os.path.join(SAVE_RESULT_DIR, img_name)
            cv2.imwrite(save_path, seg_result)
    print(f"批量水体分割完成,结果已保存至 {SAVE_RESULT_DIR}")

四、数据集使用策略 & 场景化深度思考

4.1 数据划分建议

数据集共644张航拍图像,结合语义分割任务特性与小样本训练规则,推荐划分比例:

  • 训练集:70%(451张),用于模型主体训练;
  • 验证集:15%(97张),用于训练过程中监控精度、防止过拟合;
  • 测试集:15%(96张),用于模型最终效果评估与业务仿真测试。
    划分时保证不同光照、不同河道形态样本均匀分布,避免局部场景数据集中。

4.2 河道航拍分割场景调优经验

  1. 应对水面反光干扰:水面强反光是河道分割最大难点,训练阶段开启亮度、对比度随机变换,推理时可搭配图像滤波预处理,能明显提升边界分割精度。
  2. 小样本防过拟合:本数据集仅644张图像,训练时建议选用轻量化骨干网络、降低BatchSize、配合早停机制,不要使用过深的网络结构。
  3. 边缘部署适配:U-Net轻量化版本推理速度快,训练后的模型可直接部署在无人机机载端、水利边缘网关,实现航拍+实时分割端到端巡检。
  4. 边界优化:河道水岸交界区域像素模糊,可在后处理中使用形态学运算优化分割边缘,提升水域面积统计精度。

4.3 技术拓展方向

  1. 多任务融合:在水体分割基础上叠加目标检测,同时实现水域分割+河道漂浮物、违建船只识别,打造一体化智能巡检系统。
  2. 时序分析:结合多时段航拍时序图像,分析水体面积变化,实现流域水位、水量动态监测。
  3. 跨场景迁移:基于本数据集做预训练,再用本地流域数据微调,快速适配不同地域河道、湖泊、水库场景。

五、总结

本套无人机河道航拍水体语义分割数据集,聚焦水利行业刚需场景,644张标注样本场景丰富、标注规范、格式通用,完美适配语义分割算法训练与水利AI工程落地。配套U-Net全流程代码覆盖数据加载、训练、推理、可视化,从算法研发到业务部署形成完整链路。

该数据集既适合AI学习者入门语义分割任务,也可作为水利、环保企业智慧巡检、洪涝监测项目的基础数据底座,能够大幅降低水利计算机视觉项目的研发成本与周期。


附加标签:#U-Net实战 #语义分割开源 #智慧水利 #航拍图像AI分析 #洪涝区域识别

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐