“ 使用GeoAI包进行Flip-n-Slide数据增强。”
这次我们分享下使用GeoAI包进行Flip-n-Slide数据增强。
传统网格分块会丢失瓦片边界处的空间信息。Flip-n-Slide法可生成带多种增强效果的重叠瓦片,它具备以下特点:
保留瓦片边界间的空间关联; 借助旋转、翻转操作消除像素重复表达; 无需外接数据增强库,即可生成更多样化的训练数据;
import osimport geoaiimport numpy as npimport rasterioimport matplotlib.pyplot as pltfrom pathlib import Path
我们仍使用带建筑物轮廓的NAIP数据进行示例。
raster_url = ("https://huggingface.co/datasets/giswqs/geospatial/resolve/main/naip_rgb_train.tif")vector_url = "https://huggingface.co/datasets/giswqs/geospatial/resolve/main/naip_train_buildings.geojson"sample_image = geoai.download_file(raster_url)sample_vector = geoai.download_file(vector_url)print(f"Downloaded image: {sample_image}")print(f"Downloaded labels: {sample_vector}")
在GeoAI包中,可以通过flipnslide_augmentation()函数实现Flip-n-Slide数据增强,该函数可直接处理维度为 (通道数,高度,宽度) 的NumPy数组,返回瓦片图像与一组增强索引。
# 将栅格读取为Numpy数组with rasterio.open(sample_image) as src:image_data = src.read()print(f"Image shape: {image_data.shape}")print(f"Image dtype: {image_data.dtype}")# 进行Flip-n-Slide数据增强tiles, aug_indices = geoai.flipnslide_augmentation(image_data, tile_size=256)print(f"Number of tiles: {tiles.shape[0]}")print(f"Tile shape: {tiles.shape[1:]}")print(f"Augmentation types used: {sorted(set(aug_indices))}\n")# 对各类数据增强方式进行统计aug_names = {0: "Identity",1: "180° rotation",2: "90° rotation",3: "270° rotation",4: "Horizontal flip",5: "Vertical flip",6: "90° + H-flip",7: "90° + V-flip",}from collections import Countercounts = Counter(aug_indices)for idx in sorted(counts):print(f" {aug_names.get(idx, f'Type {idx}')}: {counts[idx]} tiles")
该函数还支持以PyTorch张量格式输出瓦片数据,可直接对接训练流程。
tiles_tensor, aug_indices_tensor = geoai.flipnslide_augmentation(image_data, tile_size=256, output_format="torch")print(f"Type: {type(tiles_tensor)}")print(f"Shape: {tiles_tensor.shape}")print(f"Dtype: {tiles_tensor.dtype}")
GeoAI包通过export_flipnslide_tiles()函数将数据增强后的瓦片导出为GeoTiff。该函数为地理空间适配封装接口,可保留每个瓦片的坐标参考系统与地理变换信息。
# 导出的路径,这是我的路径,注意替换output_flipnslide = "E:/Code/GeoAI/flipnslide_tiles"stats = geoai.export_flipnslide_tiles(sample_image,output_flipnslide,tile_size=256,)print(f"\nTotal tiles: {stats['total_tiles']}")print(f"Tile size: {stats['tile_size']}px")print(f"Output folder: {stats['output_folder']}")
我们可以对比下标准网格分块与Flip-n-slide策略生成的瓦片数量。
# 标准网格分块(没有重叠)output_grid = "E:/Code/GeoAI/flipnslide_demo/grid_tiles"geoai.export_geotiff_tiles(sample_image,output_grid,tile_size=256,stride=256,tiling_strategy="grid",)grid_tiles = list(Path(output_grid, "images").glob("*.tif"))# 标准网格分块(步长减半重叠)output_overlap = "E:/Code/GeoAI/flipnslide_demo/overlap_tiles"geoai.export_geotiff_tiles(sample_image,output_overlap,tile_size=256,stride=128,tiling_strategy="grid",)overlap_tiles = list(Path(output_overlap, "images").glob("*.tif"))# Flip-n-Slide数据增强fns_tiles = list(Path(output_flipnslide, "images").glob("*.tif"))print("Tiling Strategy Comparison:")print(f" Grid (stride=256): {len(grid_tiles)} tiles")print(f" Grid (stride=128): {len(overlap_tiles)} tiles")print(f" Flip-n-Slide: {len(fns_tiles)} tiles")
export_flipnslide_tiles()函数支持tiling_strategy参数,可切换标准网格分块与Flip-n-Slide两种模式。
output_strategy = "E:/Code/GeoAI/flipnslide_demo/strategy_demo"geoai.export_geotiff_tiles(sample_image,output_strategy,tile_size=256,tiling_strategy="flipnslide", # 使用Flip-n-Slide策略)strategy_tiles = list(Path(output_strategy, "images").glob("*.tif"))print(f"Tiles generated with tiling_strategy='flipnslide': {len(strategy_tiles)}")
我们简单总结下:
1. flipnslide_augmentation()函数可直接对NumPy数组或PyTorch张量执行Flip-n-Slide数据增强;
2. export_flipnslide_tiles()函数可导出带地理坐标的瓦片,完整保留坐标参考系统与地理变换信息;
3. 设置tiling_strategy="flipnslide"可以在flipnslide_augmentation()函数中使用Flip-n-Slide数据增强。
Flip-n-Slide数据增强方案有如下优势:
保留空间信息:重叠瓦片可维持边界处的空间关联性 内置多样化增强:无需依赖外部库,即可实现8种不同数据增强方式 消除数据冗余:单个像素虽分布在多个瓦片中,但均经过不同变换处理 适配地理空间数据:完整保留各瓦片的坐标参考系统与地理变换元数据
夜雨聆风