Estás leyendo la publicación: Alcanzar el puesto 33 (de 186) en un límite de campo de cosecha de la NASA… – Hacia la IA
Publicado originalmente en Hacia la IA.
Describir
1. Declaración del problema
2. Enfoque
3. Conclusiones clave
Planteamiento del problema
El desafío de detección de límites de campo de cosecha de la NASA es un desafío de aprendizaje automático organizado por Zindi.África en colaboración con NASA Harvest ubicada en la Universidad de Maryland y Radiant Earth Foundation.
De acuerdo con la declaración del problema de Zindi, las pequeñas granjas producen alrededor del 35% de los alimentos del mundo y se encuentran principalmente en países de ingresos bajos y medianos. El mapeo de estas granjas permite a los formuladores de políticas asignar recursos y monitorear los impactos de los eventos extremos en la producción de alimentos y la seguridad alimentaria. Desafortunadamente, estos mapas a nivel de campo siguen sin estar disponibles en su mayoría y en países de ingresos bajos y medianos, donde el riesgo de inseguridad alimentaria es mayor. Combinando el aprendizaje automático con datos de observación de la Tierra de satélites como el PlanetScope constellation puede ayudar a mejorar el monitoreo agrícola, el mapeo de las tierras de cultivo y la gestión del riesgo de desastres para estas pequeñas granjas.
En este desafío, el objetivo es diseñar algoritmos de aprendizaje automático para clasificar los límites de los campos de cultivo utilizando observaciones multiespectrales. En otras palabras, se espera que su modelo segmente con precisión las máscaras de límites que delimitan las áreas donde hay un campo de cultivo frente a ningún campo de cultivo.
Acercarse
Este es, con mucho, uno de los problemas de aprendizaje automático más complicados, si no el más complicado, que he encontrado. Esto podría explicarse por el hecho de que este es mi primer encuentro oficial con datos satelitales. Y no obstante, me dispuse a aprender todo lo que pude encontrar relativo a esta tarea.
Los datos
Aquí, estamos lidiando con un problema clásico de series temporales de imágenes satelitales (SITS). La serie temporal se proporciona para seis meses. Sin embargo, uno tiene la libertad de seleccionar un subconjunto de meses para el modelado.
Los datos comprenden un conjunto de imágenes satelitales y etiquetas en mosaicos en chips que suman un total de 70 mosaicos. Se han ubicado y anotado un total de 1532 límites de campos individuales en estos 70 mosaicos. Con esta información, mi hipótesis inicial es que cada uno de los 70 mosaicos contendrá al menos un solo límite de campo.
El tamaño final del tren después de la división es de 57 fichas frente a un tamaño de prueba de 13 fichas. Las etiquetas se suministraron solo para los campos que podían estar completamente delimitados dentro de los chips.
Así es como se ve la estructura de archivos de cada chip:
- Imágenes de satélite que contienen 4 bandas [B01, B02, B03, B03] asignado a 6 marcas de tiempo únicas [2021_03, 2021_04, 2021_08, 2021_10, 2021_11, 2021_12]
- Etiquetas rasterizadas que se asignan a los campos en el conjunto de trenes.
Preprocesamiento de imágenes
En esta sección, nos sumergiremos en la canalización de preprocesamiento y escalado de imágenes.
La intuición detrás de mi elección de preprocesamiento de imágenes tenía como objetivo principal crear límites débilmente delineados en las imágenes para permitir que los modelos obtengan una mejor percepción visual de los campos y también para ofrecer un mejor procedimiento de aprendizaje supervisado. El objetivo final está orientado a hacer que las máscaras de etiquetas sean razonablemente detectables dentro de sus imágenes correspondientes.
Mi canal de preprocesamiento final se inspiró en gran medida en la solución ganadora del primer lugar para la competencia Detección de cultivos a partir de imágenes satelitales organizada por el taller CV4A en ICLR 2020. Lo animo a que lo revise aquí.
La idea se puede establecer en los siguientes pasos:
1. Toma un campo
2. Aplique una función de raíz cuadrada en un campo para cuidar los valores atípicos
3. Calcule la media y la desviación estándar del resultado en el paso 2
4. Estandarice el resultado en el paso 3 por canal. Por lo tanto, para cada canal, reste la media y divida el resultado por la desviación estándar
#cargando las 4 bandas de la imagen
mosaico = random.choice(tren_tiles)
imprimir (mosaico)
bd1 = rio.open(f”{train_source_items}/{dataset_id}_source_train_{tile}/B01.tif”)
bd1_matriz = bd1.read(1)
bd2 = rio.open(f”{train_source_items}/{dataset_id}_source_train_{tile}/B02.tif”)
bd2_matriz = bd2.read(1)
bd3 = rio.open(f”{train_source_items}/{dataset_id}_source_train_{tile}/B03.tif”)
bd3_matriz = bd3.read(1)
bd4 = rio.open(f”{train_source_items}/{dataset_id}_source_train_{tile}/B04.tif”)
bd4_matriz = bd4.read(1)
campo = np.dstack((bd4_array, bd3_array, bd2_array, bd1_array))
campo = np.sqrt(campo)
# Estandarización
para c en rango (campo.forma[2]):
media = campo[:, :, c].significar()
estándar = campo[:, :, c].std()
campo[:, :, c] = (campo[:, :, c] – media) / estándar
¡Y eso es todo lo que se necesita!
Modelo
El modelo es una arquitectura basada en Unet que utiliza Efficientnet-B7 preentrenado como codificador.
Sorprendentemente, ofreció una buena consistencia sobre las métricas de pérdida, F1 y Recall tanto en el tren como en los conjuntos de validación.
Los datos se dividieron en función de un método de división estratificado basado en segmentación personalizada.
El entrenamiento se realiza utilizando el optimizador AdamW con una tasa de aprendizaje de 1e-4 y una caída de peso de 1e-5, ¡durante solo 50 épocas!
La verdad es que originalmente había planeado entrenar por 1000 épocas; y fue solo mi experimento de último minuto antes de que terminara la competencia. Además, mi computación no permitía tamaños de lote más grandes. Y las ideas de aumento de datos adicionales no se pudieron aplicar ya que mi computadora portátil fallaba repetidamente con solo un aumento de mezcla personalizado.
Conclusiones clave
Un resumen de mis experimentos (fallidos + exitosos)
Formulaciones de problemas: traté de ver el problema desde diferentes ángulos. Y finalmente descubrí que la segmentación binaria ofrecía resultados consistentemente mejores.
- Segmentación multiclase
- Segmentación multietiqueta
- Regresión
- Segmentación binaria
- Clasificación de secuencias
Ablaciones de preprocesamiento de imágenes
- normalización logarítmica/raíz cuadrada de las bandas antes/después del apilamiento
- normalización min-max de las bandas antes/después del apilamiento
- combinación de normalización logarítmica y min-max
- combinación de raíz cuadrada y normalización min-max
- Normalización mínima-máxima, logarítmica y de raíz cuadrada independiente antes y después del apilamiento
Finalmente, descubrí que era mejor aplicar la normalización de raíz cuadrada independiente (sin escalamiento mínimo-máximo) después de apilar las 4 bandas en un campo de 4 dimensiones.
Modelo de ablaciones
- Diferentes redes troncales de modelos preentrenadas: variantes de red eficiente (B1-B7), Resnet34, Resnet50, Seresnet34, Eficientnet B5 + pesos de estudiantes ruidosos, VGG16 y VGG19-bn.
- Resnet34 multitarea con agrupación basada en la atención
- Configuración de codificador-decodificador personalizada basada en secuencias: codificador de imagen preentrenado (Efficientnet-b5) + decodificador de memoria a largo plazo (LSTM).
- Modelo de Unet residual entrenado en multitarea
Ablación de función de pérdida
- Entropía cruzada binaria
- Entropía cruzada categórica
- Pérdida de dados (+/- por imagen)
- Pérdida de Tanimoto y pérdida dual de Tanimoto
- Pérdida de entropía cruzada categórica ponderada
- Pérdida combinada: dados + entropía cruzada binaria (probé diferentes configuraciones de ponderación antes de aterrizar en 0.9 * dados + 0.1 * bce)
- Pérdida combinada: pérdida de dados multiclase + entropía cruzada focal (ponderación 1: 1)
- Pérdida de Lovasz
Optimizadores
- Adam, AdamW**, SGD, RMSprop
**: ofreció los mejores resultados junto con el programador de descenso de gradiente estocástico con reinicios en caliente
programadores
- Recocido de coseno +/- reinicios en caliente
- Programador de descenso de gradiente estocástico con reinicios en caliente **.
** — aunque funcionó mejor con parámetros inicializados, no se realizaron más ajustes.
Métrico
- F1 +/- búsqueda de umbral**
- Recordar**
- Métrica de dados
- Métrica de precisión
** — Las métricas F1 + Recall fueron las principales métricas evaluadas. Con F1, en la búsqueda del umbral, [0.1, 0.2] se encontró que solo mejoraban la puntuación CV local y no la puntuación pública.
Doble divisiones
- División de prueba de tren estratificada simple
- Divisor estratificado personalizado diseñado para tareas de segmentación
- Divisor K-Fold
- Multilabel Stratified Shuffle splitter (asignado ‘y’ a las máscaras planas (es decir, 256 * 256 o 65536 píxeles))
- Separador GroupKFold
Lo que no funcionó ?
- En términos generales, la medida en que exploré todas las configuraciones experimentales anteriores fue decidida en gran medida por mi computadora y acceso a Internet (¡sería muy bueno si pudiera experimentar más pero fuera de línea, en una máquina mucho más poderosa!).
- Decidir presentar la tarea como problemas de clasificación de secuencias y clases múltiples fue dolorosamente no trivial. Observé poca coherencia entre la validación cruzada local (y entre pliegues) y la puntuación pública, incluso después de cambiar los divisores de datos.
- Especialmente, con el separador Multilabel, los resultados fueron bastante interesantes pero se reflejaron mal en el momento de la presentación.
- Tanimoto y su variante dual no ofrecieron resultados satisfactorios en términos de escenarios multitarea y de salida única multiclase.
- El montaje de instantáneas empeoró el rendimiento.
Fue una gran experiencia de aprendizaje, con numerosos territorios inexplorados que uno podía explorar.
El enlace al código completo está disponible en la lista de referencia a continuación.
¡Gracias por leer! Los comentarios son muy bienvenidos.
Referencias
[1] Desafío de detección de límites de cosecha de campo de la NASA
[2] Modelo de referencia de Ruanda de cosecha de la NASA 2021
[3] Descenso de gradiente estocástico con reinicios en caliente (SGDR)
[4] División estratificada para segmentación semántica
Publicado a través de Hacia la IA