Mostrando las entradas con la etiqueta KNN. Mostrar todas las entradas
Mostrando las entradas con la etiqueta KNN. Mostrar todas las entradas

martes, 1 de agosto de 2017

Complementos QGIS para Clasificación Supervisada con Imágenes Sentinel-2, Parte 2









Con la finalidad de completar lo ofrecido, ahora trataremos sobre el plugin kNN classifier, el cual emplea el método K -vecinos más cercanos, en inglés K-Nearest Neighbors Algorithm (KNN), logrando crear una nueva capa con los píxeles clasificados, además de realizar la evaluación de la precisión del proceso de clasificación. Se debe mencionar que los principios de las funciones y del trabajo del plugin están basados en el paper de la referencia 1.

Preparando los datos:


Seguiremos empleando la misma fuente de datos con la que venimos trabajando en la entrada anterior,  es decir nuestra imagen compuesta del satélite Sentinel-2, del mismo modo se trabajará con nuestra capa vectorial de las áreas de entrenamiento, la cual deberá ser modificada, teniendo en cuenta los requisitos del plugin.

En resumen el plugin KNN classifer requiere lo siguiente:

  • Un archivo raster multibanda con la extensión TIF, en nuestro caso tenemos una imagen del Sentinel-2 compuesta por cuatro bandas (comb2348_test.tif).
  • Un archivo Shapefile que contenga un campo con la clasificación (roi_set16_test1.shp), pero además los descriptores requeridos, en este caso serán los valores de las bandas contenidos en cada uno de los polígonos (45), para lo cual vamos a emplear una herramienta ubicada en la menú raster, denominada "Estadísticas de zona".

Lo primero que haremos será aplicar "Estadísticas de zona", considerando nuestra imagen multibanda y la capa vectorial, para ello se considerará el valor de la media de cada una de las bandas. 

Figura 1: Aplicando Estadísticas de zona para recopilar datos de nuestra imagen por cada banda


El proceso se repite para las demás bandas, obteniendo al final cuatro campos con los valores medios de las bandas, los que ahora serán considerados como nuestros descriptores.


Figura 2: Adición de los descriptores con valores de las bandas de la imagen raster


Empleo del KNN Classifer


Ahora podemos activar el plugin desde nuestra barra de herramientas, luego del cual nos aparecerá una ventana (Ver Figura 3), en donde dentro de la pestaña "Basic", se especifica nuestra capa raster y luego nuestra capa vectorial actualizada. Posteriormente hay que indicarle lo siguiente:
  • Una carpeta de salida de nuestros resultados.
  • El número de vecinos más cercanos (k), es decir el número de vectores de muestra (polígonos) más cercanos de acuerdo con la distancia.
  • La selección de las bandas disponibles para ser considerados.
  • Lista de los descriptores provenientes de la tabla de atributos de la capa vectorial, solo deben ser considerados los campos relevantes para la clasificación.
  • El parámetro a ser clasificado, existiendo la opción de realizar una clasificación con múltiples parámetros.
  • Finalmente se indica el modo de clasificación, el cual está en relación al parámetro a ser clasificado, "c" para el parámetro categórico y "n" para el parámetro continuo.

Es importante mencionar que debemos emplear la tecla "Ctrl" para realizar múltiples selecciones, como las bandas y los descriptores.

Figura 3: Configuración requerida para ejecutar el plugin kNN


Primeros Resultados Obtenidos


Luego de ejecutar el plugin en nuestro panel de capas aparecerá la nueva capa raster con el resultado de la clasificación, el cual presenta la siguiente estructura: SC_ + nombre de la imagen + nombre del parámetro + _valor de k + modo de clasificación (SC_comb2348_test2Clase_ID_3c). Luego para visualizar mejor podemos emplear el estilo que venimos trabajando.

Figura 4: Vista del resultado de clasificación con la configuración básica


También se genera un archivo de texto (.txt), con la evaluación de la precisión del algoritmo empleado con los valores ingresados, el cual se almacena en la carpeta de salida elegida. La interpretación del mismo sería:

  • OA: Precisión general - todos los píxeles clasificados correctamente (todos los tipos) / todos los píxeles clasificables (todos los tipos)
  • PA: Precisión de los "productores" - Muestra el porcentaje de cuántos píxeles de cada tipo se clasifican correctamente. Correctamente clasificado (de un solo tipo) dividido por el número total de píxeles de prueba del mismo tipo de acuerdo con los datos de referencia. Para nuestro ejemplo se muestran seis (6) valores que corresponden a las clases consideradas.
  • UA: Precisión de los usuarios - Muestra la probabilidad de que el tipo específico realmente represente ese tipo. Correctamente clasificados (de un solo tipo) / clasificados (de un solo tipo).
  • KHAT: Este valor describe qué tan bien el algoritmo kNN clasifica los píxeles si se compara con el clasificador aleatorio. Por lo tanto, valores cercanos a 1 indicarán un buen desempeño del algoritmo.
