本文档深入总结 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)

图:遥感目标检测示例。
• 定义:以边界框(Bounding Box)或 COCO/YOLO 格式标注对象位置与类别。 • 存储格式: • COCO 格式:JSON 文件,包含 images,annotations,categories字段。• 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. 读取影像:使用 rasterio/rioxarray读取 GeoTIFF,获取 CRS、分辨率、边界等信息。2. 读取矢量标注:使用 geopandas读取 GeoJSON/Shapefile,检查class等属性字段。3. 坐标系统一:确保影像与矢量标注具有相同的 CRS,否则使用 gdf.to_crs(src.crs)重投影。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 | |
attribute_field | class) |
all_touched | TrueFalse 时仅中心点在内部的像素 |
fill_value |
影像与标签切分(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 → COCO: geoai/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_labels | TrueFalse 时自动运行连通域分析 |
multiclass | TrueFalse 时所有前景为同一类 |
标签制作最佳实践
矢量标注阶段
• 属性字段命名:统一使用 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 | |
geoai/utils/training.py | |
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. 标签类型:核心支持语义分割掩膜、实例分割掩膜、目标检测标注(COCO/YOLO)及原始矢量标注。 2. 制作工具: vector_to_raster实现矢量栅格化,export_geotiff_tiles_batch实现批量切分,get_default_augmentation_transforms提供数据增强。3. 关键原则:空间对齐(CRS、分辨率、边界一致)和像素值规范(类别 ID 从 0 开始,背景为 0)是标签制作的核心要求。
夜雨聆风