
Proyecto Peridotita 8 De Sentinel-2 a la Inteligencia Artificial: Creando un sistema experto de regeneración forestal con LearningML
En las etapas anteriores de nuestra investigación dentro de las iniciativas MonteSteam y AIDA RAC del IES Monterroso, procesamos la serie temporal del índice $NBR$ (2021–2026) en Google Earth Engine (GEE), analizamos la lluvia y evaluamos la temperatura de la superficie.
Hoy damos un salto pedagógico fundamental para el proyecto Climate Detectives de la ESA: pasamos de la visualización pasiva de datos a la Inteligencia Artificial (IA) aplicada.
En este tutorial explicamos cómo hemos automatizado la descarga de un conjunto de datos (dataset) de imágenes satelitales clasificadas y cómo utilizarlo en el aula con herramientas de Machine Learning (ML) como LearningML o Google Teachable Machine.
Paso 1: Generación del Dataset automatizado con Google Earth Engine
Para entrenar un modelo de IA no basta con una sola foto gigante: necesitamos decenas de pequeñas muestras cuadradas (denominadas teselas o tiles) que representen diferentes estados de la cubierta vegetal.
1. Preparación previa en el mapa de GEE
Antes de ejecutar el script, debemos delimitar el Área de Interés (AOI):
- Abrimos el mapa de Google Earth Engine.
- Seleccionamos la herramienta de dibujar polígono en el margen izquierdo del mapa.
- Trazamos un polígono amplio que rodee todo el perímetro del incendio de Sierra Bermeja e incluya también parcelas limítrofes con vegetación sana no afectada.
- GEE creará automáticamente la variable
geometryen la parte superior del editor.
2. ¿Cómo funciona el script de extracción?
El script procesa la zona seleccionada mediante los siguientes pasos clave:
- Malla o Grid espacial (
tileSizeDeg = 0.02): Divide el polígono trazado en una retícula de teselas cuadradas homogéneas de unos 2 km de lado. - Cálculo de la media de $NBR$: Para cada tesela y fecha seleccionada, calcula el valor medio del $NBR$ utilizando las bandas de infrarrojo de Sentinel-2 L2A ($B8$ y $B12$).
- Clasificación automatizada: Asigna cada tesela a una categoría según los siguientes umbrales científicos:
quemado_severo: $NBR < -0.10$quemado_leve: $-0.10 \le NBR < 0.10$regenerado: $0.10 \le NBR < 0.30$sano: $NBR \ge 0.30$
- Renderizado en mapa de calor RGB: Convierte el índice numérico en una imagen en falso color con una paleta intuitiva (desde marrón/rojo oscuro hasta verde denso) para que los modelos de visión por computador reconozcan patrones visuales.
- Exportación directa a Google Drive: Envía automáticamente cada tesela a su carpeta correspondiente dentro de Drive.
Aquí tienes el código. No olvides seleccionar un polígono en Google Earth Engine antes:
// ================================================================
// PROYECTO PERIDOTITA - UNA FECHA POR EJECUCIÓN (versión anti-colapso)
// Procesa SOLO la fecha indicada en la variable FECHA de abajo.
// Cambia esa variable y vuelve a pulsar Run para la siguiente fecha,
// pero SOLO después de que las tareas anteriores ya no aparezcan
// como "unsubmitted" en rojo en la pestaña Tasks.
// ================================================================
// -----------------------------------------------------------
// CAMBIA SOLO ESTAS DOS LÍNEAS ENTRE EJECUCIONES
// -----------------------------------------------------------
var FECHA = '2026-05-20'; // <-- cambia esta fecha en cada ejecución
var ES_PRUEBA = false; // true solo para las 2 fechas reservadas a prueba
// -----------------------------------------------------------
// Resto del script (no hace falta tocarlo)
// -----------------------------------------------------------
if (typeof geometry === 'undefined') {
print('❌ ERROR: dibuja el polígono en el mapa antes de darle a Run.');
} else {
var aoi = geometry;
Map.centerObject(aoi, 13);
var escala = 20;
var tileSizeDeg = 0.02; // teselas grandes -> pocas por fecha, dataset pequeño a propósito
function clasificarNBR(nbrValue) {
if (nbrValue < -0.10) return 'quemado_severo';
if (nbrValue < 0.10) return 'quemado_leve';
if (nbrValue < 0.30) return 'regenerado';
return 'sano';
}
var bounds = aoi.bounds().coordinates().get(0).getInfo();
var lons = bounds.map(function (p) { return p[0]; });
var lats = bounds.map(function (p) { return p[1]; });
var minLon = Math.min.apply(null, lons);
var maxLon = Math.max.apply(null, lons);
var minLat = Math.min.apply(null, lats);
var maxLat = Math.max.apply(null, lats);
var tiles = [];
for (var lon = minLon; lon < maxLon; lon += tileSizeDeg) {
for (var lat = minLat; lat < maxLat; lat += tileSizeDeg) {
var rect = ee.Geometry.Rectangle([lon, lat, lon + tileSizeDeg, lat + tileSizeDeg]);
if (rect.intersects(aoi, 1).getInfo()) {
tiles.push(rect);
}
}
}
print('Teselas para esta fecha (' + FECHA + '):', tiles.length);
print('Esto va a crear ' + tiles.length + ' tareas. Si te parecen demasiadas, sube tileSizeDeg y vuelve a ejecutar.');
var carpetaRaiz = ES_PRUEBA
? 'dataset_peridotita_piloto/prueba'
: 'dataset_peridotita_piloto/entrenamiento';
var fecha = ee.Date(FECHA);
var coleccion = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterBounds(aoi)
.filterDate(fecha, fecha.advance(10, 'day'))
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.sort('CLOUDY_PIXEL_PERCENTAGE');
var nImagenes = coleccion.size().getInfo();
if (nImagenes === 0) {
print('⚠️ Sin imagen limpia para', FECHA, '— prueba otra fecha.');
} else {
var img = ee.Image(coleccion.first());
var nbrImg = img.normalizedDifference(['B8', 'B12']).rename('NBR');
tiles.forEach(function (tileGeom, i) {
var nbrMedio = nbrImg.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: tileGeom,
scale: escala,
maxPixels: 1e8
}).get('NBR').getInfo();
if (nbrMedio === null) return;
var clase = clasificarNBR(nbrMedio);
var nombreBase = FECHA + '_tile' + i + '_' + clase;
var nbrHeat = nbrImg.expression(
"b('NBR') < -0.25 ? 0 : (b('NBR') < -0.10 ? 1 : (b('NBR') < 0.10 ? 2 : (b('NBR') < 0.30 ? 3 : 4)))"
);
var paleta = ['800000', 'E63319', 'FF9919', 'B3E64D', '1A9933'];
var nbrRGB = nbrHeat.visualize({min: 0, max: 4, palette: paleta});
Export.image.toDrive({
image: nbrRGB.clip(tileGeom),
description: nombreBase + '_nbr',
folder: carpetaRaiz + '/' + clase,
fileNamePrefix: nombreBase + '_nbr',
region: tileGeom,
scale: escala,
maxPixels: 1e8
});
});
print('✅ Tareas de "' + FECHA + '" creadas. Ve a Tasks y dale a Run en cada una.');
print('👉 NO cambies la fecha ni vuelvas a ejecutar el script hasta que estas tareas ya no estén "unsubmitted".');
}
}
Paso 2: Análisis del Dataset — ¿Por qué han salido esas fotos?
Tras procesar la serie de fechas primaverales (2022 a 2026), hemos obtenido un dataset equilibrado de 312 imágenes satelitales:
| Categoría | N.º Muestras obtenidas | Descripción ecológica |
quemado_severo | 10 | Zonas donde el fuego destruyó completamente la copa y la materia orgánica del suelo. |
quemado_leve | 38 | Sectores de matorral bajo o bordes del incendio con afectación moderada. |
regenerado | 123 | Teselas dentro de la cicatriz que han pasado de valores negativos a $NBR > 0.10$ entre 2024 y 2026. |
sano | 141 | Teselas periféricas del polígono no alcanzadas por el fuego o totalmente consolidadas en 2025/2026. |
La explicación temporal detras de los números
El volumen de imágenes en cada categoría refleja fielmente la evolución cronológica registrada en nuestra serie de datos:
- Poco
quemado_severo(10) yquemado_leve(38): La mayoría de estas imágenes se concentran en la primera fecha (13 de mayo de 2022, $NBR = 0.18$) y en 2023 ($NBR = 0.16$). Al avanzar hacia 2024, la vegetación arbustiva colonizó la cicatriz, provocando que la mayoría de cuadrículas “migraran” de categoría en las fechas posteriores. - Predominio de
regenerado(123) ysano(141): A partir del gran salto registrado en mayo de 2024 ($NBR = 0.26$), continuado en 2025 ($NBR = 0.31$) y 2026 ($NBR = 0.30$), la inmensa mayoría de las teselas dentro del perímetro alcanzaron el umbral de regeneración ($NBR > 0.10$), mientras que las zonas de bosque denso no quemado aportaron una base constante de muestras sanas.
Paso 3: Construcción del Sistema Experto en LearningML / Teachable Machine
Con las 312 imágenes organizadas en carpetas en nuestro ordenador, el alumnado del IES Monterroso puede entrenar una Red Neuronal Convolucional (CNN) sin necesidad de escribir código complejo.
Tutorial paso a paso en el aula
1.1. Crear el proyecto de Reconocimiento de Imágenes:LearningML o Teachable Machine.
Entra en learningml.org (o Google Teachable Machine), selecciona Nuevo Proyecto y escoge la modalidad Reconocimiento de Imágenes.
2.2. Definir las 4 clases de estado del bosque:Creación de etiquetas.
Crea cuatro clases etiquetadas exactamente igual que las carpetas del dataset:
quemado_severoquemado_leveregeneradosano
3.3. Subir el conjunto de imágenes por carpetas:Carga del dataset.
Dentro de cada clase, haz clic en Subir imágenes / Cargar archivo y arrastra las fotos correspondientes descargadas desde Google Drive:
- Arrastra las 10 fotos a
quemado_severo. - Arrastra las 38 fotos a
quemado_leve. - Arrastra las 123 fotos a
regenerado. - Arrastra las 141 fotos a
sano.
4.4. Entrenar el modelo (Train Model):Ajuste de pesos neuronales.
Haz clic en el botón Entrenar Modelo (Train Model). La plataforma extraerá las características visuales (bordes, gradientes de color del falso color NBR y textura) ajustando las conexiones de la red neuronal.
5.5. Validar la precisión del modelo:Evaluación y matriz de confusión.
Sube una imagen satelital nueva (por ejemplo, de la carpeta de prueba ES_PRUEBA = true) y observa el porcentaje de certidumbre de la IA.
- Pregunta de reflexión científica para el alumnado: ¿Confunde el algoritmo las teselas de
quemado_levecon las deregeneradoinicial? ¿A qué se debe esta ambigüedad espectral?
Paso 4: Integración en Scratch — El “Detective Climático” Interactivo
Una vez entrenado el modelo en LearningML, se puede exportar con un solo clic a Scratch 3.0.
El alumnado puede programar un escenario interactivo en el que un personaje (un “Detective Climático” de la ESA) actúa sobre un mapa de Sierra Bermeja:
- El usuario hace clic sobre cualquier zona del mapa satélite.
- El programa envía el recorte de esa zona a la red neuronal entrenada.
- El personaje interpreta la predicción de la IA y dice en voz alta:
“Analizando espectro de Sentinel-2… Confianza del 94%: Esta zona corresponde a vegetación en fase de regeneración tras el incendio.”
De esta forma, el proyecto MonteSteam / AIDA RAC une la teledetección espacial de la ESA, la computación en la nube con Google Earth Engine, las ciencias de la Tierra y la Inteligencia Artificial en una experiencia educativa integral.


