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值差别很大。如果你只采了针叶林的样本,模型就认不出阔叶林。
我习惯的做法是:
- 先做一次非监督分类(比如ISODATA),看看每个地类内部有多少光谱子类
- 每个子类至少采5-10个样本
- 最后合并成目标类别
4.2 GPS实地采样——最靠谱但最累
实地采样是「金标准」。我记得在云南做项目时,背着GPS在山里走了三天,就为了采50个点。虽然累,但这些数据后来成了验证集的核心。
实地采样的要点:
- 设备准备:手持GPS精度要在5米以内,手机GPS误差太大(10-20米),不推荐
- 记录内容:除了坐标,还要拍照片、记录地物描述(比如「稀疏草地,覆盖度约40%」)
- 时间同步:采样时间尽量和影像获取时间一致,别拿夏天的样本去分冬天的影像
避坑指南:我曾经在GPS数据导出时忘了设置坐标系,结果所有点都偏了200多米。嗯,从那以后我每次导出前都会检查投影信息。
4.3 基于高分辨率影像的目视解译采样
说实话,大部分项目不可能全实地采样。这时候高分辨率影像(比如Google Earth、GF-2、WorldView)就是救星。
目视解译采样的流程:
- 选底图:分辨率要优于分类影像的3倍以上。比如你用30米的Landsat,底图最好用10米以内的
- 建解译标志:每个地类建立3-5个典型样片,包括色调、纹理、形状、阴影等特征
- 勾画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 纯化流程
我总结了一套纯化流程,分享给大家:
- 第一轮:人工检查,删除明显错误(约5-10%)
- 第二轮:光谱异常检测,删除离群值(约3-5%)
- 第三轮:空间一致性检查,删除不合理样本(约2-3%)
- 第四轮:用初步分类结果验证,删除与分类结果严重不符的样本
重要提醒:纯化后的样本要重新编号、记录删除原因。我习惯保留一个「样本溯源表」,记录每个样本的采集时间、采集人、修改记录。这样出了问题能追查。
4.5 本章知识体系
下面这张图总结了样本采集的核心逻辑,我画了很久,希望能帮大家理清思路:
这张图展示了样本采集的完整链条:从顶层设计原则出发,选择适合的采样方法,最后通过质量控制确保数据质量。每一步都环环相扣,缺一不可。
我的经验:样本采集占整个项目时间的40%以上,但很多人只花10%的时间。你想想看,地基没打好,房子能稳吗?所以,多花点时间在样本上,后面会省很多事。
公众号:蓝海资料掘金营,微信deep3321