En desarrollo

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

Segmentación semántica de ortofotos del IGAC: U-Net, DeepLabv3+ y U-Net++
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.

Quiero colaborar

Comentarios

Deja tu comentario

Los leo todos. Se revisan antes de publicarse, así que el tuyo puede tardar un rato en aparecer.

0 / 1500

o escríbeme directo Correo LinkedIn GitHub

Chimborazo, 6263 m (IG-EPN) · sin escala vertical

Únete a la red.

Una carta, sin ruido

Experimentos, mapas, papers y proyectos que van aterrizando. Sin spam, sin algoritmos, sin tracking — solo el correo.

sin spam · sólo lo que publico · baja en un clic