我正在尝试使用libSVM
库对卫星图像进行分类。我想要的是显示分类图像并保存它,而不仅仅是在我的终端上获得准确的结果。我已经从训练数据集(如下所示)中提取了像素值,并使用脚本csv2libsvm
(https://github.com/zygmuntz/phraug/blob/master/csv2libsvm.py)将我的数据以正确的格式用于libsvm
. 图像中有 4 个不同的类要分类。我的卫星图像和训练数据如下所示。
我遵循的步骤基于以下教程https://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.pdf。
拆分训练和测试数据(70% 训练和 30% 测试)。
svm - subset.py 数据集 12000 training.tr testing.te
训练模型
svm-train training.tr
做出预测
svm-predict testing.te training.tr.model 分类输出
这个分类的准确率是95%,非常棒。
我现在真正感兴趣的是显示分类图像。所以,我需要从包含分类标签的 csv 文件中构建我的分类图像。这就是问题所在,不知道该怎么做。我所做的(但没有工作)如下:
我将生成的 csv 文件导入
lbSVM
到python
usingcsv
模块中。我试图将 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 的选项,但它没有。
我将不胜感激任何帮助、建议或提示