В этой короткой статье мы увидим, как легко обучить и применить классификатор сегментации изображений к проблеме гиперспектральной визуализации без установки какого-либо программного обеспечения. Все шаги можно выполнить с помощью этого простого блокнота на Python.

В предыдущем посте мы увидели, как эффективно выполнять гиперспектральный анализ изображений с помощью блокнота Python для управления и визуализации кубов HSI, хранящихся в облаке. Теперь мы увидим, как использовать аннотированные данные для создания модели прогнозирования путем обучения классификатора.

Набор данных

В качестве примера мы будем использовать набор данных гиперспектральных изображений Indian Pines (IP), широко используемый в качестве эталона в исследованиях в этой области. Он был получен с помощью датчика AVIRIS на полигоне Indian Pines в северо-западной Индиане и состоит из 145x145 пикселей и 200 спектральных каналов. На следующем рисунке показаны некоторые случайные полосы.

Набор данных поставляется с аннотациями, соответствующими 16 различным категориям, связанным с использованием земли. На следующем рисунке показано изображение с областями этих категорий, изображенными разными цветами.

В следующей таблице показаны названия и количество образцов каждой категории.

Как видим, количество выборок из одной категории в другую не сбалансировано. Некоторые категории имеют большое количество образцов, в то время как другие имеют очень мало. Это частая проблема с наборами данных.

Добавляем еще одну метку для неаннотированных пикселей, не принадлежащих ни к одной категории (черная область на изображении).

Здесь мы будем рассматривать набор данных как массив выборок X, каждая выборка представляет пиксель вектором из 200 компонентов, соответствующих спектральным откликам в этой точке. Кроме того, у нас будет массив аннотаций y со скалярным значением от 0 до 16, предоставляющих категорию каждого пикселя, как определено в истине.

Анализ избыточности с помощью PCA

Большинство поверхностей демонстрируют отражающие свойства, плавные в зависимости от длины волны. С 200 спектральными полосами, измеренными в плотном спектральном диапазоне в видимом и ближнем инфракрасном диапазонах, в наборе данных IP следует ожидать сильных корреляций между полосами, которые близки в спектре, то есть с близкими значениями длины волны.

Поэтому хорошей отправной точкой является визуализация избыточности в доступных данных (наш вектор X) с помощью декомпозиции PCA.

pca = PCA(); pcX = pca.fit_transform(X)
ev=pca.explained_variance_ratio_ ; cumulativeVar = np.cumsum(ev)
plt.plot(cumulativeVar)

Кривая показывает, что практически вся дисперсия в наборе данных IP объясняется первыми 40 главными компонентами. Остальные, вероятно, содержат в основном шум.

Мы также можем визуализировать первые главные компоненты, полученные из исходных спектральных диапазонов.

Как и следовало ожидать, компоненты, отвечающие за все более низкие значения дисперсии, кажутся все более и более шумными.

Обучение и тестирование модели

Подготовка данных и предварительная обработка

Чтобы обучить модель, мы должны разделить доступные данные на набор для обучения и набор для проверки. Это необходимо для получения надежной оценки производительности нашего классификатора и выявления любых проблем с переоснащением. Разделить набор данных так же просто, как

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=11, stratify=y)

переменная random_state устанавливает начальное число, которое случайным образом разбивает данные. В то время как выборка рамдона сводит к минимуму риск систематической ошибки, возможность установить начальное значение означает, что мы можем повторить эксперимент с теми же обучающими и тестовыми наборами. Это облегчает воспроизводимость.

Здесь мы будем использовать классический SVM в качестве классификатора. Хотя SVM дают более низкие значения точности и чувствительности, чем современные CNN (в случае набора данных IP падение составляет около 10%), они отлично подходят для перспективных исследований. SVM просты и легки и по-прежнему дают ценную информацию о возможности автоматизации задачи классификации даже при небольшом количестве аннотированных данных.

Когда мы используем классический классификатор, такой как SVM, и после разделения данных рекомендуется декоррелировать наши функции. В нашем случае признаками являются спектральные полосы.

Более того, поскольку дисперсию можно объяснить первыми компонентами, мы можем изучить PCA-разложение с уменьшенным набором спектрально декоррелированных компонент. Например, первая половина главных компонент. Мы должны изучить эту декомпозицию на ранней стадии, используя обучающую выборку (перед обучением нашего классификатора). Эта операция достаточно проста.

