Skip to content

Pièges photographiques dans Potato : revoir la sortie de MegaDetector, Camtrap DP et Darwin Core

Importez la sortie de MegaDetector ou de COCO Camera Traps dans Potato, triez les images et corrigez les rectangles, et exportez en JSON MegaDetector, en paquet Camtrap DP ou en Darwin Core.

Potato 2.12.0 permet de revoir des images de pièges photographiques après le passage d'un détecteur. Vous importez la sortie de lot de MegaDetector ou un fichier COCO Camera Traps, les annotateurs trient chaque image et corrigent ses rectangles, et le résultat s'exporte en JSON MegaDetector revu, en paquet de données Camtrap DP ou en occurrences Darwin Core.

Potato lit la sortie du détecteur et n'exécute pas le détecteur. Lancez d'abord MegaDetector, ou le classifieur que vous utilisez pour les espèces, sur votre propre machine.

Importer la sortie du détecteur

bash
# 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/

Le format est détecté à partir du contenu, et -f megadetector ou -f coco_camera_traps le choisit explicitement. Avec --image-dir, la configuration générée définit media_directory sur ce dossier, de sorte que Potato sert les images depuis l'endroit où elles se trouvent déjà. Avec --image-url-prefix, le préfixe est plutôt accolé au nom de chaque fichier.

Chaque image est un item comportant ces questions :

SchémaTypePrérempli avec
triageradio : empty, animal, person, vehicleLa catégorie de la détection la plus confiante, ou empty quand aucune détection n'atteint le seuil
detectionsannotation d'image, rectangles englobantsChaque détection au niveau du seuil ou au-dessus, étiquetée avec sa classification d'espèce la plus probable quand le fichier en comporte une, sinon avec sa catégorie
speciesmultiselectLes espèces de ces détections, créé seulement quand la source nomme des espèces

La question de tri est un premier passage rapide : les annotateurs y répondent avec les touches 1 à 4 et passent à la suite, puis reviennent aux rectangles des images qui en ont besoin. Les rectangles conservent leur provenance du détecteur ("source": "ai", le nom du détecteur et la confiance), et reçoivent "edited": true quand un annotateur les modifie. L'item conserve datetime, location, seq_id et frame_num quand la source les fournit.

L'importateur MegaDetector lit le format de sortie de lot 1.x. Son bbox est [x, y, width, height] en fractions de l'image à partir du coin supérieur gauche, ce qui correspond à la façon dont Potato stocke les rectangles ; aucune taille d'image n'est donc nécessaire. Les images marquées d'un failure sont laissées de côté et comptées, de même que les détections sous --md-threshold (0.2 par défaut). Un fichier de résultats vidéo est revu au niveau du clip, chaque vidéo étant un item avec les questions triage et species.

Un fichier COCO dont les images portent un seq_id est lu comme COCO Camera Traps, ses catégories servant d'espèces auxquelles s'ajoute empty. Avec --sequences, les images qui partagent un seq_id deviennent un seul item, présenté comme une galerie des images dans l'ordre, avec triage et species mais sans rectangles.

Revue

bash
python potato/flask_server.py start review-project/config.yaml -p 8000

Sur chaque image, l'annotateur vérifie la réponse de tri, déplace, redimensionne, réétiquette ou supprime des rectangles, trace tout animal que le détecteur a manqué, et coche les espèces présentes. Les réponses préremplies ne sont stockées que lorsque l'annotateur enregistre ; un export ne contient donc que des images revues. Détecter les pré-étiquettes validées sans examen explique comment vérifier si des relecteurs ont accepté des suggestions sans les regarder.

Exporter un JSON MegaDetector revu

bash
python -m potato.export -c review-project/config.yaml -f megadetector -o export/

megadetector_reviewed.json utilise le format de sortie de lot 1.4, avec une entrée par image revue, de sorte qu'il peut retourner dans les outils qui lisent les résultats de MegaDetector. Un rectangle tracé ou modifié par le relecteur reçoit un conf de 1.0, et un rectangle du détecteur laissé tel quel conserve le score du détecteur. Quand plusieurs personnes ont revu une image, la première par identifiant d'utilisateur est écrite avec un avertissement, et --option annotator=<user> choisit une personne.

Exporter un paquet Camtrap DP

bash
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=activityDetection

L'export écrit un paquet de données Camtrap DP 1.0 : datapackage.json, deployments.csv, media.csv et observations.csv. Il y a une observation par rectangle, une par espèce cochée sans rectangle, et une observation blank pour une image triée empty. classificationMethod vaut machine pour un rectangle du détecteur que le relecteur a laissé inchangé, et human sinon. Les items de séquence donnent des observations au niveau de l'événement.

Camtrap DP exige des informations dont Potato ne dispose pas : les coordonnées de chaque déploiement, un décalage UTC sur chaque horodatage, et les métadonnées du paquet. Passez ce que vous savez sous forme d'options :

OptionRenseigne
timezoneDécalage UTC ajouté aux horodatages qui n'en ont pas, comme +02:00 ou Z
titletitle et project.title (par défaut : annotation_task_name)
contributorcontributors, une entrée avec le rôle contact
licenselicenses, portée data
sampling_designproject.samplingDesign
capture_methodproject.captureMethod et media.captureMethod (activityDetection ou timeLapse)

Tout ce qui manque encore est listé dans les avertissements de l'export. Complétez-le, par exemple les coordonnées des déploiements dans deployments.csv, et vérifiez le paquet avec un validateur Camtrap DP avant de le publier.

Exporter des occurrences Darwin Core

bash
python -m potato.export -c review-project/config.yaml -f darwin_core -o export/

occurrence.csv contient une occurrence Darwin Core par observation d'animal dotée d'un nom scientifique. Les animaux étiquetés seulement animal sont laissés de côté, puisqu'une occurrence a besoin d'un nom scientifique, et l'export indique combien. basisOfRecord vaut MachineObservation quand l'identification est celle du détecteur et que le relecteur l'a laissée inchangée, et HumanObservation quand une personne l'a tracée, modifiée ou ajoutée.

Un relecteur peut répondre empty tout en laissant des rectangles sur l'image. Les exports écrivent les rectangles, car supprimer un rectangle relève de la décision du relecteur, et les avertissements listent chacun de ces items avec son annotateur ; corrigez-les donc dans Potato et exportez à nouveau.

Exemple

examples/image/camera-trap-review/ contient huit images synthétiques provenant de deux appareils (des cerfs, un raton laveur de nuit, une personne, un véhicule et des images vides) et le fichier MegaDetector à partir duquel elles ont été importées.

bash
python potato/flask_server.py start examples/image/camera-trap-review/config.yaml -p 8000

Pour aller plus loin

Pour les détails d'implémentation, consultez la documentation source.