1

我正在尝试使用libSVM库对卫星图像进行分类。我想要的是显示分类图像并保存它,而不仅仅是在我的终端上获得准确的结果。我已经从训练数据集(如下所示)中提取了像素值,并使用脚本csv2libsvmhttps://github.com/zygmuntz/phraug/blob/master/csv2libsvm.py)将我的数据以正确的格式用于libsvm. 图像中有 4 个不同的类要分类。我的卫星图像和训练数据如下所示。

在此处输入图像描述 图 1:要使用训练数据进行分类的图像。

我遵循的步骤基于以下教程https://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.pdf

  1. 拆分训练和测试数据(70% 训练和 30% 测试)。

    svm - subset.py 数据集 12000 training.tr testing.te

  2. 训练模型

    svm-train training.tr

  3. 做出预测

    svm-predict testing.te training.tr.model 分类输出

这个分类的准确率是95%,非常棒。

我现在真正感兴趣的是显示分类图像。所以,我需要从包含分类标签的 csv 文件中构建我的分类图像。这就是问题所在,不知道该怎么做。我所做的(但没有工作)如下:

  1. 我将生成的 csv 文件导入lbSVMpythonusingcsv模块中。

  2. 我试图将 csv 文件重塑为我的图像的形状

我的代码如下所示:

with open('/home/io/Desktop/training/1TESTING/libSVM_classification/classification_results', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=' ')
    results = []
    for row in reader:
        results.append(row)
    
results_arr = np.asarray(results, dtype=int) 
predicted = results_arr[results_arr>0] #here is my predicted labels

#load the image to be classified and read the projection system
raster_dataset = gdal.Open(sea_ice, gdal.GA_ReadOnly)
geo_transform = raster_dataset.GetGeoTransform()
proj = raster_dataset.GetProjectionRef()

#loop over all bands of the image and append them.
bands_data = []
for b in range(1, raster_dataset.RasterCount+1):
    band = raster_dataset.GetRasterBand(b)
    bands_data.append(band.ReadAsArray())

bands_data = np.dstack(bands_data)
row, col, n_bands = bands_data.shape

#get the classified labels from libsvm and reshape them into the initial image
#in order to display it using matplotlib
class_prediction = predicted.reshape(bands_data[:, :, 0].shape)

要分类的图像大小为(303 x 498),生成的预测类别大小libsvm为 1807。因此,我在尝试重塑libsvm结果时得到的错误,我得到以下错误。

ValueError: cannot reshape array of size 1807 into shape (303,498)

这个错误是有道理的。我有 1907 行并尝试对其进行重塑以匹配我的初始图像,这显然是不可能的。

那么,如何显示我的分类图像?我达到了 95% 的准确率,但还没有找到查看分类结果的方法。我虽然libsvm可能有一个将分类结果导出到 tiff 的选项,但它没有。

我将不胜感激任何帮助、建议或提示

4

0 回答 0