第8期| 传统机器学习遥感解译:SVM & 随机森林分类全流程实操

前言

在前两期内容中,我们系统学习了遥感影像全流程预处理人工目视解译判读体系 。目视解译依托从业者经验完成地物识别,具备判读直观、边界精准的优势,但也存在效率低下、主观偏差大、难以规模化作业等短板,无法满足当下大范围遥感监测、长时序动态分析的工程需求。

在深度学习技术普及之前,传统机器学习算法 凭借低算力依赖、可解释性强、小样本适配 等特性,成为遥感影像自动分类的主流技术方案。其中 支持向量机(SVM)随机森林(Random Forest) 更是行业标杆算法,至今仍是本科毕业设计、期刊论文、小型工程项目中使用率最高的分类基线模型。

不同于深度学习的端到端自动特征学习,传统机器学习依赖人工特征工程,通过提取影像光谱、纹理、遥感指数等多维特征实现像素级分类。本期将完整拆解:两类技术路线的核心差异、遥感影像特征构建方法、SVM与随机森林分步实操、遥感领域专属精度评价体系,全程搭配落地代码与优化思路,零基础也可复现实验结果。


一、传统机器学习 VS 深度学习 遥感解译核心差异

在开展实验前,首先厘清两大技术路线的适用场景、原理区别与优劣势,根据自身数据条件、硬件配置、项目需求合理选型。

对比维度 传统机器学习(SVM/随机森林) 深度学习(U-Net/YOLO等)
特征来源 人工设计特征(光谱、纹理、遥感指数) 网络自动挖掘深层特征
样本需求 少量标记样本即可训练 依赖大规模标注数据集
硬件要求 仅需CPU,普通电脑即可运行 建议GPU加速,大模型显存要求高
训练速度 极速,单景影像数秒完成训练 训练周期长,动辄数小时/数天
可解释性 特征、分类逻辑清晰,结果易解读 黑盒模型,特征逻辑难以溯源
适用场景 小范围分类、对比实验、论文基线、快速出图 复杂场景、精细化地物提取、大规模工程落地

选型建议

  1. 样本数量少、硬件配置一般、仅需完成基础地物分类:优先选择 随机森林 / SVM
  2. 地物类型复杂、存在大量细碎目标、拥有充足标注数据与GPU设备:优先选择深度学习模型。

二、遥感影像核心特征体系构建

特征是机器学习分类的核心载体,特征质量直接决定分类精度上限 。遥感影像分类主流使用光谱特征+纹理特征组合方案,部分场景可叠加植被、水体、建筑等专题遥感指数,进一步区分同谱异物、同物异谱难题。

2.1 光谱特征

光谱特征是遥感影像最本质的判别依据,由不同地物对电磁波的反射、吸收特性决定。

  • 基础构成:多波段原始像素灰度值,单波段、多波段组合均可作为输入特征;
  • 拓展应用:衍生各类遥感专题指数,典型代表:
    • NDVI 归一化植被指数:区分植被与非植被区域;
    • NDWI 归一化水体指数:精准提取水体,区分水体与阴影;
    • NDBI 归一化建筑指数:快速识别城镇建设用地。

2.2 纹理特征

单纯依靠光谱特征极易出现同谱异物问题(例如阴影与水体、裸土与低矮建筑色调相近,难以区分)。纹理描述地物表面的空间分布规律、粗糙程度,是弥补光谱缺陷的关键。

本次实操选用工程中最常用的两类纹理指标:

  • 灰度均值:反映局部区域整体亮度;
  • 灰度方差:反映局部区域像素离散程度,表征纹理粗糙与否。

通过滑动窗口 逐像素遍历整图,提取邻域纹理信息,让模型兼顾像素灰度与空间形态。


三、SVM & 随机森林 地物分类完整实操

3.1 整体技术流程

标准遥感机器学习分类全链路:

影像预处理 → 多维特征融合 → 训练样本采集 → 模型训练与验证 → 全域影像预测 → 结果输出

3.2 环境依赖安装

执行以下命令安装所需依赖库,适配 Windows / Linux 全平台:

bash 复制代码
pip install numpy rasterio opencv-python scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn

3.3 完整可运行代码

代码实现功能:影像读取、光谱+纹理特征提取、样本划分、SVM分类、随机森林分类、全图预测,可直接替换路径运行。

python 复制代码
import rasterio
import numpy as np
import cv2
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# ===================== 【参数配置区 - 仅修改此处】 =====================
# 待分类遥感影像路径(支持tif格式)
IMAGE_PATH = r"校正后遥感影像.tif"
# 纹理提取滑动窗口大小,建议取值 3 / 5 / 7
TEXTURE_WINDOW = 5
# 训练样本数量,根据影像大小调整
SAMPLE_NUM = 3000
# 地物分类类别数
CLASS_NUM = 4
# =====================================================================

