第一章:遥感AI pipeline构建手册概述
遥感AI pipeline 是连接卫星/航空影像数据与智能解译能力的核心工程框架,涵盖从原始数据接入、预处理、模型训练、推理部署到结果可视化的全生命周期。本手册面向地理信息工程师、AI算法研究员及MLOps实践者,提供可复用、可扩展、可审计的端到端技术实现路径。
核心设计原则
- 数据驱动一致性:统一时空基准(WGS84 + UTM分带)、辐射定标标准(DN → TOA/L1C → SR)与波段顺序(B02/B03/B04/B08 for Sentinel-2)
- 模型即服务化:支持ONNX Runtime、Triton Inference Server及自定义PyTorch Serving容器化部署
- 可追溯性保障:每条样本标注、模型版本、超参配置均通过DVC + MLflow联合追踪
典型输入输出规范
| 阶段 | 输入格式 | 输出格式 | 示例工具链 |
|---|
| 数据接入 | GeoTIFF / COG / STAC Catalog JSON | TileDB Array / Zarr Group | rio-cogeo, pystac, rasterio |
| 模型训练 | TFRecord / WebDataset / TorchGeo Dataset | PyTorch .pt / ONNX .onnx | timm, segmentation-models-pytorch |
快速验证环境初始化
# 创建隔离环境并安装核心依赖 conda create -n rs-ai-pipeline python=3.9 conda activate rs-ai-pipeline pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install rasterio torchgeo mlflow dvc[gs] onnxruntime-gpu # 验证GPU与CUDA可见性 python -c "import torch; print(f'CUDA available: {torch.cuda.is_available()}'); print(f'Device count: {torch.cuda.device_count()}')"
该命令序列将构建具备遥感专用I/O与AI加速能力的基础运行时,并输出设备就绪状态供后续pipeline编排使用。
第二章:GeoTIFF数据读取与预处理
2.1 GDAL与rasterio双引擎对比与选型实践
核心能力维度对比
| 维度 | GDAL(C++/Python绑定) | rasterio(纯Python封装) |
|---|
| 内存管理 | 手动控制Dataset生命周期,易内存泄漏 | 上下文管理器自动释放,RAII友好 |
| 坐标系处理 | 需显式调用GetProjectionRef() | 内置crs属性,支持EPSG字符串直读 |
典型读取模式差异
# rasterio:声明式、地理语义清晰 with rasterio.open("dem.tif") as src: data = src.read(1) # 自动处理nodata、CRS、仿射变换 transform = src.transform # 直接获取Affine对象
该写法隐式完成投影解析、空值掩膜、块缓存策略,避免GDAL中需手动调用
GetGeoTransform()和
GetRasterBand(1).ReadAsArray()的冗余链式调用。
选型决策树
- 需嵌入C++项目或极致I/O吞吐 → 优先GDAL原生API
- 快速原型、地理空间分析Pipeline → rasterio更简洁可靠
2.2 多波段GeoTIFF的空间对齐与地理坐标系统一
核心挑战识别
多波段GeoTIFF常源于不同传感器或时相采集,存在投影不一致、分辨率错位、仿射参数偏差等问题,导致波段间空间基准失配。
GDAL地理配准标准化流程
# 统一重投影并强制对齐网格 gdalwarp -t_srs EPSG:32649 \ -tr 10 10 \ -r bilinear \ -tap \ -co "COMPRESS=LZW" \ input.tif aligned.tif
-tap(target aligned pixels)确保输出栅格像元边界严格对齐目标分辨率网格;
-tr指定统一像元大小;
-t_srs强制目标坐标系,消除波段间CRS差异。
关键参数对照表
| 参数 | 作用 | 推荐值 |
|---|
-tap | 像元网格对齐 | 必选 |
-r bilinear | 重采样策略 | 连续波段适用 |
2.3 云掩膜、辐射定标与大气校正的Python自动化实现
核心处理流程
遥感影像预处理需依次完成云像素识别、DN值到物理量转换、大气效应消除。使用`rasterio`读取影像,`Py6S`构建大气模型,`scikit-image`优化云掩膜精度。
关键代码示例
from py6s import SixS s = SixS() s.altitudes.set_target_altitude(0) # 地表高度(km) s.altitudes.set_sensor_altitude(705) # Landsat-8轨道高度(km) s.atmos_profile = SixS.AtmosProfile.FromLatitudeAndDate(39.9, 6, 15) # 北京夏季典型廓线
该段初始化6S大气传输模型,通过经纬度与日期自动匹配标准大气剖面;传感器高度设为705 km以适配Landsat系列,确保气溶胶与水汽参数动态加载。
常用参数对照表
| 步骤 | 工具库 | 关键参数 |
|---|
| 云掩膜 | sentinelsat + s2cloudless | cloud_probability_threshold=40 |
| 辐射定标 | radiance_coefficients | gain/offset从MTL文件解析 |
2.4 大尺寸遥感影像的分块加载与内存优化策略
分块加载核心逻辑
采用滑动窗口式分块策略,按地理坐标与像素分辨率双约束切分,避免跨瓦片重采样失真:
def tile_from_geo(geo_bbox, resolution, tile_size=512): # geo_bbox: (minx, miny, maxx, maxy) in WGS84 x_start = int((geo_bbox[0] - origin_x) / (resolution * tile_size)) y_start = int((origin_y - geo_bbox[3]) / (resolution * tile_size)) return (x_start, y_start, tile_size, tile_size)
该函数基于影像地理参考原点(
origin_x,
origin_y)与像元分辨率动态计算起始瓦片索引,确保空间连续性。
内存驻留策略对比
| 策略 | 峰值内存 | IO开销 | 适用场景 |
|---|
| LRU缓存 | 中 | 低 | 交互式浏览 |
| 内存映射(mmap) | 低 | 高 | 批量处理 |
2.5 时空序列GeoTIFF的时间戳解析与一致性校验
时间戳提取策略
GeoTIFF 的时间信息通常嵌入于 GDAL 元数据(如
TIFFTAG_DATETIME)或自定义标签(如
TIME_START)。需优先校验 ISO 8601 格式兼容性,并处理时区偏移。
from osgeo import gdal ds = gdal.Open("scene_20230715.tif") meta = ds.GetMetadata() t_start = meta.get("TIME_START", meta.get("TIFFTAG_DATETIME", "")) # 若含时区,用 dateutil.parser 安全解析
该代码通过双层 fallback 获取时间字段,避免因元数据键名差异导致解析失败;
TIME_START为遥感产品常用自定义键,
TIFFTAG_DATETIME是 TIFF 标准字段,二者语义不同但常共存。
多文件时间一致性检查
对序列中 N 个 GeoTIFF 文件执行滑动窗口校验:
- 提取每景的
TIME_START与TIME_END - 验证相邻文件是否存在时间重叠或断裂
- 拒绝时间跨度超过采样周期 110% 的异常帧
| 文件索引 | TIME_START | TIME_END | 状态 |
|---|
| 0 | 2023-07-15T02:14:33Z | 2023-07-15T02:15:03Z | ✅ |
| 1 | 2023-07-15T02:15:02Z | 2023-07-15T02:15:32Z | ⚠️ 重叠1s |
第三章:遥感样本工程与标注管理
3.1 基于矢量边界(GeoJSON/Shapefile)的像素级样本裁切
核心流程概述
该方法将地理空间矢量边界与遥感影像精确对齐,通过坐标系转换、栅格重采样和掩膜裁切三步实现亚像元级精度的样本提取。
关键代码示例
# 使用rasterio+shapely进行GeoJSON边界裁切 with rasterio.open("image.tif") as src: shapes = [feature["geometry"] for feature in geojson_data["features"]] out_image, out_transform = mask(src, shapes, crop=True, filled=False)
逻辑说明:`mask()` 函数自动完成投影对齐与像元裁剪;`crop=True` 启用边界收缩,`filled=False` 保留原始NoData值,确保后续训练标签一致性。
输入格式支持对比
| 格式 | 优势 | 注意事项 |
|---|
| GeoJSON | 轻量、Web友好、易解析 | 需确保CRS与影像一致(如EPSG:4326→EPSG:32650) |
| Shapefile | 属性丰富、GIS生态兼容性强 | 须加载.shp+.shx+.dbf三文件,注意编码(如GBK/UTF-8) |
3.2 多尺度标签生成与类别不平衡的遥感语义编码
多尺度标签构建策略
为适配遥感影像中目标尺度差异大(如小尺寸电力塔 vs 大面积农田),采用金字塔式标签生成:对原始标注图进行 0.5×、1.0×、2.0× 三尺度下采样与上采样,保留语义一致性。
类别再平衡编码模块
def focal_loss(logits, labels, alpha=0.75, gamma=2.0): # logits: [B, C, H, W], labels: [B, H, W] ce = F.cross_entropy(logits, labels, reduction='none') pt = torch.exp(-ce) focal_weight = (alpha * (1 - pt) ** gamma) return (focal_weight * ce).mean()
该损失函数动态抑制易分类背景像素(如水体、裸土)梯度,增强稀有地物(如光伏板、输电线路)的梯度权重。α 控制正负样本权重偏置,γ 调节难易样本聚焦强度。
遥感类别分布统计(训练集)
| 类别 | 像素占比(%) | 有效采样率 |
|---|
| 建筑物 | 8.2 | 1.00 |
| 道路 | 4.1 | 1.00 |
| 光伏阵列 | 0.37 | 3.8 |
| 风电设施 | 0.09 | 12.6 |
3.3 样本质量评估:光谱一致性、空间完整性与标注置信度量化
光谱一致性校验
通过计算相邻波段间归一化互相关系数(NCC)量化光谱平滑性:
def spectral_ncc(spectrum): # spectrum: (C,) array, C=224 bands ncc_scores = [] for i in range(1, len(spectrum)): ncc = np.corrcoef(spectrum[i-1], spectrum[i])[0,1] ncc_scores.append(max(0, ncc)) # 截断负值 return np.mean(ncc_scores)
该函数输出[0,1]区间标量,值越接近1表明光谱响应越连续;阈值设为0.85可有效过滤仪器噪声导致的突变样本。
三维度质量指标汇总
| 维度 | 指标 | 合格阈值 |
|---|
| 光谱一致性 | NCC均值 | ≥0.85 |
| 空间完整性 | 有效像素占比 | ≥92% |
| 标注置信度 | 多专家IoU中位数 | ≥0.78 |
第四章:PyTorch遥感模型训练与部署流水线
4.1 面向遥感任务的自定义Dataset与动态Patch采样器
核心设计目标
遥感影像具有多尺度、多时相、高分辨率特性,静态裁剪易导致光谱失真或地物割裂。需在加载时动态生成语义对齐的Patch。
动态采样策略
- 基于滑动窗口+随机偏移,避免周期性伪影
- 按地物类别分布加权采样,缓解样本不均衡
- 支持多源数据(光学/SAR/DEM)时空对齐
关键代码实现
class RemoteSensingDataset(Dataset): def __init__(self, img_paths, label_paths, patch_size=256, overlap_ratio=0.25, class_weights=None): self.img_paths = img_paths self.label_paths = label_paths self.patch_size = patch_size self.stride = int(patch_size * (1 - overlap_ratio)) self.class_weights = class_weights or [1.0] * 10
该构造函数初始化遥感数据集,
stride由重叠率动态计算,确保覆盖完整性;
class_weights为后续采样器提供类别优先级依据。
采样器性能对比
| 策略 | 内存占用 | 地物完整性 | 训练收敛速度 |
|---|
| 固定网格裁剪 | 低 | 差 | 慢 |
| 动态语义采样 | 中 | 优 | 快 |
4.2 多光谱输入适配:通道归一化、波段重排序与Spectral Attention嵌入
通道归一化策略
针对不同传感器波段响应差异,采用逐波段Z-score归一化:
# 输入:tensor x of shape [B, C, H, W], C=12 (e.g., Sentinel-2) mean = x.mean(dim=(0, 2, 3), keepdim=True) # per-band mean std = x.std(dim=(0, 2, 3), keepdim=True, unbiased=False) x_norm = (x - mean) / (std + 1e-8) # avoid division by zero
该操作保留光谱结构特征,消除量纲影响,为后续注意力机制提供稳定输入分布。
波段重排序映射
依据物理意义对原始波段索引重排,构建语义一致序列:
| 原始索引 | 波段名称 | 重排序后索引 |
|---|
| 3 | B04 (Red) | 0 |
| 2 | B03 (Green) | 1 |
| 1 | B02 (Blue) | 2 |
Spectral Attention嵌入
- 沿通道维度生成频谱权重,捕获波段间相关性
- 使用轻量全连接层+Softmax实现可学习频谱门控
4.3 分布式训练支持:DDP多卡训练与GeoTIFF流式数据并行加载
DDP初始化关键步骤
import torch.distributed as dist dist.init_process_group( backend="nccl", # 高性能GPU通信后端 init_method="env://", # 从环境变量读取master地址与端口 world_size=args.world_size, rank=args.rank # 当前进程全局序号 )
该调用建立跨GPU的通信组,
nccl确保张量同步低延迟;
world_size需与实际GPU数一致,
rank由启动脚本(如
torchrun)自动分配。
GeoTIFF流式加载优化策略
- 使用
rasterio.Env(aws_unsigned=True)跳过S3签名开销 - 每个
DataLoader进程绑定独立GDAL线程池,避免I/O阻塞扩散
DDP与数据加载协同时序
| 阶段 | 主进程行为 | 子进程行为 |
|---|
| 初始化 | 加载元数据、分片索引 | 等待主进程广播分片列表 |
| 训练循环 | 聚合梯度、保存检查点 | 独立加载本地分片+前向/反向计算 |
4.4 模型导出与ONNX推理:从训练到边缘部署的端到端验证
PyTorch模型导出为ONNX格式
# 导出前确保模型处于eval模式 model.eval() dummy_input = torch.randn(1, 3, 224, 224) torch.onnx.export( model, dummy_input, "resnet50_edge.onnx", opset_version=13, do_constant_folding=True, input_names=["input"], output_names=["output"] )
该导出调用将动态图固化为静态计算图;
opset_version=13兼容主流边缘推理引擎(如ONNX Runtime、TVM),
do_constant_folding启用常量折叠以减小模型体积。
ONNX Runtime轻量推理验证
- 支持CPU/GPU/NPU多后端无缝切换
- 自动优化图结构(如算子融合、内存复用)
- 量化感知推理需额外启用ExecutionProvider
典型边缘设备性能对比
| 设备 | 延迟(ms) | 功耗(W) |
|---|
| Raspberry Pi 4 | 86 | 2.1 |
| NVIDIA Jetson Nano | 24 | 5.0 |
第五章:GitHub可运行模板与最佳实践总结
精选可运行模板推荐
- GitHub官方Action工作流模板,覆盖CI/CD、Docker构建、Terraform部署等场景;
- docs-as-code模板,集成Jekyll + GitHub Pages自动发布流程;
- TypeScript + React一键启动模板,含ESLint、Prettier、Jest预配置。
关键配置最佳实践
# .github/workflows/test-and-deploy.yml on: push: branches: [main] paths-ignore: ['**.md'] # 避免文档变更触发冗余构建 jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' - run: npm ci && npm test
模板复用与定制化策略
| 场景 | 推荐方式 | 风险规避要点 |
|---|
| 团队内部标准化项目 | 派生模板仓库 + git subtree 同步更新 | 禁用直接修改模板分支,通过PR合并上游变更 |
| 跨语言微服务基线 | 使用GitHub CLI创建带参数化变量的模板 | 在.github/template-config.yml中明确定义required_vars |
可观测性增强方案
在模板中嵌入轻量级健康检查脚本(如./scripts/healthcheck.sh),由cron workflow每日拉取并上报至GitHub Environment Secrets中的SLACK_WEBHOOK_URL。