乐于分享
好东西不私藏

GeoAI标签制作指南

GeoAI标签制作指南

本文档深入总结 GeoAI 项目中**标签(Label/Annotation/Mask)**的制作方法、所需标签类型及主要处理流程。

GeoAI 需要哪几种标签

根据项目代码与示例分析,GeoAI 主要支持以下几类标签,分别对应不同的深度学习任务:

语义分割标签(Semantic Segmentation Masks)

图:遥感影像语义分割示例。

  • • 定义:每个像素被赋予一个类别 ID(如 0=背景, 1=建筑, 2=水体),形成单波段栅格图像。
  • • 存储格式:GeoTIFF (.tif)、PNG (.png)。
  • • 适用任务:地物分类、土地利用/覆盖分类、水体提取、建筑提取等。
  • • 关键要求
    • • 像素值为整数类别 ID,从 0 开始。
    • • 背景通常用 0 表示。
    • • 可通过 num_classes 参数指定总类别数。

实例分割标签(Instance Segmentation Masks)

遥感实例分割示例

图:遥感实例分割示例。

  • • 定义:每个独立对象(如单栋建筑、单辆车)拥有唯一的像素 ID,形成单波段栅格。
  • • 存储格式:GeoTIFF (.tif)。
  • • 适用任务:建筑轮廓提取、车辆检测、舰船检测等需要区分个体对象的场景。
  • • 关键要求
    • • 每个实例对象拥有唯一的正整数值。
    • • 背景为 0。
    • • 代码中通过 measure.label() 或预分配 ID 生成连通区域。

目标检测标签(Object Detection Annotations)

YOLO 遥感目标检测示例

图:遥感目标检测示例。

  • • 定义:以边界框(Bounding Box)或 COCO/YOLO 格式标注对象位置与类别。
  • • 存储格式
    • • COCO 格式:JSON 文件,包含 imagesannotationscategories 字段。
    • • YOLO 格式:每张图像对应一个 .txt 文件,每行记录 class_id x_center y_center width height(归一化坐标)。
    • • NWPU-VHR-10 格式:文本文件,每行 (x1,y1),(x2,y2),class_id
  • • 适用任务:多类目标检测(如飞机、舰船、储罐、车辆等)。

矢量标注(Vector Annotations)

  • • 定义:以矢量几何(Polygon/多边形)形式标注地物边界,通常附带属性字段(如 class)。
  • • 存储格式:GeoJSON (.geojson)、Shapefile (.shp)、GeoPackage (.gpkg)。
  • • 适用任务:作为训练数据制作的原始输入,通过栅格化(Rasterize)转换为语义/实例分割掩膜。
  • • 关键属性
    • • class 或 class_value_field:指定类别值字段。
    • • 支持通过 attribute_field 将属性值烧录到栅格像素中。

标签制作的主要流程

GeoAI 提供了从原始数据到训练标签的完整流水线,核心流程如下:

流程概览

详细步骤说明

数据准备与预处理

核心代码位置

  • • geoai/utils/raster.py — 栅格读取、裁剪、重投影
  • • geoai/utils/vector.py — 矢量读取、属性分析、几何处理

主要操作

  1. 1. 读取影像:使用 rasterio / rioxarray 读取 GeoTIFF,获取 CRS、分辨率、边界等信息。
  2. 2. 读取矢量标注:使用 geopandas 读取 GeoJSON/Shapefile,检查 class 等属性字段。
  3. 3. 坐标系统一:确保影像与矢量标注具有相同的 CRS,否则使用 gdf.to_crs(src.crs) 重投影。
  4. 4. 空间过滤:对于大型矢量文件,可根据影像边界进行空间过滤,提升处理效率。

示例代码

import geoai# 读取矢量并检查属性gdf = geoai.read_vector("annotations.geojson")print(gdf.columns)  # 确认包含 'class' 字段

标签生成(栅格化与切分)

核心代码位置

  • • geoai/utils/training.py — export_geotiff_tiles_batch()vector_to_raster()
  • • geoai/utils/raster.py — vector_to_raster()raster_to_vector()

矢量转栅格(Vector to Raster)