def extract_texture(gray_img, win_size):
    """
    提取纹理特征:局部均值 + 局部方差
    :param gray_img: 单波段灰度影像
    :param win_size: 滑动窗口尺寸
    :return: 拼接后的纹理特征矩阵
    """
    # 计算局部均值
    mean_feat = cv2.blur(gray_img, (win_size, win_size))
    # 计算局部方差 Var = E(X²) - [E(X)]²
    square_mean = cv2.blur(np.square(gray_img), (win_size, win_size))
    var_feat = square_mean - np.square(mean_feat)
    # 特征拼接
    texture_combined = np.dstack([mean_feat, var_feat])
    return texture_combined

def build_total_feature(raster_data):
    """
    融合光谱特征 + 纹理特征,构建全局特征矩阵
    :param raster_data: 原始多波段影像 (C, H, W)
    :return: 二维特征矩阵 (像素总数, 特征维度)
    """
    # 维度转换 (C, H, W) → (H, W, C)
    h, w = raster_data.shape[1], raster_data.shape[2]
    spec_feat = np.transpose(raster_data, (1, 2, 0))

    # 生成灰度图,用于提取纹理
    gray = np.mean(spec_feat, axis=-1)
    # 提取纹理特征
    tex_feat = extract_texture(gray, TEXTURE_WINDOW)

    # 光谱、纹理特征拼接
    total_feat = np.concatenate([spec_feat, tex_feat], axis=-1)
    # 转为二维矩阵:(H*W, 特征数),适配机器学习输入
    total_feat_flat = total_feat.reshape(-1, total_feat.shape[-1])
    return total_feat_flat, h, w

if __name__ == "__main__":
    # 1. 读取遥感影像
    with rasterio.open(IMAGE_PATH) as src:
        img_data = src.read()
        profile = src.profile  # 保存影像地理信息,用于后续保存结果

    # 2. 构建全局特征矩阵
    all_features, height, width = build_total_feature(img_data)
    print(f"✅ 特征构建完成,总像素数:{height * width}")

    # 3. 模拟训练样本(实际项目替换为矢量样本点/标注样本)
    # X:样本特征  Y:样本标签
    sample_idx = np.random.choice(len(all_features), SAMPLE_NUM, replace=False)
    X_sample = all_features[sample_idx]
    y_sample = np.random.randint(0, CLASS_NUM, size=SAMPLE_NUM)

    # 4. 划分训练集 & 测试集(8:2划分)
    X_train, X_test, y_train, y_test = train_test_split(
        X_sample, y_sample, test_size=0.2, random_state=42
    )

    # ===================== SVM 模型训练与预测 =====================
    print("\n----- 开始训练 SVM 分类模型 -----")
    svm_model = SVC(kernel="rbf", random_state=42)
    svm_model.fit(X_train, y_train)
    pred_svm_test = svm_model.predict(X_test)
    # 全图预测
    pred_svm_full = svm_model.predict(all_features).reshape(height, width)

    # ===================== 随机森林 模型训练与预测 =====================
    print("----- 开始训练 随机森林 分类模型 -----")
    rf_model = RandomForestClassifier(n_estimators=120, random_state=42)
    rf_model.fit(X_train, y_train)
    pred_rf_test = rf_model.predict(X_test)
    # 全图预测
    pred_rf_full = rf_model.predict(all_features).reshape(height, width)

    print("\n✅ 两类模型分类预测全部完成!")

实操补充说明

  1. 样本替换 :代码中为模拟随机样本,正式项目可结合 geopandas 读取SHP矢量样本点,提取对应像素标签;
  2. 参数调优 :SVM可调整核函数、惩罚系数;随机森林可调整决策树数量 n_estimators
  3. 结果保存 :可基于 rasterio 将分类结果写入TIFF文件,保留原始坐标与投影信息。

算法分类结果对比图


四、遥感专用精度评价体系解读

分类结果可视化仅能做定性判断,量化精度指标 是论文、项目验收的硬性要求。遥感领域通用三大评价指标:混淆矩阵、总体精度(OA)、Kappa系数,下文结合原理+代码完整讲解。

4.1 混淆矩阵 (Confusion Matrix)

混淆矩阵是分类结果的全景统计表,矩阵行代表真实地物类别,列代表模型预测类别。

  • 核心作用:直观查看各类地物错分、漏分情况,快速定位混分严重的地物(如水影与阴影、耕地与裸土);
  • 应用价值:针对性优化特征、补充样本,解决类别混淆问题。

4.2 总体精度 OA (Overall Accuracy)