En nuestro caso obtuvimos un KHAT igual a 0.859, lo que significa que la clasificación es un 86% mejor que un clasificador aleatorio proporcionado.


Figura 5: Vista del resultado de la evaluación del algoritmo en un archivo de texto


Es recomendable ir probando valores de k distintos para ver el valor que mejor se ajusta, en este caso luego de realizar pruebas con otros valores, se comprobó que el valor de 3 es el más adecuado. Para tener otros criterios al momento de elegir este parámetro, recomiendo revisar la referencia 2.


Editando nuestra configuración para clasificar


Ahora vamos a probar algunas otras opciones que tenemos, todo ello con la finalidad de personalizar nuestra configuración inicial. Para ello, en primer lugar nos debemos ir a la pestaña "Advance", desde aquí veremos que podemos realizar algunos ajustes:

  • Distance calculation: La modificación de esta opción que por defecto está marcado en "Euclidean", puede alterar la velocidad en el procesado para obtener los resultados; esto se debe a que ambos métodos de cálculo emplean distintas fórmulas, siendo la de Manhattan, la que consume menor tiempo de procesado. El principio de ambos se puede resumir si apreciamos la Figura 6, en donde podemos apreciar las fórmulas que consideran ambos métodos:

Figura 6: Representación gráfica de los métodos de cálculo de distancias (Fuente: Ref. 2)


  • Mask layer: Te permite incorporar una capa raster que indique solo aquellos píxeles que deben ser clasificados, dicha capa debe contener valores de 0 (píxeles que no son considerados) y 1 (píxeles a ser considerados).
  • GeoDistance: Proporciona al usuario una opción para seleccionar datos de muestra a la distancia deseada desde un píxel clasificable. Esta opción limita nuestros datos de muestra y reduce la influencia de las muestras ubicadas más lejos. La distancia se mide en kilómetros [km]. Al habilitar esta opción, el usuario debe verificar que los datos de entrenamiento tienen columnas denominadas "x" e "y" que contienen coordenadas de los puntos de datos de entrenamiento.
  • Feature weights: Te permite realizar un tipo de ponderación a nuestros descriptores, por lo tanto valores mayores a 1 incrementa la significancia del descriptor; los valores deben estar separados por comas.

Figura 7: Configuración de opciones avanzadas del plugin


En resumen, tal como se aprecia en la Figura 7, se seleccionó a "Manhattan" como método de cálculo de la distancia, no se activo ninguna capa máscara, se indicó a 1 km como GeoDistance, pero al momento de ejecutar el algoritmo, se mostró la advertencia que no se cuenta con suficientes puntos de muestreo, lo cual es comprensible, teniendo en cuenta la reducida extensión con la que estamos trabajando, también se habilitó la opción de estandarización y finalmente la generación de ponderación, se le asignó mayor peso a las bandas 3 y 4, las que corresponden a las bandas roja e infrarroja del Sentinel-2 respectivamente.

Figura 8: Resultado obtenido al modificar algunos parámetros.

Si apreciamos la Figura 8, veremos que el resultado no fue satisfactorio si lo comparamos con nuestro primer resultado, esto nos permite descartar la opción de emplear "Manhattan" como método de cálculo de la distancia. Por lo tanto, si mantenemos los cambios y volvemos a emplear "Euclidean" obtendremos un resultado similar al primero, pero visualmente se comprueba que existe algunas mejoras.

Figura 9: Resultado de la clasificación empleando ponderaciones


Bueno, con esta parte cumplo con lo ofrecido, teniendo la intensión de poder mostrar otras opciones que tenemos para realizar una clasificación supervisada. Para que puedan profundizar sobre esta metodología, recomiendo revisar la referencia 3, en donde el autor del plugin explica detalladamente las características del mismo y que por mi parte traté de resumirlas en esta entrada.

Referencias:

  1. http://www.sciencedirect.com/science/article/pii/S0034425701002097
  2. http://www.oldemarrodriguez.com/yahoo_site_admin/assets/docs/Presentación_-_KNN.20085205.pdf
  3. https://github.com/m6ev/kNN/blob/master/kNN_Documentation.pdf

miércoles, 26 de julio de 2017

Complementos QGIS para Clasificación Supervisada con Imágenes Sentinel-2, Parte1









Si bien es cierto que el QGIS tiene un excelente complemento como el Semi-AutomaticClassification Plugin, el cual permite realizar clasificación supervisada a partir de imágenes de satélite y que en una entrada anterior se mostró el procedimiento para ello. En esta oportunidad voy a describir un par de complementos que también nos permiten realizar dicha clasificación, en sí me estoy refiriendo al plugin dzetsaka: classification tool y al kNN classifier; mi objetivo es mostrar el primero en esta entrega.

Fuente de Datos


Para el ejemplo usaremos una imagen proveniente del Sentinel2, de una zona comprendida en el Departamento de Madre de Dios en Perú. específicamente la imagen cubre la localidad de Mazuko. Para obtener la imagen ahora existen varias opciones, por mi parte lo hice a través de los datos disponibles a través del Amazon Web Services (AWS) y las imágenes pueden ser descargadas con el buscador Sentinel Image browser. Les recomiendo el vídeo  Tutorial - [Como descargar Sentinel 2 por grillas], como una buena guía de descarga.

