如何使用Python对卫星图像进行SVM分类器训练

我正在使用scikit-learn库对卫星图像进行监督分类(支持向量机分类器)。我的主要问题是如何训练我的SVM分类器。我在YouTube上观看了许多视频,并阅读了一些关于如何在scikit-learn中训练SVM模型的教程。所有我看过的教程都使用了著名的Iris数据集。为了在scikit-learn中进行监督的SVM分类,我们需要有标签。对于Iris数据集,我们有Iris.target,这是我们试图预测的标签(’setosa’, ‘versicolor’, ‘virginica’)。通过阅读scikit-learn的文档,训练过程非常简单明了。

在我的案例中,我需要训练一张在城市区域上空捕获的SAR卫星图像,并且需要对城市区域、道路、河流和植被(4个类别)进行分类。这张图像有两个波段,但我没有像Iris数据那样的每个类别的标签数据。

所以,我的疑问是,是否必须手动创建向量数据(针对4个类别)来训练SVM模型?有没有比手动创建向量数据更简单的方法来训练模型?在这种情况下我们该怎么做?

说实话,我有点困惑。我会很感激任何帮助


回答:

这里有一个完整的示例,应该可以帮助你走上正轨。为了简单起见,我们假设你的目标是对下面的三波段图像上的像素进行分类,分类为建筑、植被和水体三种不同类别。这些类别将分别以红色、绿色和蓝色显示。

New York

我们从读取图像并定义一些稍后将使用的变量开始。

import numpy as npfrom skimage import ioimg = io.imread('https://i.sstatic.net/TFOv7.png')rows, cols, bands = img.shapeclasses = {'building': 0, 'vegetation': 1, 'water': 2}n_classes = len(classes)palette = np.uint8([[255, 0, 0], [0, 255, 0], [0, 0, 255]])

无监督分类

如果你不想手动标记一些像素,那么你需要检测数据的底层结构,即你必须将图像像素分成n_classes个分区,例如通过k-means聚类

from sklearn.cluster import KMeansX = img.reshape(rows*cols, bands)kmeans = KMeans(n_clusters=n_classes, random_state=3).fit(X)unsupervised = kmeans.labels_.reshape(rows, cols)io.imshow(palette[unsupervised])

无监督分类

监督分类

或者,你可以为一些已知类别的像素分配标签(通常称为地面真实数据的标记像素集)。在这个示例中,地面真实数据由三个硬编码的20×20像素的方形区域组成,如下图所示:

地面真实数据

supervised = n_classes*np.ones(shape=(rows, cols), dtype=np.int)supervised[200:220, 150:170] = classes['building']supervised[40:60, 40:60] = classes['vegetation']supervised[100:120, 200:220] = classes['water']

地面真实数据(训练集)的像素用于拟合支持向量机。

y = supervised.ravel()train = np.flatnonzero(supervised < n_classes)test = np.flatnonzero(supervised == n_classes)from sklearn.svm import SVCclf = SVC(gamma='auto')clf.fit(X[train], y[train])y[test] = clf.predict(X[test])supervised = y.reshape(rows, cols)io.imshow(palette[supervised])

在训练阶段之后,分类器为剩余的像素(测试集)分配类别标签。分类结果如下所示:

监督分类

最后的评论

结果似乎表明无监督分类比其监督分类更准确。然而,监督分类通常表现优于无监督分类。重要的是要注意,在分析的示例中,通过调整SVM分类器的参数,可以显著提高准确性。通过扩大和细化地面真实数据,可以进一步提高性能,因为训练/测试比例非常小,红色和绿色补丁实际上包含不同类别的像素。最后,可以合理地期望,使用更复杂的特征,如从强度水平计算的比率或指数(例如NDVI)将提升性能。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注