Abrir en Colab

Interpretar fotografías de hábitats#

En esta lección aplicaremos Detectron2, un modelo de aprendizaje profundo que ya fue entrenado con más de 200,000 imágenes de objetos cotidianos, para clasificar objetos en fotografías de ciencia participativa, como los tipos de recipientes.

Primero, ve a EditNotebook settingsHardware accelerator y selecciona T4 GPU. Esto debería mejorar la velocidad de ejecución del código.

Instala Detectron2 en Google Colab. Esto no descargará nada en tu computadora y la instalación se eliminará cuando cierres la sesión de Colab. Ten en cuenta que la celda puede tardar algunos minutos en ejecutarse.

%%capture

!python -m pip install 'git+https://github.com/facebookresearch/detectron2.git'

import torch
import detectron2

# Bibliotecas de uso general
import os
import pandas as pd
pd.set_option("display.max_columns", None)
from skimage import io
import geopandas as gpd
from datetime import datetime
from google.colab.patches import cv2_imshow

# Preparación y carga de conjuntos de datos
from detectron2.data.datasets import register_coco_instances
from detectron2.data import DatasetCatalog, MetadataCatalog

# Visualización
from detectron2.utils.visualizer import Visualizer
from detectron2.utils.visualizer import ColorMode

# Configuración
from detectron2 import model_zoo
from detectron2.config import get_cfg

# Entrenamiento y evaluación
from detectron2.engine import DefaultTrainer
from detectron2.engine import DefaultPredictor

Primero necesitamos obtener las fotografías. Sus URL se encuentran en el conjunto de datos de mosquitos utilizado anteriormente. Las personas participantes pueden enviar distintos tipos de fotografías mediante las columnas AbdomenCloseupPhotoUrls, LarvaFullBodyPhotoUrls y WaterSourcePhotoUrls.

En este ejercicio nos concentraremos en WaterSourcePhotoUrls, que contiene fotografías de las fuentes de agua.

mosquito = gpd.read_file(
    "https://github.com/geo-di-lab/emerge-lessons/raw/"
    "refs/heads/main/docs/data/globe_mosquito.zip"
)
def detect_image(url):
    """
    Descarga una imagen, identifica objetos mediante Detectron2
    y muestra las predicciones sobre la fotografía.
    """
    image = io.imread(url)

    # Definir el modelo
    cfg = get_cfg()
    cfg.merge_from_file(
        model_zoo.get_config_file(
            "COCO-InstanceSegmentation/"
            "mask_rcnn_R_50_FPN_3x.yaml"
        )
    )
    cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
    cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(
        "COCO-InstanceSegmentation/"
        "mask_rcnn_R_50_FPN_3x.yaml"
    )

    # Estimar qué objetos aparecen en la imagen
    predictor = DefaultPredictor(cfg)
    outputs = predictor(image)

    # Visualizar los resultados
    visualizer = Visualizer(
        image[:, :, ::-1],
        MetadataCatalog.get(cfg.DATASETS.TRAIN[0]),
        scale=1.2
    )
    out = visualizer.draw_instance_predictions(
        outputs["instances"].to("cpu")
    )
    cv2_imshow(out.get_image()[:, :, ::-1])
# Obtener los enlaces de las fotografías de las observaciones de GLOBE
entry = (
    mosquito.dropna(subset=["WaterSourcePhotoUrls"])
    .iloc[0:10]
)

print(entry["WaterSourcePhotoUrls"].values)
detect_image(
    "https://data.globe.gov/system/photos/"
    "2024/12/31/4294551/original.jpg"
)
detect_image(
    "https://data.globe.gov/system/photos/"
    "2024/12/30/4293975/original.jpg"
)

El modelo parece haber identificado correctamente los objetos de estas imágenes. En la segunda fotografía, clasificó el objeto tanto como bowl como sink, lo que muestra que el modelo pudo confundirse al interpretar ese recipiente.

Las etiquetas permanecen en inglés porque corresponden a las clases originales del conjunto de datos COCO utilizado por Detectron2.

detect_image(
    "https://data.globe.gov/system/photos/"
    "2024/12/31/4295325/original.jpg"
)
detect_image(
    "https://data.globe.gov/system/photos/"
    "2024/12/31/4294112/original.jpg"
)

La clasificación fue menos precisa en estas dos imágenes. El modelo identificó incorrectamente ambos objetos como toilet.

detect_image(
    "https://data.globe.gov/system/photos/"
    "2024/12/29/4292139/original.jpg"
)

En esta imagen, que muestra basura y pasto, el modelo no realizó ninguna clasificación. Probablemente no pudo distinguir un objeto suficientemente claro como para asignarle una categoría.

Hemos explorado el uso de un modelo de visión por computadora de código abierto para identificar objetos en fotografías de fuentes de agua enviadas a GLOBE Observer, donde podrían encontrarse mosquitos.

Los modelos de visión por computadora pueden ahorrar el tiempo que tomaría revisar y clasificar manualmente todas las imágenes. Sin embargo, como observamos en algunos ejemplos, sus clasificaciones no siempre son correctas. Es importante considerar este equilibrio entre rapidez y precisión.

Una forma de mejorar los resultados sería entrenar el modelo con un conjunto propio de imágenes previamente etiquetadas que representen mejor las fuentes de agua observadas mediante GLOBE. También existen otros modelos de código abierto que pueden realizar tareas similares y quizá funcionen mejor que Detectron2 con estas fotografías.

Referencias#