Como fazer Classificação Não-Supervisionada no R?

Aprenda como utilizar algumas linhas de comando para executar uma classificação não supervisionada no R.

No Sensoriamento Remoto, podemos obter imagens de áreas extensas com poucos problemas. Porém, se precisamos avaliar o uso do solo desta área extensa, criar um polígono (shapefile) e recortá-lo conforme o uso do solo é um trabalho demorado.

Uma forma de evitar esse tipo de trabalho é utilizando técnicas de classificação, às quais permitem associar à cada pixel (e seus similares) uma determinada classe.

Na classificação de imagens, há dois métodos para realizar essa tarefa. Uma delas é a Supervisionada, onde o usuário indica ao algoritmo quais padrões de pixels devem ser associados à determinado uso do solo. Outro é a Não-Supervisionada, onde não há indicação de padrão e o próprio algoritmo busca padrões para agrupar.

Nesta postagem, mostraremos como realizar esse procedimento de classificação não-supervisionada no R.

Ajustando os dados de entrada

Agora que já sabemos o que é classificação não-supervisionada, vamos realizar o download da nossa imagem aérea e colocar em prática o que aprendemos até o momento.

Há vários locais que disponibilizam imagens aéreas, tais como o Earth Explorer e sites locais de prefeituras e universidades, que podem ser utilizadas neste procedimento. Neste tutorial, iremos utilizar uma imagem baixada da missão Sentinel.

Você pode fazer o download da imagem neste site: scihub.copernicus.eu, e caso você não saiba como baixar, você pode conferir tutoriais disponíveis no site da Hatari Labs e GeoAplicada.

Neste tutorial, realizei o download da imagem onde localiza-se o município de Jaguaruna (Santa Catarina).

E antes de aplicarmos qualquer processamento sobre a nossa imagem, iremos recortá-la para que o seu tamanho não atrapalhe nosso trabalho. Vamos recortar ela utilizando os limites municipais de Jaguaruna. Tanto no QGIS quanto no ArcGIS, este processo pode ser realizado pelos comandos abaixo:

  • QGIS: Processing Toolbox > GDAL > Raster Extraction > Clip Raster by Mask Layer.
  • ArcGIS: ArcTool Box > Data Management Toolbox > Raster > Raster Processing > Clip.

Ao executar a ferramenta Clip, o resultado será a imagem aérea da sua área de interesse. No nosso caso, o resultado é apresentado na imagem abaixo.

Imagem Sentinel 2 do município de Jaguaruna (SC).

Lembre-se que conforme maior é a sua imagem, mais demorada será a classificação, por isso, recortamos a imagem acima mais uma vez, selecionando a área central do município,

Agora que já temos nossa imagem pronta, vamos à classificação.

Classificação Não-Supervisionada no R

Iremos utilizar três técnicas de classificação não-supervisioanda no R, a primeira delas é a kMeans e para utilizar ela, vamos usar o pacote “raster”.

install.packages("raster")
library(raster)

setwd("C:/Users/ferna/Desktop/blogPost")
imagem <- stack("img_JaguaCentro2.tif")

Nesta técnica de classificação, precisamos indicar no nosso código quantos classes/grupos queremos identificar. Vamos tentar identificar as seguintes classes:

  • Pastagens;
  • Reflorestamentos;
  • Matas Nativas;
  • Rizicultura;
  • Solo Exposto (Estradas de Chão);
  • Área Urbanizada;
  • Corpos D’água;
  • Areia (Dunas).

A partir dessa definição, utilizaremos o código abaixo para rodar a classificação não-supervisionada.

# Centers indica o número de classes/grupos a serem classificadas 
resultadoskMeans <- kmeans(imagem[], centers=8)
resultado <- raster(imagem[[1]])
resultado <- setValues(resultado, resultadoskMeans$cluster)

plot(resultado)

Veja que usando a função kmeans(), realizamos a classificação do nosso raster e indicamos, por meio do parâmetro “centers” quantos agrupamentos (isto é, clusters) a função deverá localizar.

