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.
¿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
- Abre QGIS y ve a Complementos → Administrar e instalar complementos.
- En la pestaña Todos, busca
OpenGeoAI. - Haz clic en Instalar complemento.
- 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:
- Proyección — reproyecta a un sistema métrico adecuado para tu zona (ej. EPSG:25830 para la Península Ibérica). Raster → Proyecciones → Transformar.
- Recorte — recorta la imagen al área de interés para reducir tiempo de procesamiento. Raster → Extracción → Recortar raster por extensión.
- Indices espectrales — añade NDVI si clasificas vegetación. En la Calculadora de raster:
(NIR - RED) / (NIR + RED). - Stack de bandas — asegúrate de que todas las bandas están en un solo archivo GeoTIFF multibanda antes de procesar.
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.
- Crea una nueva capa vectorial de polígonos (Capa → Crear capa → Nueva capa GeoPackage) con un campo
clasede tipo texto. - Activa edición y dibuja polígonos sobre áreas homogéneas: bosque denso, zona urbana compacta, agua, suelo desnudo.
- Asigna la etiqueta de clase a cada polígono.
- Recomendación: mínimo 20-50 polígonos por clase, distribuidos en distintas zonas para capturar variabilidad.
Ejecutar la clasificación
- Abre Complementos → OpenGeoAI → Image Classification.
- Selecciona la imagen raster en Input raster.
- Selecciona la capa de ROIs en Training samples y el campo de clase en Class field.
- Elige el algoritmo (Random Forest es un buen punto de partida: robusto y rápido).
- Configura el número de árboles (100-300) y el porcentaje de validación (20-30%).
- 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.