Skip to content

v1.0.0 — Initial Model Weights Release

Latest

Choose a tag to compare

@CMGeldenhuys CMGeldenhuys released this 17 Feb 11:18

v1.0.0 — Initial Model Weights Release

First public release of pretrained AERD (Automated Elephant Rumble Detection) model weights for elephant call classification, detection, and endpointing.

Models

Variant Dataset Task Classes Folds Predictor
EV_CALL Elephant Voices Call-type classification 5 5 seq
EV_SUBCALL Elephant Voices Sub-call classification 8 5 seq
EV_BINARY Elephant Voices Binary call detection 2 5 seq
LDC_POOLE LDC (Asian elephants) Poole taxonomy classification 6 10 seq
LDC_BINARY LDC (Asian elephants) Binary call detection 2 10 seq

All models use a BEATs (BEATs_iter3) backbone with a patchwise sequence predictor head, operating on 16 kHz mono audio.

Class Labels

EV_CALL (5): not-call, rumble, roar, cry, trumpet

EV_SUBCALL (8): not-call, comment-rumble, conflict-roar, estrous-rumble, female-chorus, grumbling-rumble, pulsated-play-trumpet, trumpet-blast

EV_BINARY (2): not-call, call

LDC_POOLE (6): not-call, rumble, roar, bark, trumpet, squelch

LDC_BINARY (2): not-call, call

Usage

Single model (PyTorch Hub)

import torch

model, preprocess = torch.hub.load("CMGeldenhuys/AERD_inference", "aerd")
audio = torch.randn(1, 16000 * 10)  # 10 seconds at 16 kHz
probs = model.predict(audio, output="tensor")        # (1, T, C) probabilities
labels = model.predict_labels(audio, threshold=0.5)   # per-frame label strings

Ensemble (all folds)

from aerd_inference import aerd_ensemble, AERD_Weights

models, preprocess = aerd_ensemble(weights=AERD_Weights.EV_CALL)
ensemble_probs = torch.stack([m.predict(audio) for m in models]).mean(dim=0)

Specific variant and fold

model, preprocess = torch.hub.load(
    "CMGeldenhuys/AERD_inference", "aerd",
    weights=AERD_Weights.LDC_POOLE, fold=3,
)

Checkpoint Files

35 checkpoint files total (5 variants x k folds each). Naming convention:

aerd_{variant}_ko{fold}_v1-{hash}.pt
Full file listing with hashes

EV_CALL (5 folds)

File Hash
aerd_ev_call_ko1_v1-5876c7c3.pt 5876c7c3
aerd_ev_call_ko2_v1-75efa98e.pt 75efa98e
aerd_ev_call_ko3_v1-5cc3c744.pt 5cc3c744
aerd_ev_call_ko4_v1-48b2294d.pt 48b2294d
aerd_ev_call_ko5_v1-9420e0de.pt 9420e0de

EV_SUBCALL (5 folds)

File Hash
aerd_ev_subcall_ko1_v1-060becac.pt 060becac
aerd_ev_subcall_ko2_v1-20877eaa.pt 20877eaa
aerd_ev_subcall_ko3_v1-8e3b703e.pt 8e3b703e
aerd_ev_subcall_ko4_v1-38886767.pt 38886767
aerd_ev_subcall_ko5_v1-b640338b.pt b640338b

EV_BINARY (5 folds)

File Hash
aerd_ev_binary_ko1_v1-d583165d.pt d583165d
aerd_ev_binary_ko2_v1-0c7fe335.pt 0c7fe335
aerd_ev_binary_ko3_v1-4ca10435.pt 4ca10435
aerd_ev_binary_ko4_v1-97ae4718.pt 97ae4718
aerd_ev_binary_ko5_v1-eceda608.pt eceda608

LDC_POOLE (10 folds)

File Hash
aerd_ldc_poole_ko1_v1-481a3595.pt 481a3595
aerd_ldc_poole_ko2_v1-768a7871.pt 768a7871
aerd_ldc_poole_ko3_v1-fe8caa30.pt fe8caa30
aerd_ldc_poole_ko4_v1-3125e47e.pt 3125e47e
aerd_ldc_poole_ko5_v1-f63a2396.pt f63a2396
aerd_ldc_poole_ko6_v1-d1dbcf1e.pt d1dbcf1e
aerd_ldc_poole_ko7_v1-ee90ff8a.pt ee90ff8a
aerd_ldc_poole_ko8_v1-f4ed2466.pt f4ed2466
aerd_ldc_poole_ko9_v1-90729160.pt 90729160
aerd_ldc_poole_ko10_v1-94261f9c.pt 94261f9c

LDC_BINARY (10 folds)

File Hash
aerd_ldc_binary_ko1_v1-393ba94d.pt 393ba94d
aerd_ldc_binary_ko2_v1-72245d4f.pt 72245d4f
aerd_ldc_binary_ko3_v1-309f3e8c.pt 309f3e8c
aerd_ldc_binary_ko4_v1-3cb18507.pt 3cb18507
aerd_ldc_binary_ko5_v1-ee816aac.pt ee816aac
aerd_ldc_binary_ko6_v1-61ea48e5.pt 61ea48e5
aerd_ldc_binary_ko7_v1-dfd66fd1.pt dfd66fd1
aerd_ldc_binary_ko8_v1-7a59b271.pt 7a59b271
aerd_ldc_binary_ko9_v1-69e1c0ca.pt 69e1c0ca
aerd_ldc_binary_ko10_v1-b9f3883d.pt b9f3883d

Citation

@article{Geldenhuys2025LearningToRumble,
    author = {Geldenhuys, Christiaan M. and Niesler, Thomas R.},
    title = {Learning to rumble: automated elephant call and sub-call classification, detection and endpointing using deep architectures},
    journal = {Bioacoustics},
    volume = {34},
    number = {3},
    year = {2025},
    doi = {10.1080/09524622.2025.2487099},
}