将矢量多边形转换为与影像对齐的单波段栅格掩膜:

import geoai# 将 GeoJSON 标注转为 GeoTIFF 掩膜geoai.vector_to_raster(    vector_path="buildings.geojson",    output_path="buildings_mask.tif",    reference_raster="image.tif",  # 以影像为参考,确保对齐    attribute_field="class",       # 使用 class 字段作为像素值    all_touched=True,              # 接触多边形的所有像素都标记    fill_value=0,                  # 背景值    dtype="uint8",)

关键参数说明

参数
说明
reference_raster
参考影像,用于确定输出栅格的尺寸、分辨率、CRS 和仿射变换
attribute_field
矢量属性表中用于像素值的字段名(如 class
all_touchedTrue
 时,所有接触多边形的像素都被烧录;False 时仅中心点在内部的像素
fill_value
背景填充值,通常为 0

影像与标签切分(Tiling)

将大影像和对应掩膜切分为固定尺寸的小瓦片,用于深度学习训练:

import geoai# 批量导出训练瓦片stats = geoai.export_geotiff_tiles_batch(    images_folder="data/images",    masks_file="data/annotations.geojson",  # 或 masks_folder="data/masks"    output_folder="output/training_tiles",    tile_size=256,                # 瓦片尺寸(像素)    stride=256,                   # 步长(stride < tile_size 时产生重叠)    class_value_field="class",    # 矢量中类别字段    skip_empty_tiles=True,        # 跳过无标注的瓦片    all_touched=True,             # 栅格化参数    buffer_radius=0.5,            # 对矢量添加缓冲(米))print(f"生成瓦片总数: {stats['total_tiles']}")print(f"含标注瓦片数: {stats['tiles_with_features']}")

输出目录结构

output/training_tiles/├── images/│   ├── tile_000_000.tif│   ├── tile_000_001.tif│   └── ...└── masks/    ├── tile_000_000.tif    ├── tile_000_001.tif    └── ...

三种掩膜输入模式

模式
参数设置
适用场景
单矢量文件覆盖所有影像
masks_file="path/to/all.geojson"
大型统一标注文件
多矢量文件按文件名匹配
masks_folder="...", match_by_name=True
影像与标注成对出现且文件名一致
多矢量文件按排序匹配
masks_folder="...", match_by_name=False
影像与标注按字母顺序一一对应

标签格式转换与增强

核心代码位置

  • • geoai/utils/training.py — get_default_augmentation_transforms()flipnslide_augmentation()
  • • geoai/segmentation.py — _normalize_mask()CustomDataset
  • • geoai/train.py — 数据集解析与格式转换

语义分割标签归一化

语义分割掩膜需保证像素值为 [0, num_classes-1] 的整数:

# 内部函数 _normalize_mask 的逻辑# 二分类:非零值全部映射为 1# 多分类:像素值裁剪到 [0, num_classes-1]

数据增强

GeoAI 内置了针对遥感影像的数据增强策略:

import geoai# 默认增强组合(使用 albumentations)transform = geoai.get_default_augmentation_transforms(    tile_size=256,    include_normalize=True,  # 包含 ImageNet 归一化)# 应用增强augmented = transform(image=image, mask=mask)aug_image = augmented['image']aug_mask = augmented['mask']

默认增强包括

  • • 几何变换:水平翻转、垂直翻转、随机旋转 90°、ShiftScaleRotate
  • • 光度变换:随机亮度对比度、色相饱和度调整、高斯噪声、高斯模糊

3.3 Flip-n-Slide 增强(高级)

一种专为遥感影像设计的重叠瓦片增强策略,生成带旋转/翻转的重叠瓦片:

# 生成重叠瓦片并自动应用 8 种增强变体tiles, aug_indices = geoai.flipnslide_augmentation(    image, tile_size=256, output_format="numpy")

3.4 目标检测格式转换

  • • NWPU → COCOgeoai/object_detect.py 提供 _convert_nwpu_to_coco()
  • • COCO 解析geoai/train.py 提供 parse_coco_annotations()
  • • YOLO 解析geoai/train.py 提供 parse_yolo_annotations()

训练数据加载

核心代码位置

  • • geoai/utils/sampling.py — TorchGeo 数据集与采样器
  • • geoai/train.py — PyTorch Dataset / DataLoader

TorchGeo 语义分割数据加载

from geoai.utils.sampling import create_torchgeo_segmentation_dataloadersloaders = create_torchgeo_segmentation_dataloaders(    image_path="data/images",    mask_path="data/masks",    chip_size=256,    batch_size=4,    train_length=128,   # 每轮随机采样数    val_length=32,)train_loader = loaders["train"]val_loader = loaders["val"]grid_loader = loaders["grid"]  # 用于完整推理的网格采样

实例分割 / 目标检测数据加载

from geoai.train import ObjectDetectionDatasetdataset = ObjectDetectionDataset(    image_paths=["img1.tif""img2.tif"],    label_paths=["mask1.tif""mask2.tif"],    instance_labels=False,  # False=自动连通域标记;True=使用预分配实例ID    multiclass=False,       # False=二分类;True=多类实例分割)

关键参数说明

参数
说明
instance_labelsTrue
 时,掩膜像素值直接作为实例 ID(如 FTW 数据集);False 时自动运行连通域分析
multiclassTrue
 时,掩膜像素值作为类别 ID,每个类别内部再做连通域分割;False 时所有前景为同一类

标签制作最佳实践

矢量标注阶段

  • • 属性字段命名:统一使用 class 或 category 作为类别字段,避免使用中文或特殊字符。
  • • 几何有效性:确保多边形无自相交、无重叠(可使用 geoai.smooth_vector() 平滑边界)。
  • • 坐标系:优先使用投影坐标系(如 UTM)进行标注,确保面积计算准确。

栅格化阶段

  • • 参考影像对齐:始终使用 reference_raster 参数确保掩膜与影像像素级对齐。
  • • all_touched=True 适合细线状地物(如道路、河流),all_touched=False 适合块状地物(如建筑)。
  • • 缓冲区:对于线状或点状地物,可通过 buffer_radius 扩展为面状,便于模型学习。

切分阶段

  • • 瓦片尺寸:常见选择 256×256 或 512×512,需根据影像分辨率和地物尺度调整。
  • • 步长设置
    • • stride = tile_size:无重叠,训练效率高但边界地物可能截断。
    • • stride = tile_size / 2:50% 重叠,提升边界地物识别率,但数据量增加 4 倍。
  • • 空瓦片过滤:设置 skip_empty_tiles=True 可减少无标注瓦片,提升训练效率。

标签验证

import geoai# 可视化检查训练瓦片fig = geoai.display_training_tiles("output/training_tiles", num_tiles=6)# 检查栅格信息info = geoai.get_raster_info("output/training_tiles/masks/tile_000_000.tif")print(info)

相关模块与文件索引

功能
文件路径
栅格读写、矢量转栅格、栅格转矢量
geoai/utils/raster.py
矢量读写、几何属性计算、平滑
geoai/utils/vector.py
训练数据导出、增强、Flip-n-Slide
geoai/utils/training.py
TorchGeo 数据集与采样器封装
geoai/utils/sampling.py
语义分割数据集与训练
geoai/segmentation.py
目标检测与实例分割训练
geoai/train.py
目标检测高级接口
geoai/object_detect.py
土地覆盖分类训练
geoai/landcover_train.py
训练数据制作示例
docs/examples/create_training_data.ipynb

GeoAI 的标签制作体系围绕 "矢量标注 → 栅格化 → 切分增强 → 模型训练" 的流水线展开:

  1. 1. 标签类型:核心支持语义分割掩膜、实例分割掩膜、目标检测标注(COCO/YOLO)及原始矢量标注。
  2. 2. 制作工具vector_to_raster 实现矢量栅格化,export_geotiff_tiles_batch 实现批量切分,get_default_augmentation_transforms 提供数据增强。
  3. 3. 关键原则空间对齐(CRS、分辨率、边界一致)和像素值规范(类别 ID 从 0 开始,背景为 0)是标签制作的核心要求。