Cámaras trampa en Potato: revisar la salida de MegaDetector, Camtrap DP y Darwin Core
Importa la salida de MegaDetector o de COCO Camera Traps a Potato, clasifica las imágenes y corrige los rectángulos, y exporta JSON de MegaDetector, un paquete Camtrap DP o Darwin Core.
Potato 2.12.0 revisa imágenes de cámaras trampa después de que un detector las haya procesado. Importas la salida por lotes de MegaDetector o un archivo COCO Camera Traps, los anotadores hacen un triaje de cada imagen y corrigen sus rectángulos, y el resultado se exporta como JSON de MegaDetector revisado, un paquete de datos Camtrap DP u ocurrencias de Darwin Core.
Potato lee la salida del detector y no ejecuta el detector. Ejecuta antes MegaDetector, o el clasificador que uses para las especies, en tu propia máquina.
Importar la salida del detector
# MegaDetector batch output; images under /data/traps
potato import -i md_output.json --image-dir /data/traps -o review-project/
# The same, with the images hosted elsewhere
potato import -i md_output.json --image-url-prefix https://example.org/traps -o review-project/
# Keep only detections with confidence 0.5 or more
potato import -i md_output.json --image-dir /data/traps --md-threshold 0.5 -o review-project/
# COCO Camera Traps, one item per sequence
potato import -i cct.json --image-dir /data/traps --sequences -o review-project/El formato se detecta a partir del contenido, y -f megadetector o -f coco_camera_traps lo elige explícitamente. Con --image-dir, la configuración generada fija media_directory en esa carpeta, así que Potato sirve las imágenes desde donde ya están. Con --image-url-prefix, en cambio, el prefijo se une a cada nombre de archivo.
Cada imagen es un ítem con estas preguntas:
| Esquema | Tipo | Rellenado previamente con |
|---|---|---|
triage | radio: empty, animal, person, vehicle | La categoría de la detección con más confianza, o empty cuando ninguna detección alcanza el umbral |
detections | anotación de imagen, rectángulos delimitadores | Todas las detecciones en el umbral o por encima, etiquetadas con su clasificación de especie principal cuando el archivo la tiene y, si no, con su categoría |
species | multiselect | Las especies de esas detecciones, que solo se crea cuando el origen nombra especies |
La pregunta de triaje es una primera pasada rápida: los anotadores la responden con las teclas 1 a 4 y siguen, y después vuelven a los rectángulos de las imágenes que los necesitan. Los rectángulos conservan la procedencia del detector ("source": "ai", el nombre del detector y la confianza), y reciben "edited": true cuando un anotador los modifica. El ítem conserva datetime, location, seq_id y frame_num cuando el origen los tiene.
El importador de MegaDetector lee el formato de salida por lotes 1.x. Su bbox es [x, y, width, height] como fracciones de la imagen desde la esquina superior izquierda, que es como Potato guarda los rectángulos, así que no hace falta el tamaño de la imagen. Las imágenes con un failure se dejan fuera y se cuentan, igual que las detecciones por debajo de --md-threshold (0.2 por defecto). Un archivo de resultados de vídeo se revisa a nivel de clip, con cada vídeo como un ítem que tiene las preguntas triage y species.
Un archivo COCO cuyas imágenes llevan seq_id se lee como COCO Camera Traps, con sus categorías como especies más empty. Con --sequences, las imágenes que comparten un seq_id se convierten en un ítem, que se muestra como una galería de los fotogramas en orden, con triage y species pero sin rectángulos.
Revisar
python potato/flask_server.py start review-project/config.yaml -p 8000En cada imagen, el anotador comprueba la respuesta de triaje, mueve, redimensiona, reetiqueta o elimina rectángulos, dibuja cualquier animal que el detector no haya encontrado y marca las especies presentes. Las respuestas rellenadas previamente solo se guardan cuando el anotador guarda, así que una exportación contiene solo imágenes revisadas. Detectar preetiquetas aceptadas sin revisar explica cómo comprobar si los revisores aceptaron sugerencias sin mirarlas.
Exportar JSON de MegaDetector revisado
python -m potato.export -c review-project/config.yaml -f megadetector -o export/megadetector_reviewed.json usa el formato de salida por lotes 1.4, con una entrada por imagen revisada, así que puede volver a las herramientas que leen resultados de MegaDetector. Un rectángulo que el revisor dibujó o modificó recibe conf 1.0, y un rectángulo del detector que se dejó como estaba conserva la puntuación del detector. Cuando varias personas revisaron una imagen, se escribe la primera por ID de usuario con una advertencia, y --option annotator=<user> elige a una persona.
Exportar un paquete Camtrap DP
python -m potato.export -c review-project/config.yaml -f camtrap_dp -o export/ \
--option timezone=-05:00 --option contributor="Your Name" \
--option sampling_design=opportunistic --option capture_method=activityDetectionLa exportación escribe un paquete de datos Camtrap DP 1.0: datapackage.json, deployments.csv, media.csv y observations.csv. Hay una observación por rectángulo, una por especie marcada sin rectángulo y una observación blank por imagen con triaje empty. classificationMethod es machine para un rectángulo del detector que el revisor dejó sin cambios, y human en los demás casos. Los ítems de secuencia dan observaciones a nivel de evento.
Camtrap DP exige datos que Potato no tiene: las coordenadas de cada despliegue, un desfase UTC en cada marca de tiempo y los metadatos del paquete. Pasa lo que sepas como opciones:
| Opción | Rellena |
|---|---|
timezone | Desfase UTC que se añade a las marcas de tiempo que no lo tienen, como +02:00 o Z |
title | title y project.title (por defecto: annotation_task_name) |
contributor | contributors, una entrada con el rol contact |
license | licenses, ámbito data |
sampling_design | project.samplingDesign |
capture_method | project.captureMethod y media.captureMethod (activityDetection o timeLapse) |
Todo lo que siga faltando aparece en las advertencias de la exportación. Complétalo, por ejemplo las coordenadas de los despliegues en deployments.csv, y comprueba el paquete con un validador de Camtrap DP antes de publicarlo.
Exportar ocurrencias de Darwin Core
python -m potato.export -c review-project/config.yaml -f darwin_core -o export/occurrence.csv tiene una ocurrencia de Darwin Core por cada observación de animal que tiene nombre científico. Los animales etiquetados solo como animal se dejan fuera, ya que una ocurrencia necesita un nombre científico, y la exportación indica cuántos son. basisOfRecord es MachineObservation cuando la identificación es del detector y el revisor la dejó sin cambios, y HumanObservation cuando una persona la dibujó, la modificó o la añadió.
Un revisor puede responder empty y aun así dejar rectángulos en la imagen. Las exportaciones escriben los rectángulos, porque eliminar un rectángulo es decisión del revisor, y las advertencias enumeran cada ítem y anotador en esa situación, así que corrígelos en Potato y vuelve a exportar.
Ejemplo
examples/image/camera-trap-review/ tiene ocho fotogramas sintéticos de dos cámaras (ciervos, un mapache de noche, una persona, un vehículo y fotogramas vacíos) y el archivo de MegaDetector desde el que se importaron.
python potato/flask_server.py start examples/image/camera-trap-review/config.yaml -p 8000Lecturas adicionales
- Bioacústica - Revisar detecciones de BirdNET y tablas de Raven
- Anotación de imágenes - Rectángulos, polígonos y las herramientas de imagen
- Mapas - Dibujar sobre imágenes georreferenciadas y GeoTIFF
- Preanotación con LLM - Revisar sugerencias automáticas en general
Para detalles de implementación, consulta la documentación fuente.