如何使用Python

时间:2017-04-10 19:29:24

标签: 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模型?训练模型比手动创建矢量数据有更简单的方法吗?在这种情况下我们该怎么做?

说实话,我有点困惑。我将不胜感激任何帮助

2 个答案:

答案 0 :(得分:10)

这是一个完整的例子,可以让你走上正确的轨道。为简单起见,我们假设您的目标是将下面三波段图像上的像素分为三个不同的类别,即建筑物,植被和水。这些类别将分别以红色,绿色和蓝色显示。

New York

我们首先阅读图像并定义稍后将使用的一些变量。

import numpy as np
from skimage import io

img = io.imread('https://i.stack.imgur.com/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

监督分类

或者,您可以为已知类的某些像素指定标签(标记像素集通常称为地面实况)。在这个玩具示例中,基本事实由三个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']

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

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分类器的参数可以显着提高精度。通过扩大和改进基础事实可以实现进一步的改进,因为列车/测试比率非常小并且红色和绿色补丁实际上包含不同类别的像素。最后,人们可以合理地期望利用更复杂的特征,例如根据强度等级计算的比率或指数(例如NDVI)将提高性能。

答案 1 :(得分:1)

我的解决方案: -

手动处理: -

如果数据集的大小很小,您可以手动创建矢量数据(当您自己创建时也是可靠的)。如果不是,则应用SVM来对图像进行分类是非常困难的。

自动处理: -

第1步: -

您可以使用“无监督图像聚类”技术将图像分组为这4个类别,然后在聚类完成后将图像从1到4标记。 (例如,K-Means聚类算法)

第2步: -

目前,您正在拥有标记图像的数据集。将它们分成训练测试数据。

第3步: -

现在应用SVM对测试图像进​​行分类并找出模型的准确性。