4. 训练样本采集:样本设计原则与实战操作

各位同学好,今天我们来聊聊训练样本采集。说实话,这是整个土地覆盖分类中最「苦」的活,但也是最关键的环节。我见过太多项目,算法调得再好,样本一塌糊涂,结果就是白忙活。嗯,咱们一步步来拆解。

4.1 样本设计三原则:数量、分布、代表性

样本设计说白了就三个词:够多、够散、够纯。我习惯把它们叫做「三够原则」。

核心口诀:数量要够、分布要匀、代表要真。

4.1.1 样本数量——不是越多越好

很多人觉得样本越多越好,其实不然。我做过一个实验,样本从500个增加到2000个,精度只提升了0.3%,但采集成本翻了4倍。你想想看,这划算吗?

我个人建议的经验值:

分类类别数 每类最少样本数 推荐样本数
5类以内 50 100-200
5-10类 80 150-300
10类以上 100 200-500

这里有个坑:别均匀采样。比如水体在影像中只占5%,你却采了30%的样本,模型会「偏科」的。我曾经犯过这个错,结果模型把阴影全分成了水体……

4.1.2 样本分布——空间要「散」

样本分布有个基本原则:别扎堆。我见过有人在一个地块里采了50个样本,这跟采1个没区别,因为空间自相关性太强了。

怎么做?我建议用分层随机采样

  • 先把研究区划分成网格(比如1km×1km)
  • 每个网格内随机选点
  • 保证每个地类在每个网格都有覆盖

小技巧:用ArcGIS的Create Random Points工具,设置最小距离限制(比如100米),这样点就不会挤在一起了。

4.1.3 样本代表性——要能「以点带面」

代表性是什么意思?就是你采的样本要能代表整个类别的光谱特征。举个例子,同样是林地,有针叶林、阔叶林、混交林,它们的NDVI值差别很大。如果你只采了针叶林的样本,模型就认不出阔叶林。

我习惯的做法是:

  1. 先做一次非监督分类(比如ISODATA),看看每个地类内部有多少光谱子类
  2. 每个子类至少采5-10个样本
  3. 最后合并成目标类别

4.2 GPS实地采样——最靠谱但最累

实地采样是「金标准」。我记得在云南做项目时,背着GPS在山里走了三天,就为了采50个点。虽然累,但这些数据后来成了验证集的核心。

实地采样的要点:

  • 设备准备:手持GPS精度要在5米以内,手机GPS误差太大(10-20米),不推荐
  • 记录内容:除了坐标,还要拍照片、记录地物描述(比如「稀疏草地,覆盖度约40%」)
  • 时间同步:采样时间尽量和影像获取时间一致,别拿夏天的样本去分冬天的影像

避坑指南:我曾经在GPS数据导出时忘了设置坐标系,结果所有点都偏了200多米。嗯,从那以后我每次导出前都会检查投影信息。

4.3 基于高分辨率影像的目视解译采样

说实话,大部分项目不可能全实地采样。这时候高分辨率影像(比如Google Earth、GF-2、WorldView)就是救星。

目视解译采样的流程:

  1. 选底图:分辨率要优于分类影像的3倍以上。比如你用30米的Landsat,底图最好用10米以内的
  2. 建解译标志:每个地类建立3-5个典型样片,包括色调、纹理、形状、阴影等特征
  3. 勾画ROI:在底图上勾画纯像元区域,避开混合像元和边界

这里有个关键:别在底图上直接点。我习惯的做法是勾画多边形,然后提取多边形内部的纯像元。这样能避免「点到了边界上」的尴尬。

4.4 样本质量控制与纯化

样本采完了,别急着用。我敢说,第一次采的样本里至少有10%-20%是有问题的。怎么处理?

4.4.1 光谱一致性检查

用ENVI或Python画每个类别的光谱曲线,看看有没有「离群值」。比如林地样本里突然出现一个光谱像水泥地的,那肯定是标错了。

# Python示例:检查样本光谱一致性
import numpy as np
import matplotlib.pyplot as plt

def check_spectral_outliers(samples, labels, class_name, threshold=2):
    """
    检查某个类别的光谱异常值
    threshold: 标准差倍数,超过此值视为异常
    """
    class_samples = samples[labels == class_name]
    mean_spectrum = np.mean(class_samples, axis=0)
    std_spectrum = np.std(class_samples, axis=0)
    
    # 计算每个样本与均值的距离
    distances = np.abs(class_samples - mean_spectrum) / (std_spectrum + 1e-6)
    outlier_idx = np.where(np.max(distances, axis=1) > threshold)[0]
    
    print(f"发现 {len(outlier_idx)} 个异常样本")
    return outlier_idx

4.4.2 空间一致性检查

把样本叠加到影像上,看看有没有「不合理」的。比如:

  • 水体样本落在了山顶上
  • 农田样本出现在了城市中心
  • 林地样本在沙漠里

这些明显是标错了,直接删除。

4.4.3 纯化流程

我总结了一套纯化流程,分享给大家:

  1. 第一轮:人工检查,删除明显错误(约5-10%)
  2. 第二轮:光谱异常检测,删除离群值(约3-5%)
  3. 第三轮:空间一致性检查,删除不合理样本(约2-3%)
  4. 第四轮:用初步分类结果验证,删除与分类结果严重不符的样本

重要提醒:纯化后的样本要重新编号、记录删除原因。我习惯保留一个「样本溯源表」,记录每个样本的采集时间、采集人、修改记录。这样出了问题能追查。

4.5 本章知识体系

下面这张图总结了样本采集的核心逻辑,我画了很久,希望能帮大家理清思路:

训练样本采集知识体系 样本设计三原则 数量足够 分布均匀 代表性强 两种采样方法 GPS实地采样 (精度高、成本高) 高分辨率影像目视解译 (效率高、需经验) 样本质量控制与纯化 核心目标:获取高质量、高代表性的训练样本

这张图展示了样本采集的完整链条:从顶层设计原则出发,选择适合的采样方法,最后通过质量控制确保数据质量。每一步都环环相扣,缺一不可。

我的经验:样本采集占整个项目时间的40%以上,但很多人只花10%的时间。你想想看,地基没打好,房子能稳吗?所以,多花点时间在样本上,后面会省很多事。


公众号:蓝海资料掘金营,微信deep3321