EstevezAlvarez
QGIS GeoAI Geoinformación Python

Clasificación automática de imágenes con GeoAI en QGIS

GeoAI trae modelos de deep learning directamente al entorno QGIS. Esta guía muestra cómo clasificar una imagen satelitale multiespectral en categorías de uso del suelo, paso a paso, sin salir del SIG.

Imagen Sentinel-2 Landsat, drone Bandas RGB, NIR, SWIR, NDVI Modelo Random Forest CNN / SAM fine-tuned Mapa de clases Vegetación Agua Urbano Análisis área, cambio, exportar PostGIS
Flujo de clasificación: la imagen multiespectral alimenta un modelo entrenado que genera un mapa de clases de uso del suelo, listo para análisis cuantitativo.

¿Qué es GeoAI?

GeoAI es el campo que aplica técnicas de inteligencia artificial — clasificación, detección de objetos, segmentación semántica — sobre datos geoespaciales: imágenes satelitales, ortofotos, nubes de puntos LiDAR o capas vectoriales. El objetivo es automatizar tareas que antes requerían interpretación manual, como mapear el uso del suelo a partir de una imagen Sentinel-2 o detectar cambios entre dos fechas.

El plugin OpenGeoAI para QGIS (opengeoai.org/qgis_plugin) integra estos modelos directamente en el entorno de trabajo, sin necesidad de salir a Python o a un notebook externo.

Instalar el plugin

  1. Abre QGIS y ve a Complementos → Administrar e instalar complementos.
  2. En la pestaña Todos, busca OpenGeoAI.
  3. Haz clic en Instalar complemento.
  4. Una vez instalado, aparece en el menú Complementos → OpenGeoAI y en la barra de herramientas lateral.

El plugin requiere QGIS 3.22+ y Python 3.9+. Instala las dependencias de Python desde la consola de QGIS si el plugin lo solicita:

# Consola Python de QGIS (Complementos → Consola de Python)
import subprocess, sys
subprocess.run([sys.executable, "-m", "pip", "install",
                "torch", "torchvision", "rasterio", "scikit-learn"])

Preparar la imagen

La calidad de la clasificación depende directamente de la preparación. Antes de clasificar:

Clasificación Supervisada Requiere: • Muestras de entrenamiento (ROIs) • Clases definidas por el usuario • Validación con datos independientes Algoritmos comunes: Random Forest · SVM · CNN · SAM → Resultado: clases definidas a priori Clasificación No Supervisada Requiere: • Definir número de clústeres (k) • Interpretación posterior de clases • Conocimiento del territorio Algoritmos comunes: K-Means · ISODATA · K-Medoids → Resultado: grupos espectrales
La clasificación supervisada usa muestras etiquetadas por el usuario y genera clases predefinidas. La no supervisada agrupa píxeles por similitud espectral sin etiquetas previas.

Definir clases y muestras de entrenamiento

Para una clasificación supervisada necesitas crear Regiones de Interés (ROIs): polígonos que representan ejemplos conocidos de cada clase. Cuantas más muestras y más variadas, mejor generaliza el modelo.

  1. Crea una nueva capa vectorial de polígonos (Capa → Crear capa → Nueva capa GeoPackage) con un campo clase de tipo texto.
  2. Activa edición y dibuja polígonos sobre áreas homogéneas: bosque denso, zona urbana compacta, agua, suelo desnudo.
  3. Asigna la etiqueta de clase a cada polígono.
  4. Recomendación: mínimo 20-50 polígonos por clase, distribuidos en distintas zonas para capturar variabilidad.

Ejecutar la clasificación

  1. Abre Complementos → OpenGeoAI → Image Classification.
  2. Selecciona la imagen raster en Input raster.
  3. Selecciona la capa de ROIs en Training samples y el campo de clase en Class field.
  4. Elige el algoritmo (Random Forest es un buen punto de partida: robusto y rápido).
  5. Configura el número de árboles (100-300) y el porcentaje de validación (20-30%).
  6. Define la ruta de salida y haz clic en Run.

El plugin genera el mapa clasificado como raster y muestra métricas de precisión: Overall Accuracy, Kappa coefficient y la matriz de confusión por clase.

Interpretar los resultados

Una Overall Accuracy superior al 85% es un resultado aceptable para uso del suelo general. La matriz de confusión es más informativa: muestra dónde el modelo confunde clases (ej. arbustos clasificados como bosque). Si la precisión de una clase es baja, necesitas más muestras de entrenamiento en esa categoría o separar mejor los ROIs.

Automatizar con PyQGIS

Si necesitas procesar múltiples imágenes o integrar la clasificación en un pipeline, puedes llamar al algoritmo desde la consola de Python de QGIS:

from qgis.core import QgsApplication, QgsRasterLayer
import processing

# Cargar imagen
raster = QgsRasterLayer("/datos/imagen_sentinel.tif", "sentinel")

# Ejecutar clasificación supervisada con Random Forest
resultado = processing.run(
    "openGeoAI:randomForestClassification",
    {
        "INPUT_RASTER": "/datos/imagen_sentinel.tif",
        "TRAINING_SAMPLES": "/datos/rois_entrenamiento.gpkg",
        "CLASS_FIELD": "clase",
        "N_ESTIMATORS": 200,
        "TEST_SIZE": 0.25,
        "OUTPUT": "/resultados/clasificacion_uso_suelo.tif",
    }
)

print(f"Overall Accuracy: {resultado['OVERALL_ACCURACY']:.2%}")
print(f"Kappa: {resultado['KAPPA']:.3f}")

Exportar a PostGIS para análisis territorial

# Convertir raster clasificado a polígonos vectoriales
processing.run("gdal:polygonize", {
    "INPUT":  "/resultados/clasificacion_uso_suelo.tif",
    "BAND":   1,
    "FIELD":  "clase_id",
    "OUTPUT": "/resultados/uso_suelo.gpkg",
})

# Cargar en PostGIS
processing.run("qgis:importintopostgis", {
    "INPUT":      "/resultados/uso_suelo.gpkg|layername=uso_suelo",
    "DATABASE":   "territorial_db",
    "SCHEMA":     "produccion",
    "TABLENAME":  "uso_suelo_clasificado",
    "OVERWRITE":  True,
    "CREATEINDEX": True,
})

Con los polígonos en PostGIS puedes calcular áreas por clase, hacer análisis de cambio temporal comparando dos fechas, cruzar con capas de infraestructura o exportar a formatos estándar para informes.