You are on page 1of 10

Clasificacin de imgenes con

RandomForests en R (y QGIS)
Nov 28, 2015
El objetivo de este post es demostrar las capacidades de R para clasificar imgenes multiespectrales usando
losalgoritmos conocidos como RandomForests. Estos algoritmos son actualmente una de las tcnicas que
producen mejores resultados para la regresin y clasificacin de datos. Aunque su interpretabilidad puede ser
un tanto difcil, estos algoritmos son ampliamente populares debido a su habilidad para clasificar grandes
cantidades de datos con una alta exactitud.
En las secciones siguientes describo cmo importar en R una imagen Landsat y cmo extraer los valores de los
pixeles para entrenar y ajustar un modelo de RandomForests. Tambin explico cmo acelerar la clasificacin
de las imgenes mediante procesamiento en paralelo. Finalmente presento cmo implementar estos
algoritmos para clasificacin de imgenes en QGIS usando los paquetes de R.

Importacin de datos en R
Para el propsito de este post, voy a realizar una clasificacin de coberturas terrestres en una imagen de
Landsat 7 (path 7 row 57, seis bandas) tomada en el ao 2000 para la cual se ha efectuado la correccin por
distorsiones atmosfricas, como se explica en un post anterior en mi blog. Se van a necesitar varios paquetes
de R instalados, incluyendo: rgdal, raster, caret, randomForest y e1071. Despus de instalarlos carguemos los
paquetes:
library(rgdal)
library(raster)
library(caret)

Ahora importemos la imagen Landsat en R como un objeto RasterBrick usando la funcin brick del paquete
raster. Igualmente reemplacemos los nombres originales de las bandas (e.g., X485.0.Nanometers) con
nombres ms cortos (B1 a B5, y B7):
img <- brick("C:/data/landsat/images/2000/LE70070572000076EDC00/L7007057_20000316_refl")
names(img) <- c(paste0("B", 1:5, coll = ""), "B7")

Podemos generar una visualizacin RGB de la imagen Landsat en R usando el comando plotRGB para, por
ejemplo, crear una composicin en falso color RGB 4:5:3 (Infrarojo cercano - Infrarojo de onda corta - Rojo).
Voy a usar la expresin img * (img >= 0) para convertir los valores negativos a cero:
plotRGB(img * (img >= 0), r = 4, g = 5, b = 3, scale = 10000)

Previamente cre un conjunto de reas de entrenamiento en un shapefile de polgonos (training_15.shp), el


cual contiene los identificadores para cada tipo de cobertura en una columna en la tabla de atributos llamada
class como se muestra a continuacin:

Usemos la funcin shapefile del paquete raster para importar este archivo en R como un objeto de
clase SpatialPolygonsDataFrame y creemos una variable para almacenar el nombre de la columna class:
trainData <- shapefile("C:/data/landsat/shps/UTM18N_32618/training_15.shp")
responseCol <- "class"

Extraccin de valores de los pixeles para la calibracin del modelo


Ahora extraigamos los valores de los pixeles en las reas de entrenamiento para cada banda en la imagen
Landsat y almacenmoslos en una data frame (llamado aqu dfAll ) junto con el correspondiente identificador
de la clase de cobertura:
dfAll = data.frame(matrix(vector(), nrow = 0, ncol = length(names(img)) + 1))
for (i in 1:length(unique(trainData[[responseCol]]))){
category <- unique(trainData[[responseCol]])[i]
categorymap <- trainData[trainData[[responseCol]] == category,]
dataSet <- extract(img, categorymap)
dataSet <- lapply(dataSet, function(x){cbind(x, class = as.numeric(rep(category, nrow(x))))})
df <- do.call("rbind", dataSet)
dfAll <- rbind(dfAll, df)
}

El data frame resultante del paso anterior realizado con mis datos tiene cerca de 80 mil registros. Es necesario
trabajar con un dataset ms pequeo ya que puede tomar un tiempo bastante largo el entrenamiento y ajuste
de un modelo de RandomForests con un dataset de este tamao. Para comenzar, creemos un subconjunto de
datos tomando 1000 muestras aleatorias:
nsamples <- 1000
sdfAll <- subset(dfAll[sample(1:nrow(dfAll), nsamples), ])

