Использование инструмента libSVM для выполнения мультиклассовой классификации
Я пытаюсь выполнить классификацию на спутниковом изображении, используя libSVM
библиотека. Я хочу показать классифицированное изображение и сохранить его, а не только для получения точных результатов на моем терминале. Я извлек значения пикселей из обучающих наборов данных (показанных ниже) и использовал скрипт csv2libsvm
( https://github.com/zygmuntz/phraug/blob/master/csv2libsvm.py), чтобы привести мои данные в правильный формат для libsvm
, На изображении 4 класса для классификации. Мое спутниковое изображение и тренировочные данные показаны ниже.
рис 1: изображение, которое будет классифицировано с данными обучения.
Шаги, которые я выполнил, основаны на следующем учебнике 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 -gnt testing.te training.tr.model
Точность этой классификации составила 95%, что было здорово.
Что меня сейчас действительно интересует, так это отображение классифицированного изображения. Итак, мне нужно создать мое классифицированное изображение из файла CSV, который содержит классифицированные метки. Это где проблема приходит и не знаю, как это сделать. Что я сделал (и не сработал):
Я импортировал файл CSV, созданный
lbSVM
вpython
с помощьюcsv
модуль.Я пытался изменить файл 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, но это не так.
Буду признателен за любую помощь, мысли или советы