Figura 1: Imagen del Sentinel-2 seleccionada para su descarga

De todas las bandas disponibles del Sentinel-2, se descargó las que tienen 10 metros de resolución espacial y luego abiertas en nuestro QGIS.


Figura 2: Vista de las bandas del Sentinel-2 dentro del QGIS.

Preparando nuestros datos


Ahora vamos a recortar nuestra zona de estudio, en mi caso por lo general uso la herramienta del QGIS alinear raster, primero haciendo un acercamiento a la zona de interés para luego considerarlo como zona de recorte a la extensión de la vista de mapa; en sí la herramienta es simple y muy práctica para recortar un raster con las mismas dimensiones y resolución.

Figura 3: Recortando nuestra zona de interés 


Con nuestras bandas al tamaño deseado cubriendo nuestra zona de interés, vamos a generar una composición de todas las bandas, para ello tenemos varias opciones, en mi caso por lo general uso "Images Concatenation" presente dentro de la Caja de herramientas del Orfeo.

Figura 4: Concatenando nuestras bandas para formar una composición.

Con nuestra imagen compuesta por las cuatro bandas (b2, b3, b4 y b8), podemos generar una combinación RGB de color verdadero con la finalidad de visualizar nuestra zona de estudio e iniciar la generación de una capa vector con las áreas de entrenamiento.


Figura 5: Composición RGB color verdadero

Clasificación Supervisada con dzetsaka: classification tool


Como siguiente paso debemos generar una capa vectorial con nuestras áreas o campos de entrenamiento, las cuales son definidas en campo en función al tipo de cobertura presente. Para fines didácticos se han asumido que se realizaron 45 muestras, por eso veremos esa cantidad de polígonos sobre nuestra imagen, asimismo se asumió que se dividen en 5 clases (1: Bosque, 2: Pastos, 3: Suelo desnudo, 4: Edificación, 5: Río y 6: Lecho de río.)

Figura 6: Vista de las áreas de entrenamiento

Para el plugin dzetsaka, tal como lo menciona en la descripción dentro de su repositorio, solo se necesita una capa raster y un archivo tipo Shapefile que contenga el ROI (Región de Interés), pero este último debe presentar una columna que contenga en números las clases designadas.

Figura 7: Tabla de atributos de la Región de Interés con la codificación de las clases
 

Este plugin rápido y fácil de usar, ha sido desarrollado por Nicolas Karasiak; inicialmente basado para el modelo "Gaussian Mixture" desarrollado por Mathieu Fauvel, actualmente soporta Random Forest, KNN y SVM; además se tiene la opción de trabajarlo desde la caja de procesado.

Ahora ya estamos listos para realizar una clasificación supervisada, pero antes no debemos olvidar que es un requisito tener instalado la librería de Python scikit-learn. Tal como se aprecia en la Figura 8, seleccionamos nuestra capa compuesta de las cuatro bandas, nuestro vector y el campo numérico que corresponde a las clases identificadas, luego verificamos que modelo vamos a emplear, le indicamos el archivo resultando y finalmente hacemos clic en "Perform the classification".

Figura 8: Ejecución del Complemento para Clasificación Supervisada
 

En primer lugar como ven usaremos el Gaussian Mixture Model, y una vez obtenido el resultado le daremos un estilo que nos permita identificar mejor las clases obtenidas.

Figura 9: Resultado de la Clasificación supervisada con Gaussian Mixture Model

Repitiendo el procedimiento para los otros algoritmos obtendremos resultados muy similares.


Figura 10: Resultado final empleando los otros modelas para Clasificación Supervisada

Finalmente con el complemento también podemos visualizar una matriz de confusión, como una manera de poder evaluar el desempeño del algoritmo, calculando los valores porcentuales del coeficiente de Kappa y la precisión global (Overall Accuracy) entre el mapa clasificado y los datos de referencia.

Figura 11: Vista la matriz de confusión que se genera por cada algoritmo


Como un tema adicional, si verificamos en nuestra caja de herramientas de procesado, veremos que el complemento está presente, teniendo la ventaja de poder realizar otras aplicaciones, como por ejemplo el "Split train and validation", el cual nos permite dividir nuestro datos de entrenamiento total en dos partes, las de entrenamiento en sí y las de validación, es decir que considera un porcentaje del total que serían necesarios para una validación posterior. En nuestro caso, tenemos 45 áreas de entrenamiento, y luego de ejecutar la aplicación vemos que ha dividido 23 zonas para entrenamiento y reserva 22 zonas para una validación, el cual permitirá evaluar nuestro estimador.

Figura 12: Generando una división de nuestras áreas de entrenamiento totales.

Por ahora es lo que tenía pensado mostrar, en la siguiente entrega se presentará al complemento kNN Classifier y sus particularidades.