下一章 上一章 目录 设置
6、六识 第一节监督 ...
-
第一节监督分类
Earth Engine 中监督分类的总体方法总结如下:
1.找个场景。
2.收集训练数据。
3.使用训练数据选择并训练分类器。
4.使用选定的分类器对图像进行分类。
我们将首先根据清晰的陆地卫星图像手动创建训练数据。复制下面的代码块来定义你的 Landsat 8场景变量并将其添加到地图中。我们将使用意大利米兰的一个点作为图像分类区域的中心。
// Create an Earth Engine Point object over Milan.
var pt=ee.Geometry.Point([9.453, 45.424]);
// Filter the Landsat 8 collection and select the least cloudy image.
var landsat=ee.ImageCollection(\'LANDSAT/LC08/C02/T1_L2\')
.filterBounds(pt)
.filterDate(\'2019-01-01\', \'2020-01-01\')
.sort(\'CLOUD_COVER\')
.first();
// Center the map on that image.
Map.centerObject(landsat, 8);
// Add Landsat image to the map.
var visParams={
bands: [\'SR_B4\', \'SR_B3\', \'SR_B2\'],
min: 7000,
max: 12000
};
Map.addLayer(landsat, visParams, \'Landsat 8 image\');
使用几何工具,我们将在 Landsat 图像上创建代表感兴趣的土地覆盖类别的点,以用作我们的训练数据。我们需要做两件事:(1)确定每个土地覆盖在地面上的位置,(2)用正确的类别编号标记点。对于本练习,我们将使用下面中所示的类和代码。
土地覆盖类别
森林0
城市1
水2
草本3
在几何工具中,单击标记选项。这将创建一个点几何图形,该几何图形将显示为名“geometry”的导入。单击齿轮图标可配置此导入。
我们将从收集森林点开始,因此将导入森林命名为。将其导入为FeatureCollection ,然后单击+ Property。将新属性命名为“class”并为其指定值0。我们还可以选择一种颜色来代表这个类。对于森林类来说,选择绿色是很自然的。你可以通过单击选择你喜欢的颜色,或者为了进行更多控制,你可以使用十六进制值。
十六进制值在整个数字世界中用于表示计算机和操作系统中的特定颜色。它们由分成三对的六个值指定,其中红色、绿色和蓝色亮度值各一对。如果你不熟悉十六进制值,请想象一下颜色是以 10基数对而不是16基数对指定的。在这种情况下,明亮的纯红色值将是“990000”;明亮的纯绿色值为“009900”;明亮的纯蓝色值为“000099”。像“501263”这样的值将是三种颜色的混合,不是特别亮,蓝色和红色的数量大致相等,绿色的数量要少得多:一种带有紫色阴影的颜色。
编辑几何图层属性
现在,在Geometry Imports中,我们将看到导入已重命名为Forest。单击它激活绘图模式以开始收集森林点。
激活森林层开始采集
现在,开始在森林地区收集点。根据需要放大和缩小。你可以使用卫星底图来帮助你,但收集的基础应该是 Landsat 图像。请记住,你收集的分数越多,分类器从你提供的信息中学到的信息就越多。现在,我们设定一个目标,完成后,单击“点绘制”旁边的“退出”
通过创建新层对其他类重复相同的过程。不要忘记使用上面提到的FeatureCollection选项进行导入。对于发达,在城市地区收集积分。对于水类,收集利古里亚海的点,并寻找其他水体,例如河流。对于草本类,在农田收集分数。请记住将每个类的“class”属性设置为其相应的代码,然后单击“退出”一旦你完成上述每个班级的积分收集。我们将为其他类别使用以下十六进制颜色:#FF0000 代表开发的,#1A11FF 代表水,#D0741E 代表草本。
你现在应该有四个FeatureCollection 导入,分别命名为forest 、developed 、water和herbaceous 。
下一步是将所有训练特征集合合并为一个。复制并粘贴下面的代码,将它们合并到一个名为trainingFeatures的FeatureCollection中。
在这里,我们使用flatten 方法来避免拥有特征集合的集合- 我们希望在我们的FeatureCollection中包含单独的特征。加上flatten是一个集合,不加是里面包括了三个数据集。
// Combine training feature collections.
var trainingFeatures=ee.FeatureCollection([
forest, developed, water, herbaceous
]).flatten();
注意:或者,你可以使用一组现有的参考数据。例如,欧洲航天局 (ESA) WorldCover数据集是源自 ESA 分辨率10m 的 Sentinel-2图像的全球土地利用和土地覆盖地图。使用现有数据集,我们可以在分类为感兴趣类别的像素上随机放置点(如果你好奇,可以浏览 Earth Engine 文档以了解ee.Image.stratifiedSample 和ee.FeatureCollection.randomPoints 方法)。缺点是这些全球数据集并不总是包含你所在地区感兴趣的特定类别,或者在本地范围内可能不完全准确。另一种选择是使用在现场收集的样本(例如,GPS 点)。
在组合的FeatureCollection中,每个特征点应该有一个名为“class”的属性。类值是从0到 3 的连续整数(你可以通过打印trainingFeatures 并检查特征的属性来验证这是否正确)。
现在我们有了训练点,复制并粘贴下面的代码以提取每个点位置处每个类别的波段信息。首先,我们定义预测波段,以从每个类别的不同波段中提取不同的光谱和热信息。然后,我们使用sampleRegions 方法从Landsat图像中每个点位置的信息进行采样。
此方法需要有关FeatureCollection (我们的参考点)、要提取的属性(“类”)和像素比例(以米为单位)的信息。
// Define prediction bands.
var predictionBands=[
\'SR_B1\', \'SR_B2\', \'SR_B3\', \'SR_B4\', \'SR_B5\', \'SR_B6\', \'SR_B7\',
\'ST_B10\'
];
// Sample training points.
var classifierTraining=landsat.select(predictionBands)
.sampleRegions({
collection: trainingFeatures,
properties: [\'class\'],
scale: 30
});
你可以通过打印并扩展第一个特征来检查classifierTraining对象是否 提取了感兴趣的属性。你应该看到频段和类别信息(图 F2.1.9)。
现在我们可以选择一个分类器。分类器的选择并不总是显而易见的,并且有很多选项可供选择- 你可以快速扩展ee文档下的分类器对象可了解我们有多少种图像分类选项。因此,我们将测试不同的分类器并比较它们的结果。我们将从分类与回归树 (CART) 分类器开始,这是一种已经存在了数十年的著名分类算法。
复制并粘贴以下代码以实例化 CART 分类器(例如Classifier.smileCart)并对其进行训练。
//////////////// CART Classifier ///////////////////
// Train a CART Classifier.
var classifier=ee.Classifier.smileCart().train({
features: classifierTraining,
classProperty: \'class\',
inputProperties: predictionBands
});
本质上,分类器包含将标签链接到光谱信息的数学规则。如果打印变量分类器并展开其属性,则可以确认对象的基本特征(带、属性和正在使用的分类器)。如果你打印分类器。解释一下,你可以找到一个名为“树”的属性,其中包含决策规则。
训练分类器后,复制并粘贴以下代码以对 Landsat 图像进行分类并将其添加到 Map中。
// Classify the Landsat image.
var classified=landsat.select(predictionBands).classify(classifier);
// Define classification image visualization parameters.
var classificationVis={
min: 0,
max: 3,
palette: [\'589400\', \'ff0000\', \'1a11ff\', \'d0741e\']
};
// Add the classified image to the map.
Map.addLayer(classified, classificationVis, \'CART classified\');
请注意,在可视化参数中,我们定义了一个调色板参数,在本例中该参数表示每个像素值(0-3,我们的类代码)的颜色。我们使用为每个类别创建训练点时使用的相同的十六进制颜色。这样,我们可以在Map中可视化分类图像时将颜色与类相关联。
检查结果:激活Landsat 复合图层和卫星底图以与分类影像叠加(图F2.1.11)。更改图层的透明度以检查某些区域。你注意到什么?在某些领域,结果可能看起来不太令人满意(例如,发达类和草本类之间的混淆)。
有一些选项可以处理错误分类错误:
?收集更多的训练数据我们可以尝试合并更多的点以获得更具代表性的课程样本。
?调整模型分类器通常具有“超参数”,这些参数被设置为默认值。例如,在分类树的情况下,有多种方法可以调整树中叶子的数量。
?尝试其他分类器如果某个分类器的结果不令人满意,我们可以尝试 Earth Engine 中的其他一些分类器,看看结果是否更好或不同。
?扩展收集位置收集整个图像上的点而不是只关注一个位置是一种很好的做法。另外,寻找显示变异性的同一类别的像素(例如,对于发达类别,建筑物屋顶看起来与房屋屋顶不同;对于草本类别,农田显示出独特的季节性/物候)。
?添加更多预测变量我们可以尝试向输入变量添加谱索引;通过这种方式,我们可以向分类器提供有关每个类别的新的、独特的信息。例如,专门用于检测植被健康状况的植被指数(例如,NDVI)很有可能会改进发达的草本分类。
现在,我们将尝试另一种广泛使用的监督学习分类器:随机森林(RF)。RF 算法(Breiman 2001,Pal 2005 建立在决策树的概念之上,但添加了策略以使其更加强大。它被称为“森林”,因为它通过构建大量决策树来运作。如前所述,决策树创建用于做出决策的规则。随机森林将随机选择特征并进行观察,构建决策树森林,然后使用完整的树集来估计类别。当你对训练数据没有太多了解时,这是一个不错的选择。
复制并粘贴下面的代码来训练 RF 分类器 (ee.Classifier.smileRandomForest )并将分类器应用到图像。RF 算法需要构建树的数量作为其参数。我们将使用50棵树。
/////////////// Random Forest Classifier /////////////////////
// Train RF classifier.
var RFclassifier=ee.Classifier.smileRandomForest(50).train({
features: classifierTraining,
classProperty: \'class\',
inputProperties: predictionBands
});
// Classify Landsat image.
var RFclassified=landsat.select(predictionBands).classify(
RFclassifier);
// Add classified image to the map.
Map.addLayer(RFclassified, classificationVis,\'RF classified\');
请注意,在ee中。Classifier.smileRandomForest 文档(Docs 选项卡)中,有一个种子(随机数)参数。设置种子可以让你在每次运行模型时准确地复制模型。
第 2 节.无监督分类
在无监督分类中,我们有与监督分类相反的过程。首先对光谱类别进行分组,然后将其分类为簇。因此,在 Earth Engine 中,这些分类器是ee 聚类对象。它们是“自学”算法,不使用一组标记的训练数据(即,它们是“无监督的”)。你可以将其视为执行一项你以前从未经历过的任务,首先收集尽可能多的信息。例如,想象一下在不了解基本语法的情况下学习一种新语言,仅通过观看该语言的电视剧、听示例和寻找模式来学习。
与监督分类类似,Earth Engine 中的无监督分类具有以下工作流程:
1.组装具有数字属性的特征,以在其中查找聚类(训练数据)。
2.选择并实例化集群器。
3.使用训练数据训练聚类器。
4.将聚类器应用到场景中(分类)。
5.标记簇。
为了生成训练数据,我们将使用样本方法,该方法从一个区域中随机抽取样本(与从预定义位置抽取样本的sampleRegions不同)。我们将通过调用几何方法使用图像的足迹作为区域。此外,我们将定义要采样的像素数 (numPixels)(在本例中为1000个像素),并将tileScale定义为8,以避免由于区域大小而导致的计算错误。复制并粘贴以下代码以从 Landsat 图像中采样1000个像素。你应该添加到与之前相同的脚本中,以在最后比较监督分类结果与非监督分类结果。
//////////////// Unsupervised classification ////////////////
// Make the training dataset.
var training=landsat.sample({
region: landsat.geometry(),
scale: 30,
numPixels: 1000,
tileScale: 8
});
现在我们可以实例化一个集群器并训练它。与有监督算法一样,有许多无监督算法可供选择。我们将使用k均值聚类算法,这是遥感中常用的方法。该算法通过使用迭代重组策略来识别光谱空间(图像 x 波段)中彼此靠近的像素组。我们定义多个簇k,然后该方法将该数量的种子点随机分布到谱空间中。然后将大量像素样本分组为其最接近的种子,并计算该组的平均光谱值。该平均值类似于点的质心,称为质心。每次迭代都会重新计算类均值并根据新均值对像素进行重新分类。重复此过程,直到质心保持相对稳定,并且在后续迭代中只有少数像素在不同类之间发生变化。
复制并粘贴以下代码以请求四个c簇,与监督分类的数量相同,以便直接比较它们。
// Instantiate the clusterer and train it.
var clusterer=ee.Clusterer.wekaKMeans(4).train(training);
现在复制并粘贴以下代码,将聚类器应用到图像,并将生成的分类添加到地图请注意,我们使用一种名为randomVisualizer 的方法来为可视化分配颜色。我们不会将无监督类别与我们之前在监督分类中定义的调色板相关联。相反,我们为这些类分配随机颜色,因为我们还不知道哪个无监督类最适合每个指定类(例如,forest 、herbaceous)。
// Cluster the input using the trained clusterer.
var Kclassified=landsat.cluster(clusterer);
// Display the clusters with random colors.
Map.addLayer(Kclassified.randomVisualizer(),{},
\'K-means classified - random colors\');
检查结果。这个分类与之前的分类相比如何?如果愿意,请使用检查器检查为每个像素值(“簇”带)分配了哪些类,并更改代码的最后一行以应用用于监督分类结果的相同调色板(有关示例,请参阅下面的代码检查点)。