python - 如何使用 Python 在卫星图像上训练 SVM 分类器

标签 python machine-learning scikit-learn svm k-means

我正在使用 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 np
from skimage import io

img = io.imread('/image/TFOv7.png')

rows, cols, bands = img.shape
classes = {'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 clustering :

from sklearn.cluster import KMeans

X = 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])

unsupervised classification

监督分类

或者,您可以将标签分配给一些已知类别的像素(带标签的像素集通常称为 ground truth)。在这个玩具示例中,ground truth 由三个 20×20 像素的硬编码正方形区域组成,如下图所示:

ground truth

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']

ground truth(训练集)的像素用于拟合支持向量机。

y = supervised.ravel()
train = np.flatnonzero(supervised < n_classes)
test = np.flatnonzero(supervised == n_classes)

from sklearn.svm import SVC

clf = SVC(gamma='auto')
clf.fit(X[train], y[train])
y[test] = clf.predict(X[test])
supervised = y.reshape(rows, cols)

io.imshow(palette[supervised])

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

supervised classification

结语

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

关于python - 如何使用 Python 在卫星图像上训练 SVM 分类器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43331510/

相关文章:

python - Windows 文件名在 Linux 中显示损坏的字符

python - 生成具有连续值的变量

machine-learning - 如何使用 sklearn 模型对新观察结果进行预测?

python - 使用 scikit learn 检索错误分类的文档

python-2.7 - 如何在 scikit_learn 中的 KFold 中使用 shuffle

python - 将 PCA 应用于 Scikit-learn 中的新数据

python : ZeroDivisionError: float division by zero

python - 在 Heroku 上托管的 Flask 应用程序中渲染 Bokeh 图

python - 输入层的形状

python - Tensorflow 分层样本错误