所有像素中分类正确的像素占总像素的比例,反映模型整体分类效果,数值越接近1,整体精度越高。

4.3 Kappa 系数

遥感分类核心权威指标,也是期刊、毕设最看重的评价标准。该指标剔除了随机分类带来的正确率干扰,客观评价模型实际分类能力。

  • 评价分级(行业通用标准):
    • Kappa ≥ 0.80:分类效果优秀,结果可靠;
    • 0.60 ≤ Kappa < 0.80:分类效果良好,可满足常规需求;
    • Kappa < 0.60:分类误差较大,需优化特征、样本或模型参数。

4.4 精度评价完整代码

在上述分类代码后追加以下代码,自动计算并打印全部精度指标:

python 复制代码
from sklearn.metrics import confusion_matrix, accuracy_score, cohen_kappa_score

def calculate_evaluation(y_true, y_pred):
    """统一计算混淆矩阵、OA、Kappa系数"""
    cm = confusion_matrix(y_true, y_pred)
    oa = accuracy_score(y_true, y_pred)
    kappa = cohen_kappa_score(y_true, y_pred)
    print("=" * 40)
    print("混淆矩阵:")
    print(cm)
    print(f"总体精度 OA:{oa:.4f}")
    print(f"Kappa 系数:{kappa:.4f}")
    print("=" * 40)

# 分别评估 SVM 与 随机森林
print("【SVM 模型精度评价】")
calculate_evaluation(y_test, pred_svm_test)

print("\n【随机森林 模型精度评价】")
calculate_evaluation(y_test, pred_rf_test)

精度指标解读示意图


五、算法对比 & 精度优化实战技巧

5.1 SVM 与 随机森林 算法特性总结

  1. 支持向量机(SVM)

    • 优势:高维特征适配性强、小样本场景稳定性佳;
    • 短板:大尺度影像预测速度慢、参数对分类结果影响大、多类别场景表现一般;
    • 适配场景:地物类别少、样本稀缺的小型区域分类。
  2. 随机森林(Random Forest)

    • 优势:抗过拟合能力强、运算速度快、多类别分类表现均衡、鲁棒性突出;
    • 短板:极端复杂纹理区域精度略逊于SVM;
    • 适配场景:遥感分类首选基线模型,绝大多数论文、工程项目优先选用。

5.2 分类精度偏低?通用优化方案

如果出现Kappa系数偏低、地物混分严重,可从以下维度逐步调优:

  1. 特征层面:叠加NDVI、NDWI等遥感指数,丰富特征维度;调整纹理窗口大小,适配不同尺度地物;
  2. 样本层面:清洗错误标注样本,保证各类别样本数量均衡,增加典型区域样本;
  3. 模型层面:调整SVM核函数、随机森林决策树数量等超参数;
  4. 数据层面:剔除云雾、厚阴影等干扰区域,降低无效像素影响。

💬 互动答疑

你在使用传统机器学习做遥感分类时,是否遇到 Kappa系数偏低、地物严重混分、大面积错分类 等问题?

可以在评论区描述你的影像场景、地物类型与遇到的难题,我会统一整理并给出针对性的优化方案!


📌 下期预告

第9期:从机器学习到深度学习:AI遥感解译的进化逻辑

详解人工特征、机器特征、AI自动特征提取的区别、深度学习适配遥感大数据的核心原因、AI遥感三大核心任务:分类、检测、分割场景区分、新手该如何选择适合自己的解译任务模型。

--

相关推荐
去码头整点薯条ing22 分钟前
某当网登录滑块【协议+OCR】
爬虫·python·ocr
zSD55rt5a30 分钟前
方差在扩散模型保护中的作用
人工智能·harmonyos
人生百态,人生如梦1 小时前
情感交互仿生人从技术到落地构想3——技术交流贴(2026.7)
人工智能·机器学习·人机交互·交互·具身智能
用户652238438111 小时前
为什么成熟的 LLM 应用,都把"后端地址"做成可切换的配置
人工智能
Aa99883341 小时前
AI视觉检测设备厂家的技术评估框架——以及AI视觉检测的检出边界与适用条件
人工智能
wuhanzhanhui1 小时前
当AI遇见储能!2026武汉国际数字能源产业与新型电力及储能技术展览会
人工智能·能源
赶紧写完去睡觉1 小时前
Anaconda 创建虚拟环境与使用
python·pycharm·conda
迷途呀1 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp
Tangyuewei1 小时前
给 AI 套上缰绳:Harness Engineering 是什么
人工智能
AI棒棒牛1 小时前
第11讲 | 目标检测任务:边界框、IoU、类别与置信度
人工智能·yolo·目标检测·yolo26