Ajuste del modelo y clasificacin de la imagen

A continuacin debemos definir y ajustar el modelo RandomForests usando la funcin train del paquete caret.
Primero especifiquemos el modelo como una frmula con la variable dependiente (i.e., identificadores de los
tipos de cobertura) codificada como factores. Para este ejercicio solamente voy a usar tres bandas como
variables explicatorias (Rojo, Infrarrojo cercano e Infrarrojo de onda corta). Luego definimos el mtodo como
rf, es decir, los algoritmos de RandomForests. (Nota: puedes usar el comando names(getModelInfo()) para ver
una lista completa de todos los mtodos de regresin y clasificacin disponibles en el paquete caret).
modFit_rf <- train(as.factor(class) ~ B3 + B4 + B5, method = "rf", data = sdfAll)

En este punto podramos simplemente usar el comando predict para crear un raster con las predicciones
usando el objeto del modelo ajustado (i.e., modFit_rf ). Sin embargo, es posible acelerar el proceso de
clasificacin usando la funcin clusterR del paquete raster el cual soporta procesamiento en paralelo para
funciones como predict y otras (Nota: el paquete snow debe estar instalado). Solamente necesitamos agregar
una lnea para crear el objeto cluster y otra para eliminarlo despus de que finalice la operacin:
beginCluster()
preds_rf <- clusterR(img, raster::predict, args = list(model = modFit_rf))
endCluster()

La implementacin del clculo en paralelo en mi PC con procesador de 8 ncleos produjo una mejora de
aproximadamente 70% en trminos de tiempo de procesamiento (~14.2 minutos sin paralelizacin vs. ~4.1
minutos del procesamiento en paralelo). En el siguiente pantallazo puedes ver la imagen clasificada
resultante:

Es posible modificar o adicionar otros argumentos al modelo con el fin de hacer un mejor ajuste de los
parmetros que se le proporcionan. Estos parmetros incluyen por ejemplo el nmero de rboles (el valor por
defecto es 500), el tamao mnimo de los nodos terminales o el nmero mximo de rboles con nodos
terminales. Para mayor informacin puedes examinar la documentacin de los paquetes randomForests y
caret.
El siguiente video muestra los comandos de R descritos previamente siendo ejecutados en RStudio:

Cmo realizar una clasificacin con RandomForests en QGIS usando R


Para correr la versin del script de R descrito arriba en QGIS, puedes descargar el script disponible en el
siguiente link y guardarlo en el folder R Scripts de QGIS (o copiar y pegar el contenido en el editor de scripts
de QGIS) como expliquen mi anterior post:
* Script de R para clasificacin con RandomForests en QGIS
En el siguiente video puedes ver cmo realizar la clasificacin con RandomForests de una imagen Landsat en
QGIS usando R:

Recursos adicionales
Para profundizar en el proceso de creacin de modelos predictivos, te sugiero visitar el sitio web del paquete
caret, el cual contiene extensa documentacin sobre preprocesamiento y particin de datos, evaluacin de la
importancia de las variables y ajuste de parmetros y del modelo. Tambin te recomiendo chequear un nuevo
paquete de R llamadoRStoolbox que ofrece un conjunto de herramientas para el procesamiento de datos
tomados por sensores remotos.
La integracin R+QGIS demostrada en este post ampla los mtodos de clasificacin de imgenes disponibles
en QGIS. Existen otras tcnicas de procesamiento de imgenes incluidas en QGIS como las que se encuentran
en el Plugin de Clasificacin Semi-Automtica, el plugin para GRASS GIS y en Orfeo Toolbox. Te sugiero explorar
tambin estas opciones.

En un prximo post estar escribiendo sobre prcticas recomendadas para la evaluacin de la exactitud de
imgenes clasificadas a travs de la comparacin de datos de referencia versus los correspondientes
resultados de la clasificacin. Hasta pronto!

You might also like