Detection of Antarctic blue & fin whale calls in long passive-acoustic recordings (BioDCASE 2026 Task 2). This repository contains the code for the four systems DeepVoice submitted, with from-scratch reproduction instructions for both detector families.
License: MIT © 2026 DeepVoice Foundation.
| ID | System | Approach | Val F1 |
|---|---|---|---|
task2_1 |
YOLO (single) | One YOLOv11m detector on grayscale spectrograms | 0.612 |
task2_2 |
YOLO-3× (fusion, primary) | Three YOLOv11m on complementary spectrogram representations, per-class routing | 0.635 |
task2_3 |
YOLO+ViT | task2_2 + recall-only ViT gap-fill |
0.598 |
task2_4 |
ViT | MAE-pretrained ViT frame-level detector | 0.538 |
(Validation F1 = the official challenge metric: F1 of class-averaged precision/recall, pooled over the three validation deployments.)
Two independent detector families produce these:
yolo/— spectrogram object detection (YOLOv11m). Underliestask2_1andtask2_2.vit/— a ViT frame-level detector, MAE-pretrained on in-domain audio. Underliestask2_4and the gap-fill intask2_3.ensemble/— merges the two fortask2_3.
yolo/ YOLO pipeline (flat scripts) + classes.py: preprocess → train → infer → fuse → score
vit/ ViT detector (flat scripts): model + train_vit.py + 16 s dataset/augmentation,
plus the eval-inference + decode glue → task2_4 CSV
pretraining/ MAE model (mae, dataset, spectrogram) + train_mae.py for ViT pretraining
configs/ MAE pretraining config
ensemble/ task2_3 YOLO+ViT gap-fill merge
data/ how to obtain the dataset (not included)
docs/ technical report (PDF) + experiment logs
eda/ exploratory analysis: annotation stats, spectrogram-config report,
Streamlit FFT explorer (generated figures not included — rerun to produce)
The ViT and YOLO code are both flat sets of scripts that import each other by module name (e.g.
vit/ has train_vit.py importing vit_detector_v2/detection_dataset_16s; yolo/ has
fast_score/infer_opt/build_submissions + a local classes). Run a script directly
(python vit/train_vit.py …) — that puts its own directory on the path. The ViT decode glue also
needs yolo/ on PYTHONPATH (it reuses fast_score/classes).
See yolo/README.md and vit/README.md for the per-family step-by-step.
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txtPython 3.10; the YOLO pipeline was run with ultralytics==8.4.60.
Every script takes its inputs and outputs as command-line arguments (run any with --help);
no machine-specific paths are baked in. You only need to set PYTHONPATH so the flat sibling
modules and the official baseline resolve, and (optionally) OFFICIAL_REPO if the baseline isn't
at its default location:
export REPO=$(pwd) # this repository
export OFFICIAL_REPO=$REPO/external/task2_2025_2026 # vendored official baseline (default)
export WORK=/path/to/scratch # where derived datasets / predictions are written
# $REPO → `import pretraining` (MAE); also lets `python vit/<script>.py` find the repo
# $REPO/yolo → the flat YOLO modules (`fast_score`, `infer_opt`, `build_submissions`, `classes`)
# $REPO/vit → the flat ViT modules (`vit_detector_v2`, `detection_dataset_16s`, …)
# the official baseline supplies `preprocess_data` (preprocessors) and `evaluation_submissions` (scorer)
export PYTHONPATH=$REPO:$REPO/yolo:$REPO/vit:$OFFICIAL_REPO/baselines/yolo:$OFFICIAL_REPO/evaluationThe official challenge baseline is a required dependency (not redistributed here —
external/is gitignored). Clone the official Task 2 repository and either place it atexternal/task2_2025_2026(the default$OFFICIAL_REPOthe YOLO preprocess scripts look for) or point$OFFICIAL_REPOat your clone. The YOLO preprocessors use itspreprocess_data.YOLODataset; the scorers use itsevaluation_submissions/evaluation.py.torchaudio: the official
preprocess_data.pycallstorchaudio.infoand the file-path form oftorchaudio.load, both removed in newer torchaudio (≥ ~2.10). Run the YOLO preprocessing step with atorchaudio < 2.10+ matching torch; everything else (ViT/MAE training, YOLO training/inference) runs on current torch.
| Model | Entry point | Per-family guide |
|---|---|---|
YOLO (task2_1/task2_2) |
yolo/preprocess_*.py → yolo/make_lists.py → yolo/train_yolo.py |
yolo/README.md |
| MAE pretraining | python -m pretraining.train_mae --config configs/mae_spec_250hz.yaml |
vit/README.md §1 |
ViT detector (task2_4) |
python vit/train_vit.py … (optionally --mae-checkpoint) |
vit/README.md §2 |
Get the data first (data/README.md — Zenodo download + expected layout).
Not included. The development set (8 train + 3 validation deployments, ~1,880 h, 250 Hz) is on
Zenodo: https://zenodo.org/records/18832958. The evaluation set is released without public
annotations. See data/README.md for the expected layout and the 7→3 class joining.
Not distributed. This is a code-only release; reproduce by training from scratch following the
per-family READMEs. Scripts that consume a checkpoint take its path as a CLI argument
(--weights / --checkpoint / --ckpts-dir) — point them at your own trained weights.
Michael Moshe Michelashvili, Danielle Hausler, Amit Galor, Shai Nahum Gefen, Tomer Nachshon, Yuval Mendelson, Naama Yochai (corresponding) — DeepVoice Foundation.