A classificação não-supervisionada no R, usando o código que fornecemos e 8 classes, de um arquivo TIFF de 400 kb foi quase instantânea, enquanto a classificação de um arquivo de 2.000 kb, demorou poucos segundos. Agora, tentamos classificação o município inteiro (30.000 kb) e demorou 10 minutos até abordarmos a operação.

Após rodar este código, teremos a seguinte imagem como resultado.

Classificação Não-supervisionada usando kMeans no R.
Classificação Não-supervisionada usando kMeans no R.

Para comparamos nosso resultado, definir qual número representa cada uso do solo e avaliarmos se a classificação foi boa, vamos utilizar o código abaixo para criarmos uma figura com a nossa imagem aérea ao lado da nossa imagem classificada.

# Dependendo da resolução do seu pc, 
# essas configurações de margens podem mudar
par(mfrow = c(1,2), oma = c(4,1,1,4))

plotRGB(imagem)
plot(resultado)

O resultado deste código é apresentado abaixo.

Comparação entre nossa imagem original e a classificação realizada no R.
Comparação entre nossa imagem original e a classificação realizada no R.

Pela imagem, podemos notar que os pixels classificados em 1 se referem às partes mais claras das áreas urbanizadas, incluindo também trechos de estrada de chão. A classe 2 envolveu as regiões com vegetação arbórea, embora a classificação não diferenciou áreas de reflorestamento das áreas com mata nativa. O item 3 esteve relacionado às áreas de pastagem e acabou incluindo várias pontos com rizicultura. A classe 4 enquadrou pastagens mais verdes e áreas com corpos hídricos (tais como lagoas e rios).

A classe 5 envolveu as áreas de rizicultura com tonalidade mais claras. A classe 6 englobou pastagens e mais áreas de rizicultura. A classe 7 envolveu somente as dunas e áreas com areia exposta e a classe 8 enquadrou porções com solo exposto.

Agora, para simplificarmos o nosso mapa, vamos alterar as cores do nosso mapa classificado para unirmos classes que tem usos do solo em comum. Neste sentido, vamos usar a mesma cor para 1 (cinza); 2 (verde); 3, 4, 5 e 6 (azul); 7 e 8 (amarelo).

plot(resultado, col = c("gray", "green", "blue", "blue", 
                        "blue", "blue", "yellow", "yellow"))

Obviamente há o que se melhorar, mas, pensando num trabalho inicial, esta é uma classificação rápida que pode ser realizada. A imagem com as novas cores é apresentada abaixo.

Mudança na cor das classes.
Mudança na cor das classes.

kMeans não é o único método de classificação, temos outros também. Vamos testar a classificação do tipo Clustering for Large Applications (Clara) e Random Forest.

Antes de darmos andamento ao nosso tutorial, é necessário instalar e carregar dois novos pacotes (cluster e randomForest). Confira abaixo como realizar o procedimento.

install.packages("cluster")
install.packages("randomForest")

library("cluster")
library("randomForest")

Usaremos as mesmas premissas que fizemos na primeira classificação, ou seja, adotaremos 8 usos do solo e utilizaremos a mesma imagem para classificação. O código para a função clara() é apresentado abaixo, sendo que primeiramente convertemos nosso raster em uma matriz para depois ser passado para esta função.

valores <- getValues(imagem)
index <- which(!is.na(valores))
valores <- na.omit(valores)

resultadoClara <- clara(valores, k = 8, samples = 500, metric = "manhattan", pamLike = TRUE)
imagemClara <- raster(imagem)
imagemClara[index] <- resultadoClara$clustering

plot(imagemClara)

O resultado desta classificação é apresentado na imagem abaixo.

Classificação usando Clustering for Large Applications (Clara).
Classificação usando Clustering for Large Applications (Clara).

Podemos notar que a classificação é semelhante à anterior (kMeans), porém, esta conseguiu diferenciar a lagoa que encontra-se ao norte da imagem.

Da mesma forma que plotamos a primeira classificação com a imagem ao lado, podemos fazer o mesmo para este resultado. Também iremos modificar as cores para agrupar nossos usos do solo.

par(mfrow = c(1,2), oma = c(8,1,1,8))

