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

Joh*_*hny 2 python machine-learning svm k-means scikit-learn

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

在我的情况下,我必须训练在城市区域捕获的SAR卫星图像,我需要对城市区域,道路,河流和植被进行分类(4级).这个图像有两个波段但我没有我想要预测的每个类的标签数据,例如Iris数据.

所以,我的问题是,我是否必须手动创建矢量数据(对于4个类)才能训练SVM模型?训练模型比手动创建矢量数据有更简单的方法吗?在这种情况下我们该怎么做?

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

Ton*_*has 11

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

纽约

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]])
Run Code Online (Sandbox Code Playgroud)

这些类别将分别以蓝色,红色和绿色显示.

无监督分类

如果您不希望手动标记某些像素,则需要检测数据的基础结构,即必须将图像像素拆分为n_classes分区,例如通过k-means聚类:

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])
Run Code Online (Sandbox Code Playgroud)

无监督分类

监督分类

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

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

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])
Run Code Online (Sandbox Code Playgroud)

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

监督分类

最后的评论

结果似乎表明,无监督分类比其监督对应更准确.然而,监督分类通常优于无监督分类.值得注意的是,在分析的示例中,通过调整SVM分类器的参数可以显着提高精度.通过扩大和改进基础事实可以实现进一步的改进,因为列车/测试比率非常小并且红色和绿色补丁可能包含不同类别的像素.最后,可以合理地预期利用更复杂的特征,例如从强度水平(例如NDVI)计算的比率或指数将提高性能.

  • 这是对我的问题非常完整而有趣的答案.你让我走上了正确的轨道.谢谢你的回答,我很感激. (2认同)