nComp = 100
pca = PCA(n_components=nComp)
pca.fit(X_train)
pcX_train = pca.transform(X_train)

Кроме того, мы должны сохранить соответствующее преобразование для последующего применения в качестве этапа предварительной обработки на этапе прогнозирования.

Уменьшая избыточность, мы избавляемся от шума и ненужной информации, которая не улучшит производительность нашего классификатора.

Но даже если мы не хотим применять сокращение количества компонентов, декорреляция каналов перед подачей на классификатор является хорошей практикой, когда мы используем классический подход, такой как SVM. Это может легко улучшить производительность классификации на 10% по сравнению с прямой передачей необработанных сильно коррелированных компонентов.

Обучение нашей модели SVM

После подготовки данных и предварительной обработки обучение SVM становится очень простым. Нам нужно только накормить модель нашими обучающими данными, удобно предварительно обработанными.

svm.fit(pcX_train, y_train)

Оценка классификатора

После обучения мы можем запустить модель на проверочном наборе, содержащем данные, которые не были предоставлены классификатору на этапе обучения.

pcX_test = pca.transform(X_test)
y_pred = svm.predict(pcX_test)

Мы можем оценить производительность с помощью хорошо зарекомендовавших себя инструментов и показателей. Хорошим примером является матрица путаницы.

disp = plot_confusion_matrix(svm, pcX_test, y_test, display_labels=class_names)

Он показывает, сколько образцов каждой категории было правильно классифицировано и сколько было ошибочно отнесено к одной из других категорий.

В нашем случае мы видим, что большинство ошибок возникает из-за путаницы между пикселями без аннотаций и древесиной: 99 пикселов с древесиной не были обнаружены, а 63 пикселя без аннотаций были ошибочно классифицированы как древесина. Это легко понять, так как леса и неаннотированные категории представляют большую долю пикселей. Но мы также можем видеть, что для категории зданий-травы-деревьев-дисков большинство пикселей остаются незамеченными. Напротив, пиксели пшеницы или кукурузы правильно классифицируются как таковые в большей части.

Мы также были бы признательны за числовую метрику, которая говорит нам, как работает модель. В этом отношении точность, полнота и f-оценка очень удобны. Точность говорит нам о доле образцов, правильно отнесенных к данной категории. Отзыв исследует чувствительность нашей модели, то есть долю экземпляров данной категории, которые были обнаружены. Наконец, f-оценка обеспечивает сбалансированную оценку как точности, так и чувствительности.

Мы можем получить классификационный отчет с этими метриками, рассчитанными для каждой из категорий, а также их средними значениями по всему набору, просто вызвав функциюclassification_report.

classification_report(y_test, y_pred, target_names=class_names)

Что возвращает следующий текст, который мы можем распечатать или сохранить.

Эти метрики говорят нам о том, что наша модель дает наихудшие и наилучшие оценки классификации для категорий с наименьшей поддержкой, при этом почти не осталось выборок для проверки. Это указывает на отсутствие статистической значимости для этих случаев.

Среди категорий с числом образцов поддержки проверки более 20 мы обнаружили, что здания-трава-деревья-погружения имеют самую низкую эффективность классификации, а категория пшеницы — самую высокую. Это согласуется с тем, что мы могли бы ожидать от проверки матрицы путаницы. Возможное объяснение заключается в том, что в рассматриваемом масштабе поверхности пшеницы более регулярны и спектрально различны, чем поверхности древесины, поэтому их легче изучить классификатору.

Мы также можем получить более наглядное представление о производительности, сравнив изображение, сегментированное моделью, с изображением, изображающим наземную истину, аннотированную человеком.

Как мы видим, простой подход к машинному обучению с использованием классификатора SVM, который обучен спектральному составу каждого пикселя, обеспечивает приемлемую способность прогнозирования для предлагаемых категорий. Глядя на эти первоначальные результаты, разумно ожидать, что этот вариант использования гиперспектральной визуализации созрел для автоматической классификации. Мы также можем ожидать повышения производительности за счет моделирования текстуры, а не только спектральных характеристик, как мы это делали.

После предыдущего поста об основах гиперспектрального анализа изображений мы углубились в проблему. Мы увидели, как легко оценить сценарий классификации гиперспектральных изображений, используя записную книжку Python в сочетании с облачным хранилищем и управлением нашими данными HSI.