plotRGB(imagem)
plot(imagemClara, col = c("blue", "yellow", "yellow", "green", 
                        "green", "darkgreen", "darkgreen", "white"))

O resultado deste processamento é apresentado na imagem a seguir. Note que o algoritmo conseguiu separar a lagoa ao norte da imagem e as dunas, porém, misturou vários pixels na área urbana.

Comparação entre o classificador Clara e a imagem classificada.
Comparação entre o classificador Clara e a imagem classificada.

E por ultimo, temos a Random Forest.

Iremos utilizar um pouco dos dados obtidos com a kMeans para alimentar essa função. As variáveis que não aparecerem sendo criadas aqui, podem ser consultadas no começo da postagem.

Nesta função, iremos extrair uma amostra da nossa imagem inicial e utilizar ela para treinar e prever os resultados da nossa classificação. Utilizamos também os resultados de agrupamento (Clustering) da função kMeans.

imagemAmostra <- valores[sample(nrow(valores), 500),]
rf <- randomForest(imagemAmostra)
rf_prox <- randomForest(imagemAmostra, ntree=1000, proximity = TRUE)$proximity

E_rf <- kmeans(rf_prox, 8)
rf <- randomForest(imagemAmostra, as.factor(E_rf$cluster), ntree = 500)
rf_raster <- predict(imagem, rf)

plot(rf_raster)

Após rodar esse código, obtivemos o seguintes resultado.

Resultado da classificação usando Random Forest.
Resultado da classificação usando Random Forest.

Da mesma forma que as classificações anteriores, vamos avaliar os resultados e agrupar as classes de uso do solo.

par(mfrow = c(1,2), oma = c(8,1,1,8))

plotRGB(imagem)
plot(imagemClara, col = c("blue", "yellow", "yellow", "green", 
                        "green", "darkgreen", "darkgreen", "white"))

No nosso resultado, há uma mistura dos pixels relacionados à água e à vegetação. Confira o resultado abaixo.

Comparação entre imagem aérea e classificação Random Forest.
Comparação entre imagem aérea e classificação Random Forest.

Obviamente que após realizar uma classificação como esta, para verificar qual é melhor processo, alguns indicadores poderão ser avaliados, entre eles você pode usar o Coeficiente Kappa, Coeficiente de Correlação, Acurácia, Precisão, Sensibilidade, Especificidade, F-Score e Coeficiente de Correlação de Mathews.

Agora, você tem um código que te possibilita avaliar de forma rápida e inicial uma imagem aérea. Você conseguiu realizar todos os procedimentos? Ficou com alguma dúvida? Utilize o espaço dos comentários que estaremos respondendo assim que possível.

Gostou do artigo? Compartilhe.

Referências Consultadas.

DAHMS. Thomas. Unsupervised Classification with R. 2016. Disponível em <http://remote-sensing.eu/unsupervised-classification-with-r/>. Acesso em 25 maio 2019.

GIS-Blog. Unsupervised kMeans classification of satellite imagery using R. Disponível em <https://www.gis-blog.com/unsupervised-kmeans-classification-of-satellite-imagery-using-r/>. Acesso em 18 maio 2019.

INPE. Classificação de Imagens. Disponível em <http://www.dpi.inpe.br/spring/portugues/tutorial/classific.html>. Acesso em 19 maio 2019.


Clique na figura abaixo e assine nossa lista de emails para receber nosso ebook "Como criar mapas de localização com ArcGIS 10.x".


Author: Fernando BS

Engenheiro Ambiental e de Segurança do Trabalho. Atua nas áreas de recuperação ambiental, geoprocessamento e ciência do solo. Busca soluções utilizando softwares como ArcGIS, R e MATLAB.

One thought on “Como fazer Classificação Não-Supervisionada no R?”

  1. Parabéns pelo conteúdo Fernando, muito bem explicado ficou de simples entendimento.

    Como citado em seu texto há o que se melhorar, mas para um trabalho inicial é um resultado muito satisfatório em tão pouco tempo e com um potencial gigantesco de nos ajudar nessa etapa do trabalho.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *