利用CVGS-XGBoost遥感识别水体与山体阴影信息
2020-03-09王修信
秦 琴, 王修信
(1.广西师范大学 a.计算机科学与信息工程学院; b.广西多源信息挖掘与安全重点实验室, 广西 桂林 541004;2.广西区域多源信息集成与智能处理协同创新中心, 广西 桂林 541004)
0 引 言
随着科学技术的不断进步, 人类生产活动对区域水体的影响愈发受到重视[1]。遥感技术能够准确掌握水资源的实时情况, 对水资源的合理利用和规划起到重要作用[2]。基于Landsat遥感影像提取水体信息的研究方法很多[3], 常见的有各种水体指数法[4-8]和监督分类法[9-10]。这些方法都是基于水的光谱在不同波段的反射特性, 只有当水体和其他地面物体的光谱特性完全不同时, 才能获得更好的提取效果。 然而, 在水体提取过程中, 由于区域阳光的照射, 往往会出现严重的物体遮挡和山体阴影的干扰。
近年来, 面向对象技术已被应用于提取水体信息[11-12], 通过图像分割技术获得水体的基元信息[13], 再利用基元的数据特征实现遥感图像的信息提取。虽然它在一定程度上提高了遥感信息提取的准确性, 但是因其仅依赖于图像的光谱特性, 在提取小河、 建筑阴影和茂密植被方面的性能受到限制。因此, 有学者将机器学习方法应用于遥感图像的分类。王知音等[14]提出了一种基于SAE的水体提取算法, 该算法可以自动探索遥感数据中包含的空间规则, 并且无需进行复杂的光谱特征分析与特征提取过程,虽然该方法大大缩短了预处理的复杂性, 提高了水提取的自动化程度, 但利用SAE算法提取水体仍然很费时, 需要提高效率。由于单一特征提取水体可能会导致对象混淆, 程晨等[15]构建了图像缨帽变换和波段组合特征的决策树水体提取算法, 该算法在每个缨帽变换分量及波段组合过程中需要手动确定阈值, 因此迁移性较差, 提取结果受到较大的主观影响。吕启等[16]提出一种基于DBN算法的遥感图像分类方法, 该方法充分结合了无监督和有监督学习的特点, 对高维数据具有较好的分类能力。由于算法无法直接提取高维数据的图像特征, 因此建立算法的网络结构需要很长时间。卷积神经网络是一种深度学习神经网络, 可以直接从输入图像中学习图像的高级语义特征, 避免图像的预处理。Scott等提出通过结合深度学习神经网络的迁移学习和数据增强方法对遥感影像进行分类, 可以很好地克服遥感影像中样本数量有限的问题[17]。它将图像的众多图片作为算法的输入, 但基于图片像素级的分类, 存在样本形式与网络输入输出要求不匹配等问题, 导致算法无法直接应用于基于图片像素级的地物提取。
桂林主要以喀斯特地貌为主, 地形往往山高崎岖。在阳光照射下, 获取到的遥感图像会出现大量的山体阴影, 而山体阴影与水体在高分辨率遥感图像中光谱往往相似, 因此会产生“异物同谱”现象, 给喀斯特地貌中的水体提取带来一定的误差, 容易造成水体的“误识别”和“漏识别”, 很难保证喀斯特地貌水体提取的精度。因此, 选取最佳方法将水体与山体阴影分类是研究该地区水体空间分布的前提。
XGBoost(eXtreme Gradient Boosting)是由Chen等设计开发的Boosting库, 是一种基于决策树的机器学习集成算法, 具有运行速度快、 分类效果好、 支持自定义损失函数和支持多种语言等特点[18]。然而, XGBoost算法存在逐个调参收敛速度慢和参数之间相互限制的问题。本文针对喀斯特地区遥感图像中水体和山体阴影信息易混淆使得传统机器学习算法分类精度低、 计算速度慢的缺点改进XGBoost算法,将交叉验证与栅格搜索相结合用于XGBoost中,构建CVGS-XGBoost分类算法, 以参数平均误差最小化为最终目标, 提高参数优选的准确性, 有效避免训练样本的随机抽样对算法性能的影响。
1 XGBoost算法原理介绍
提升算法的主要思想是在判断复杂的任务时, 多位专家的判断结果要优于一位专家的判断结果。提升算法是加法算法和前向分布算法的结合, 由于决策树的线性组合能够非常好地拟合训练数据, 因此决策提升树是一个高性能的学习算法。在处理图像分类问题时, 决策树选择二叉分类树作为基分类器, 提升树算法就表示由多个二叉分类决策树组合而成的算法。给定一组数据样本, 对训练样本集进行划分, 在算法训练过程中, 训练样本的权重会不断更新。每一轮训练结束后, 正确分类的训练样本的权值减小, 错误分类的训练样本的权值增大。经过多次训练后, 错误分类的训练样本会得到更多的关注, 而被正确分类的训练样本的权重逐渐趋近于零。最后, 可以获得多个简单的分类器, 通过组合这些简单的分类器, 可以获得一个强大的分类器算法。
XGBoost又称极限梯度提升算法, 它是一种基于提升树的机器学习集成算法, 用于研究梯度提升决策树算法。XGBoost算法包含一组迭代残差树, 每一棵树的最终预测值是学习前N-1棵树的残差后, 每棵树预测的新样本输出值的总和。具体推导过程为: 设D={(xi,yi)}(i=1,2,…,n,xi∈Rd,yi∈R)是一个拥有n个训练样本、 每个样本有d个数据样本特征,xi表示第i个样本, 通过K个树的加法函数来预测的最终结果。构成树的集成算法如下
(1)
其中,F表示决策树的函数空间, 为了学习算法中的函数集, 将正则化目标函数定义为
(2)
(3)
(4)
用Ot表示第t棵树的预测值和前t-1棵树预测值之和,即样本xi的最终预测值。求式(4)一阶导数和二阶导数, 分别定义为gi和hi
(5)
(6)
(7)
常数项移除后, 第t次迭代后损失函数为
(8)
定义Ij={i|q(xi)=j}作为叶子节点j的实例集, 根据式(8)得
(9)
(10)
(11)
以上计算了树结构q的分数, 用来衡量树结构的质量, 使用了贪心算法迭代每个叶子节点以添加分支。 假定IL和IR划分后是左右树叶子节点的集合, 即I=IL∪IR,则划分后的损失函数为
(12)
2 CVGS-XGBoost算法
2.1 交叉验证
现实应用中, 实验数据集的获取往往不足, 若单纯地使用验证法选择算法, 则存在如何合理地将实验数据集按比例分割成训练集和验证集的问题。不同的数据集分配方式对算法的最终效果有很大影响[19]。若获取的实验数据集较多, 虽然算法的训练较为充分, 但也会存在算法验证不足的情况。因此为了充分利用实验数据集, 使得算法的训练和验证都较为充分, 可采用交叉验证的方法使算法广泛适用。交叉验证的基本思想是对原始数据样本集进行分组, 大部分作为训练集, 其余的小部分用作验证集。具体地, 先利用大部分训练集对分类算法进行训练, 然后利用剩余的小部分验证集对训练后的算法进行测试, 以此评价分类器的性能。
交叉验证法优化XGBoost算法参数的基本思路:①将实验数据集随机平均分割成k等份(S1,S2, …,Sk), 依次保留其中一份Si作为验证集, 剩下的k-1份作为训练集; ②除去验证集的其他训练集输入XGBoost算法中进行训练, 然后将验证集Si输入当前训练好的算法中, 得到第i次XGBoost算法的评估性能; ③重复步骤①和步骤②, 进行k次后, 将k次XGBoost算法评估的平均值作为当前参数下算法的性能值。用数学语言描述为:设有n个样本量的数据集Dn,A1,A2,…,Ak为数据集Dn的子集, 对于任意子集Ai都有M(Ai)≈n/k,M为第i个子集中样本的个数, 最后的泛化误差估计为
(13)
图1 k折交叉验证实验步骤流程
2.2 栅格搜索
栅格搜索是一种调参手段。在算法的所有候选参数中, 通过循环遍历, 采用岩举的搜索方法,尝试每一种可能性, 对每个参数的可能值列出所有可能的组合,并生成列表,然后训练每个列表组合,使算法表现出最好的效果。即在各个参数数组中找到使算法达最优的参数值。XGBoost算法有许多与数据特征相关的超参数, 这些超参数对算法的训练结果有重要的意义。在XGBoost算法中, max_depth定义树的最大深度, 用于防止过拟合, 深度越深, 算法就越容易产生局部最优; min_child_weight确定孩子节点中最小样本的权重和, 权重和过大可能导致欠拟合; gamma指定了进行分割时所需要的最小损失的减少量, 根据损失函数调整其大小; eta为学习率, 通过减少每一步的权重, 可以提高算法的稳定性。以上参数有的为整数或小数, 有的为随机值或连续值。原始的XGBoost算法在参数值选取时, 通常采取参数遍历和专家经验调参等方式, 此过程不仅耗时, 而且参数之间往往存在制约。不合理的算法超参数会导致XGBoost算法过拟合或欠拟合, 利用栅格搜索可以高效、 准确地优化XGBoost算法的超参数。因此,运用栅格搜索法进行参数选择, 对寻求算法最优参数至关重要。
栅格搜索法优化XGBoost算法参数的基本思路:①利用栅格搜索法找出用于建模的所有可调参数并进行参数组合; ②依次对所有参数组合进行XGBoost算法建模; ③以k折交叉验证法下的建模精度为判断依据得出最佳算法和可调参数。
2.3 CVGS-XGBoost算法的搭建
由于XGBoost算法存在大量的超参数, 寻找最优的算法参数对水体与山体阴影的识别具有重要的作用。XGBoost算法采用栅格搜索寻求最佳参数组合的方法具有良好的全局搜索能力, 可以避免XGBoost算法对多个参数逐个调优导致收敛速度慢的缺点, 同时也避免了参数之间相互制约的影响。交叉验证避免了单纯地使用验证法选择最优算法的偶然性。将交叉验证与栅格搜索相结合应用于XGBoost算法中, 以参数平均误差最小化为最终目标, 提高了参数优选的准确性, 同时避免了训练样本的随机抽样对算法性能的影响。因此本文提出了一种用于水体与山体阴影识别的CVGS-XGBoost算法, 交叉验证栅格搜索优化XGBoost算法流程见图2。具体步骤为:
①对遥感图像从水体、 阴影和其他区域中分别找出能准确代表其典型区域的1 200个像素点用来训练, 利用同样的方法在各典型区域分别找出900个像素点用来测试;
②手动选择的不同样本在各色彩通道下的R、 G、 B特征分量作为样本自身特性分量;
③将步骤①中找出的1 200个种类样本像素数据输入到XGBoost算法中进行预训练, 构建XGBoost预测算法;
图2 交叉验证栅格搜索优化XGBoost算法流程
④将交叉验证栅格搜索应用于XGBoost算法中, 对参数进行栅格搜索, 计算交叉验证均方误差, 确定最优参数组合;
⑤使用步骤④训练好的CVGS-XGBoost算法对未知的900个测试样本进行预测, 得出模型的最佳准确率;
⑥将CVGS-XGBoost算法应用于整个遥感图像中进行分类, 即将遥感图像的每一个像素点输入算法中, 对所有像素做出判断并赋予数值标签;
⑦ 对分类后遥感图像进行可视化操作, 通过像素点的数值标签(黑色代表水体、 灰色代表山体阴影、 其他用白色来显示), 得到最终的分类效果图。
3 实验测试
3.1 实验数据来源
采用广西桂林市的Landsat 8多光谱卫星遥感图像, 该图描述了桂林市区中的水体、 桥体、 山体、 城区建筑等区域。覆盖从红外到可见光不同波长范围, 有7个波段且空间分辨率为30 m的遥感图像, 不同的波段有不同的特点。由于Landsat 8卫星数据可见光波段1~4、 近红外波段5~6之间的相关性较高, 存在很多冗余信息, 如果使用波段1~7的全部数据不仅将导致计算量较大, 而且将引入较大误差。通过计算各波段间相关系数, 选取相关性不显著的7、6、3波段合成假彩色图像, 在减少数据计算量的同时, 提高了计算速度。最后, 通过对假彩色图像进行辐射校正、 几何校正、 采样、 增强、 量化、 去噪等处理, 得到对比度强、 图像清晰的实验图像。
3.2 训练样本获取
训练样本的选取是影响分类器性能的重要因素之一。实验过程中必须保证有足够数量广泛分布的训练样本。根据遥感图像的色调、 形状、 谷歌地图等掌握了研究区域的特征类型, 并手动提取典型区域的训练样本, 在实验图像上记录了1 200个图像像素值作为训练样本集, 其中, 水体、 山体阴影及其他地物这3类样本各400个, 同时用同样的方法分别记录水体、 山体阴影及其他地物3类样本像元所对应的坐标900个作为测试样本集, 用来测试遥感图像分类的效果。选取样本后, 将水体区域归为一类, 山体阴影区域归为一类, 建筑物、 道路、 植被等归为一类, 地物类别标签标记分别记为“0”、“1”、“2”。由于遥感图像中包含的信息相对比较复杂, 所以在选择训练样本时, 优先选择具有代表性的区域。
3.3 颜色特征提取
颜色特征是图像应用研究领域中最广泛的视觉特征。与图像中的其他特征相比, 颜色特征具有很强的稳定性, 它不依赖图像本身的大小, 不随方向和视角的改变而改变。在遥感图像分类中, 颜色特征得到了广泛的应用。本文通过对遥感图像进行人工标注, 将水体标注成红色、 山体阴影标注成黄色、 其他既不属于水体也不属于山体阴影的部分标注成玫红色。将标记的特征坐标与原始遥感图像对应映射, 提取原始图像中标记的所属特征类别的像素值。将7、6、3三个波段合成假彩色的3个通道的像素分量值存放在特征列表中, 作为输入到算法中的假彩色特征数据,再使用XGBoost算法对假彩色特征数据进行分类。训练样本和测试样本标注结果图3。
4 实验结果与分析
文中提出的CVGS-XGBoost算法与各对比算法均使用python 3.6编程实现, 且所有实验均是在Windows 10, 64位操作系统下测试完成。本实验所使用的硬件环境为:CPU:Intel(R)CoreTMi7-6700 CPU@3.40 GHz, 内存8 GB。
4.1 对比算法
为了能更好地评估CVGS-XGBoost算法在本实验中的性能, 与3种传统的机器学习分类算法进行对比分析。具体对比算法详细信息如下:
(1)决策树算法是基于将数据转化为树, 寻找最佳节点和最佳分枝的方法, 衡量“最佳”的标准称为“不纯度”。一般来说, “不纯度”值越小, 决策树对训练集的拟合效果越好。本文利用信息熵来确定树中各节点的“不纯度”, 并选择最好的随机切分作为分裂节点的策略, 指定随机数生成器的种子为25, 通过十折交叉验证栅格搜索的方法, 得出当树的最大深度取值为8, 分裂1个内部节点最少样本数为8, 每个叶子节点最少样本数为3时, 决策树算法效果达到最优, 分类效果最好。
(2)随机森林是一种基于决策树的集成算法, 它利用Bootstrap从原始样本中抽取多个样本子集, 利用得到的样本子集建立决策树。该方法综合考虑多个评估器的建模结果, 平均投票或多数投票原则用于确定综合评估师的结果, 以获得比单一算法更好的分类性能。本文实验中采用信息熵方法判断节点是否继续分裂, 并选择有放回的采样。通过学习曲线描述的结果, 得到使算法达到最优时树的数目为30, 采用十折交叉验证栅格搜索方法, 确定当树的最大深度为5, 分裂内部节点需要的最少样例数为2, 叶子上的最少样例数为1, 随机生成器种子设定为25时, 算法达到最优。
图3 不同样本集标注效果图
(3)支持向量机的基本思想是在数据空间中找出一个超平面作为决策边界, 以便对数据算法的分类误差尽可能小,特别是分类错误(泛化误差)未知的数据集尽可能小。支持向量机通过找出边际最大的决策边界, 对数据进行分类,其决策函数公式为
(14)
其中:αi为拉格朗日乘子;yi为超平面上的样本点;b表示偏移量;φ(xi)和φ(xtest)分别表示第i个特征向量和测试样本从输出空间到特征空间的映射。 在本文实验中,选取径向基核函数(RBF)作为支持向量机的类型,公式为
K(xi,xj)=exp(-gamma‖xi-xj‖2)。
其中:xi、xj分别表示向量样本;gamma为核参数。为调节优化方向中的间隔大小和分类准确度偏好的权重,即对误差的宽容度, 规定了一个惩罚系数C。 在调参过程中, 对gamma和惩罚系数C分别绘制学习曲线, 得出当gamma取值为30,C取值为110时, 算法效果达到最好。
4.2 评价指标
衡量提取效果的指标有单模式分类精度和总体分类精度。单模式分类精度等于各类样本分类正确的像元数与该类样本总数的比值。总体分类精度(OA)为分类正确的数据样本个数与所有数据样本个数的比例, 表述对每一个随机样本所分类的结果与真实数据所对应区域的实际类型相一致的概率,其计算公式为
(15)
式中:xkk为沿着对角线上的类型组合的数量;N为单元格的总数量。
4.3 算法对比
图4为算法分类效果图, 通过构造CVGS-XGBoost算法对数据集进行训练, 每次迭代选择基于二叉决策树的算法。使用十折交叉验证的方法对参数进行栅格搜索以获得超参数的最佳组合, 由此得出当估计器的数量为30, 树的最大深度为5, 学习率为0.01, 正则化项系数为1, 惩罚项系数为0.3时, 算法效果达到最好, 最小叶子节点样本权重和为1时, 避免了算法学习到局部的特殊样本, 防止算法过拟合, 调参后得到如图4f所示的提取结果。
图4 算法分类效果图
从图4b中可以看出, 使用原始的XGBoost算法进行水体提取时, 通过验证法确定算法中的每个参数值, 得出当估计器的数量为25, 树的最大深度为5, 学习率为0.01, 正则化系数为1, 惩罚项系数为0.2时, 算法达最优效果。该算法能有效提取出水体, 结果相对其他3种机器学习算法而言较理想, 能准确地得到水体和山体阴影的分类结果。但调参过程中, 受到参数之间的相互制约, 分类效果差于CVGS-XGBoost算法, 并且通过参数遍历和经验调参, 在参数选择方面需花费大量的时间, 运行速度相当缓慢。
使用决策树进行分类的效果存在大量的噪声。从图4c中可以看出,大量灰度值较高的山体阴影被错误地划分成了水体,导致山体阴影存在大量漏提, 水体部分被误提的情况, 而图中灰度值接近于山体阴影的其他部分被错误地划分成了山体阴影, 细小的河流分支几乎没有被提取出来, 总体分类精度不高, 分类效果不明显。随机森林是多个决策树评估器的建模结果, 从图4d的整体效果上看, 分类结果相比决策树而言要好得多, 虽然被误提的情况大大减少了, 部分细小河流被提取了出来, 但仍然存在部分水体和山体阴影被错误划分和漏提的现象。从图4e支持向量机的分类结果上看, 基本上能将水体与山体阴影识别出来, 噪声明显减少, 大部分细小河流被提取出来, 只存在少部分错分漏分的情况, 总体分类精度明显比决策树和随机森林高, 但其运行时间相当缓慢。
对比原始的XGBoost, CVGS-XGBoost算法能够快速、 准确、 有效地提取出水体信息(图4f), 而且其提取总体分类效果明显比其他3种算法好, 水体和山体阴影都被准确地识别了出来, 误提和漏误的情况明显减少, 细小河流和农田都能够准确地识别, 是一种优于其他机器学习的集成算法。
选取广西桂林山区地形的遥感图像, 应用本文算法对水体与山体阴影信息进行有效提取。随机抽取一小块150×150的子区域进行可视化, 该区域内包含水体、山体阴影和其他物体, 将提取出来的特征向量输入到已训练好的CVGS-XGBoost算法、 原始的XGBoost算法和3种机器学习算法中进行预测,进行可视化后的各种算法的效果图如图5所示。
对整个遥感图像的各算法提取目标地物的单模式分类精度和总体分类精度的评估结果以及算法的训练时间如表1所示。可以看出, 本文的CVGS-XGBoost算法的总体分类精度最高,达到了93.9%, 比原始的XGBoost算法提高了1.5%, 比决策树提高了10%, 而与较为先进的随机森林和支持向量机算法相比, 也分别提高了6.3%和3.1%。由此可见, CVGS-XGBoost算法在数据集上的分类效果上好于其他算法。在训练时间方面,在数据集不变的情况下, CVGS-XGBoost算法要远远低于支持向量机。综上所述, CVGS-XGBoost算法不仅在准确率上优于其他算法, 而且在效率上也远高于分类效果较好的支持向量机。
表1 分类算法分类精度评估结果和训练时间
5 结束语
本文通过改进XGBoost算法,提出CVGS-XGBoost算法, 将Landsat多光谱卫星遥感图像的7、6、3三个波段构成假彩色特征作为算法的输入特征, 利用算法提取水体和山体阴影信息。所提出的算法有以下两个优点:(1)CVGS-XGBoost算法在传统的XGBoost算法的基础上引入交叉验证, 避免了算法验证不足和仅通过一次数据集的划分来确定最优算法的偶然性; (2)XGBoost算法通过引入栅格搜索构建CVGS-XGBoost算法寻求超参数的方式, 不仅在寻求最佳参数组合上具有良好的全局搜索能力, 而且能有效地避免原始XGBoost算法对多个参数逐个调优导致收敛速度慢的缺点, 同时也避免了参数之间的相互制约。
图5 局部图像算法分类效果图
基于单模式分类精度、 总体分类精度指标和算法训练时间, 与原始的XGBoost算法、 决策树算法、 随机森林算法和支持向量机等算法进行对比结果表明, CVGS-XGBoost算法在数据集上的分类效果上好于其他算法。在训练算法时, CVGS-XGBoost算法要比支持向量机更加高效, 运行时间更短。同时, CVGS-XGBoost算法避免了小支流和图像相似灰度值的干扰, 具有较高的可靠性。下一步工作将提取遥感图像中包含的更有效信息的特征, 以降低遥感图像在进行分类时产生的误提取和漏提取的可能性, 进一步优化提取结果。