Endangered species tracking
2026
Work
Every great ape species is Endangered or Critically Endangered. This is Geologic Dome’s wildlife-monitoring arc: a YOLO-based detector fine-tuned for the apes in PanAf500 camera-trap footage, measured against all 201,430 annotated boxes, and prepared for deployment on the company’s autonomous field nodes.
- 0.857
- 2,257 → 301
- 874
The problem
Every great ape species is listed Endangered or Critically Endangered, and the footage that monitors them is the hardest kind there is: fixed camera traps in dense rainforest, with occlusion, darkness, distance and motion blur arriving together. A per-frame detector hands the operator one knob — a confidence threshold — and every setting of it trades missed apes against phantom ones, chosen blind.
Conservation needs individuals, not boxes. Counting apes, following one through a clip, attaching a behaviour to a body — all of it needs identity to persist across frames, and the raw detector fragmented 874 annotated individuals into thousands of track pieces with 2,257 identity switches between them.
Approach
Measure on the whole universe, not a demo reel
The evaluation runs against every densely-annotated clip PanAf500 has: 500 videos, ~180,000 frames, 201,430 ground-truth boxes, 874 individual apes across 14 field sites. An earlier 10-clip sample produced a threshold recommendation that the full dataset flatly contradicted, and the correction is published in the repo rather than papered over.
The 10-clip number was wrong twice: purposively hard clips, and scored with tracking enabled — so the tracker had already deleted false positives before the detector was graded. Detector numbers now come only from detector-only runs.
Baseline the detector before tuning it
MegaDetector V6 (a YOLOv10-e architecture) is measured as shipped first — via PyTorch-Wildlife, cached once at confidence 0.05 so every higher threshold is a free re-score of the same run — because a fine-tune that was never baselined cannot prove it helped. The failure profile that evaluation produced is what the fine-tuning targets: occlusion, small subjects, apes carrying infants.
Best single-frame operating point over the full set: confidence 0.40, F1 0.835. The number every later stage has to beat.
Find the ceiling before tuning anything
Early on, tracking coverage and detection recall came out equal to four decimal places — 0.7149 — and that was no coincidence: every true positive was already inside some track, and no track ever covered a frame the detector missed. Coverage was pinned to the detector by construction, so no tracker setting could raise it. The real problem was identity.
This is the finding that reframed the phase: the work that followed is about ID switches, fragmentation and interpolation, not about finding more animals.
Detect generously, let time do the filtering
The shipped pipeline detects at confidence 0.05 — where raw precision is only 0.468 — and hands everything to ByteTrack, dropping what does not persist and interpolating what briefly disappears. Temporal consistency is evidence a per-frame threshold cannot use, and the tracked output beats the best possible single-frame threshold on both precision and recall at once.
F1 0.857 tracked against 0.835 for the best threshold; ID switches fall 2,257 → 301 and box jitter drops 77%.
Overlay ground truth, never predictions
The annotated clips draw the model’s boxes in one colour and the dataset’s behaviour labels in another, with the legend on every frame so a single still cannot misattribute them. MegaDetector only ever says ‘animal’ — the behaviour comes from PanAf’s annotators, and the footage itself is never redistributed, because annotated clips are a derived work of a non-commercially-licensed conservation dataset.
Publish the failures, then aim the fine-tune at them
The identity gains were re-tested on held-out clips, where a third of the merged-track improvement reversed — recorded as a tripled regression rate, not as ‘fixed’. What still fails is occlusion and scale: apes carrying infants at 0.207 recall, small subjects at 0.711 against 0.93 for large. Those are exactly the cases the fine-tune targets, and the packaged pipeline — manifest, config, provenance, one CLI — is what makes it deployable to a solar-powered field node when the time comes.
One more caveat the repo states itself: MegaDetector’s training corpus is not fully public, so PanAf contamination cannot be ruled out — the baseline numbers could be optimistic in a way no split of this dataset can detect.
What I built
- Fine-tuned the YOLOv10-based detector (MegaDetector V6) toward the failure cases the baseline evaluation exposed, and prepared the packaged pipeline for deployment on Geologic Dome’s autonomous field nodes.
- Built the pipeline end to end — clip manifest, frame decoding, inference, confidence filtering, tracking, refinement, overlay and export — on top of MegaDetector V6 and ByteTrack, which are upstream work.
- Ran the full-dataset evaluation against all 201,430 annotated boxes and 874 ape identities, at a stated IoU and confidence rather than an averaged sweep.
- Found the coverage ceiling — tracking coverage pinned to detector recall by construction — and redirected the phase from detection tuning to identity.
- Designed the detect-generously-then-filter configuration that outperforms every single-frame threshold, and the refinement pass that cut identity switches 87%.
- Corrected my own published threshold claim when the full dataset contradicted the 10-clip sample, and kept both numbers in the record.
Results
- Tracked precision
- 0.855
- Tracked recall
- 0.859
- Tracked F1
- 0.857
- ID switches
- 2,257 → 301
- Fragmentation
- 2.48 → 1.27
- Identity coverage
- 0.740 → 0.823
- Box jitter
- −77%
- Measured on
- 500 clips
Stack
Detector fine-tuning, tracking pipeline, and the full-dataset evaluation.