29 Práctica 8 · GeoIA: segmentación con SAM y clasificación con embeddings
Duración: 3 horas · Entorno: Google Colab con GPU o equipo local con GPU NVIDIA · Lectura previa: Capítulo 20 Bibliotecas: segment-geospatial (samgeo), geemap, earthengine-api
29.1 Parte A · Segmentación de techos y piscinas con samgeo
# !pip install "segment-geospatial[samgeo3]" leafmap
import leafmap
from samgeo import tms_to_geotiff
# Área residencial (ajusta las coordenadas a tu zona de estudio)
bbox = [-70.585, -33.405, -70.578, -33.400] # [oeste, sur, este, norte]
tms_to_geotiff(output="ortho.tif", bbox=bbox, zoom=19, source="Satellite", overwrite=True)Segmentación automática con indicaciones de texto (SAM 3):
from samgeo.samgeo3 import SamGeo3 # módulo disponible en samgeo con SAM 3
sam = SamGeo3()
sam.set_image("ortho.tif")
sam.generate_masks(prompt="swimming pool")
sam.save_masks("piscinas.tif")
sam.raster_to_vector("piscinas.tif", "piscinas.gpkg")
NotaLa API cambia rápido
Los nombres de clases y métodos de samgeo se actualizan con frecuencia. Si un ejemplo falla, consulta los ejemplos oficiales en https://samgeo.gishub.org (Wu, 2026). Si no tienes acceso a SAM 3, usa from samgeo import SamGeo con SAM 2.
Control de calidad
- Abre
piscinas.gpkgen QGIS sobre la ortofoto. - Cuenta los verdaderos positivos, falsos positivos y omisiones en una muestra de 50 objetos.
- Calcula precisión (precision), exhaustividad (recall) y F1.
29.2 Parte B · Clasificación con embeddings de AlphaEarth
import ee, geemap
ee.Initialize(project="geomatica-chile-tunombre")
aoi = ee.Geometry.Rectangle([-72.75, -38.80, -72.50, -38.65]) # Temuco
emb = (ee.ImageCollection("GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL")
.filterDate("2024-01-01", "2025-01-01").filterBounds(aoi).mosaic().clip(aoi))
# Puntos de entrenamiento dibujados en el mapa: clase 0=urbano 1=bosque 2=agrícola 3=agua
# entrenamiento = ee.FeatureCollection([...])
# muestras = emb.sampleRegions(entrenamiento, properties=["clase"], scale=10)
# modelo = ee.Classifier.smileKNN(5).train(muestras, "clase", emb.bandNames())
# clasif = emb.classify(modelo)Compara la exactitud obtenida con 50 puntos usando embeddings frente a un Random Forest con bandas de Sentinel-2.
29.3 Preguntas
- ¿En qué casos SAM confunde objetos? (sombras, techos azules, cuerpos de agua).
- ¿Por qué los embeddings permiten clasificar con menos muestras?
- ¿Qué consideraciones de privacidad aplican al segmentar viviendas?
29.4 Entregable
Capa de objetos segmentados con su evaluación (precisión, exhaustividad, F1) y un mapa de clasificación con embeddings.