Segmentación semántica de ortofotos del IGAC: U-Net, DeepLabv3+ y U-Net++
Ortofotos del IGAC segmentadas en ocho clases, con su cartografía como etiqueta, en cuatro municipios de Cundinamarca.
PyTorch, U Net, DeepLab, ArcPy, IGAC, Segmentación, Colombia

Créditos
Ilustración generada con IA: una imagen aérea junto a su versión cartográfica. No es una salida del modelo.
El detalle
Tomé las ortofotos RGB del IGAC a 10 cm por píxel de cuatro municipios de Cundinamarca (Madrid, Mosquera, Tabio y Tocancipá) y entrené redes para segmentarlas en ocho clases: construcción, bosque, depósito de agua, zona verde, zona dura, vía, cerca y cabecera municipal.
Las etiquetas salen de la cartografía vectorial del propio IGAC. Comparé U-Net, DeepLabv3+ y U-Net++ con tres métodos clásicos (Random Forest, SVM lineal y OBIA) sobre la misma partición espacial, y el mejor modelo lo llevé hasta el final: polígonos en GeoPackage y un paquete para correrlo dentro de ArcGIS Pro.
Los modelos ya están entrenados y evaluados. El repositorio sigue privado. Se abre cuando alguien más pueda correrlo de principio a fin sin ayuda, y hoy eso no pasa: las ortofotos pesan unos 280 GB y están sujetas a los términos de uso del IGAC.
Características
- Ortofotos RGB del IGAC a 10 cm por píxel de Madrid, Mosquera, Tabio y Tocancipá
- Ocho clases:
- construcción, bosque, depósito de agua, zona verde, zona dura, vía, cerca y cabecera municipal
- Etiquetas tomadas de la cartografía vectorial del IGAC; las vías y las cercas pasan de líneas a polígonos con un buffer antes de rasterizarse
- Tres arquitecturas con encoders ResNet preentrenados en ImageNet (U-Net, DeepLabv3+ y U-Net++) frente a tres métodos clásicos (Random Forest, SVM lineal y OBIA), con las mismas etiquetas y la misma partición
- Partición espacial en celdas de 1 km × 1 km dentro de cada municipio: 86 de entrenamiento, 27 de validación y 33 de prueba, con semilla fija
- Métricas por clase (IoU, F1, precisión y exhaustividad) y globales (mIoU y exactitud por píxel)
- Del ráster al vector:
- postprocesamiento morfológico, polígonos de construcción y bosque simplificados en GeoPackage, y el modelo empaquetado como DLPK para ArcGIS Pro
Stack tecnológico
- PyTorch 2.3 + segmentation-models-pytorch 0.3.3: U-Net, DeepLabv3+ y U-Net++ con encoders ResNet preentrenados en ImageNet
- Albumentations: flips, rotaciones, escala, brillo, contraste, tono, ruido y desenfoque
- Rasterio / GDAL: lectura de ortofotos y rasterización de la cartografía vectorial
- GeoPandas / Shapely / Fiona: lectura de la geodatabase del IGAC, buffers y partición espacial
- scikit-learn / scikit-image: métodos clásicos (Random Forest, SVM lineal, OBIA con SLIC) y postprocesamiento morfológico
- TensorBoard: curvas de pérdida y mIoU por época
- ArcPy / ArcGIS Pro: postprocesamiento, vectorización a GeoPackage y paquete DLPK
- Jupyter: 12 notebooks del flujo, de la exploración de los datos a la vectorización
Lo difícil
- Convertir la cartografía en máscaras: vías y cercas son líneas, así que hubo que darles ancho con buffers, cerrar huecos topológicos y decidir qué clase manda donde dos se superponen
- Desbalance fuerte: en el conjunto de prueba, cabecera municipal ocupa el 55 % de los píxeles etiquetados y zona verde el 0,16 %
- Con tres bandas visibles, las clases finas o lineales (cerca, zona verde, zona dura y vía) se segmentan mucho peor que construcción, bosque o cabecera municipal
- Tocancipá pone 95 de las 146 celdas: el modelo aprende sobre todo de un municipio, y todavía no medí qué pasa en uno que no vio
- Una celda de 1 km a 10 cm por píxel son 10.000 × 10.000 píxeles; la trabajé en parches de 512 × 512 con solape de 128
- Quitar ruido de las predicciones sin borrar lo fino: las cercas quedan por fuera del filtro de mayoría
Lo aprendido
- Una sola métrica esconde el problema. Por clase se ve dónde falla: construcción y bosque salen bien, cercas y zonas verdes quedan muy atrás
- Más parámetros no ganó: U-Net++ (49 M) quedó por debajo de DeepLabv3+ (26,7 M) en mIoU de prueba, y en vías apenas empató con U-Net
- Comparar con Random Forest, SVM y OBIA sobre la misma partición me dio una línea base propia, sin depender de cifras de otros artículos
- Un flujo geoespacial no termina en el modelo: termina en una capa de polígonos que abre en un SIG
¿Quieres colaborar en este proyecto?
El repositorio todavía no es público. Si quieres colaborar, escríbenos desde la comunidad.