| --- |
| pretty_name: BirdNET v3.0 Models (GPU-native full + regional catalog) |
| license: cc-by-sa-4.0 |
| tags: |
| - bioacoustics |
| - birdnet |
| - bird |
| - vocalization |
| - audio-classification |
| - onnx |
| library_name: onnx |
| --- |
| |
| # BirdNET v3.0 Models (GPU-native full + regional catalog) |
|
|
| BirdNET+ V3.0 (developer preview 3.1) acoustic classifier, re-exported to a |
| **GPU-native ONNX** graph, plus a catalog of **region-specific slices** that are |
| much smaller while staying numerically identical to the full model on the |
| species they keep. |
|
|
| > **Developer preview.** These are preview3.1 models for research and |
| > evaluation. See `TERMS_OF_USE.txt` (CC BY-SA 4.0; no poaching or military use). |
|
|
| ## Origin and attribution |
|
|
| **Powered by BirdNET** (https://birdnet.cornell.edu/). BirdNET+ V3.0 is developed |
| by the **K. Lisa Yang Center for Conservation Bioacoustics (Cornell University)**, |
| **Chemnitz University of Technology**, and the **Museum fuer Naturkunde Berlin**. |
| It builds on Kahl et al. (2021) and Lasseck (2018). Architecture: EfficientNetV2-S |
| backbone, three-head classifier, 11,560 species. Base preview models are |
| distributed by the BirdNET team on Zenodo. |
|
|
| The GPU-native conversion and the regional slicing in this repo are derived work |
| under CC BY-SA 4.0. |
|
|
| ## What "GPU-native" means |
|
|
| The BirdNET team's ONNX export computes its log-mel front-end with an in-graph |
| ONNX `STFT` op. ONNX Runtime has no CUDA/TensorRT kernel for `STFT`, and OpenVINO |
| cannot translate it at all, so the stock export cannot run on GPU or OpenVINO. In |
| these models the `STFT` is replaced with a mathematically equivalent `Conv1d` |
| (framing + windowed DFT), so the graph is fully supported on **ONNX Runtime CPU, |
| OpenVINO (x86 + Intel GPU), CUDA, and TensorRT**. On multi-threaded CPU it is also |
| slightly faster than the stock model (ORT's `STFT` op is poorly parallelized). One |
| model serves CPU and GPU; there is no separate CPU/GPU build. |
|
|
| Input: raw audio `[batch, 160000]` (**5 s @ 32 kHz**, matching Perch v2 so a host |
| can feed both classifiers the same buffer). Outputs: `predictions [batch, 11,560]` |
| and `embeddings [batch, 1280]`. |
|
|
| ## Variants and hardware |
|
|
| | precision | best for | |
| |---|---| |
| | `_fp32` | **run this everywhere**: CPU (ORT + OpenVINO), CUDA/TensorRT, Intel GPU | |
| | `_fp16` | half the download; GPU speed win. Not a CPU win (see below) | |
|
|
| **FP16 is a download-size lever, not a CPU one.** ONNX Runtime upconverts FP16 |
| weights at inference, so on CPU (x86 and ARM alike) FP16 is equal to or slower |
| than FP32, and on a Raspberry Pi 4 it uses *more* RAM than FP32. For low-RAM CPU |
| devices the right choice is a **regional FP32** model, not FP16. |
|
|
| int8-arm is not shipped for v3.0: the backbone is Conv-dominated and int8-arm only |
| quantizes MatMul/Gemm weights, so it barely helps here. |
|
|
| ### Measured (batch 1, 5 s window) |
|
|
| | device | full fp32 | regional fp32 (nordic) | peak RAM full / regional | |
| |---|---:|---:|---:| |
| | RPi5, OpenVINO | 168 ms | **128 ms** | - | |
| | RPi5, ORT 4 threads | 363 ms | 253 ms | 685 MB / **229 MB** | |
| | RPi4B, ORT 4 threads | 874 ms | 743 ms | 688 MB / **236 MB** | |
| | x86 i7-1260P, ORT 4 threads | 70 ms | 59 ms | - | |
|
|
| OpenVINO is ~2.2x faster than ONNX Runtime on a Raspberry Pi 5. Batching helps |
| only on a GPU (~1.5x at batch 8, FP16); on CPU use batch 1. |
|
|
| ## Full model |
|
|
| | file | classes | MB | |
| |---|---:|---:| |
| | `full/birdnet-v3.0-preview3.1-fp32-b1.onnx` | 11,560 | 557 | |
| | `full/birdnet-v3.0-preview3.1-fp16-b1.onnx` | 11,560 | 279 | |
| | `full/birdnet-v3.0-preview3.1-labels-b1.txt` | 11,560 | - | |
|
|
| ## Why regional models |
|
|
| The three-head classifier is ~80% of the model's parameters, so restricting it to |
| a region's species set cuts memory a lot (**~67% less RAM**: 685 MB -> 229 MB on a |
| Raspberry Pi 5) and latency modestly (**15-30%**). The parameters live in the |
| heads, but the convolutional backbone still does most of the arithmetic, so the |
| headline win is footprint rather than speed. That is exactly what an always-on |
| detector on a phone or single-board computer needs. Each tile is |
| **numerically identical** to the full model on the species it keeps (max abs |
| difference vs the full model < 1e-6); the only change is that out-of-region |
| species are not emitted, which at a fixed monitoring location is exactly what you |
| want. Region species sets come from the **BirdNET Geomodel v3.0** range filter |
| (top ~800 by occurrence probability + a cosmopolitan core), using the same tiles |
| as the Perch v2 regional catalog. |
|
|
| ## Regional catalog |
|
|
| Each tile ships `_fp32.onnx` (runs on OpenVINO/GPU/CPU) + labels + indices + |
| `coverage.png` + `metadata.json`. `regional/groups.json` lists the continent |
| grouping. |
|
|
| ### Europe |
|
|
| | region | coverage | classes | fp32 MB | fp16 MB | |
| |---|---|---:|---:|---:| |
| | `azores` | <img src="regional/azores/coverage.png" width="210"> | 224 | 127.5 | 63.9 | |
| | `baltics` | <img src="regional/baltics/coverage.png" width="210"> | 438 | 135.6 | 68.0 | |
| | `british-isles` | <img src="regional/british-isles/coverage.png" width="210"> | 559 | 140.2 | 70.3 | |
| | `canary-islands` | <img src="regional/canary-islands/coverage.png" width="210"> | 388 | 133.7 | 67.0 | |
| | `central-europe` | <img src="regional/central-europe/coverage.png" width="210"> | 644 | 143.4 | 71.9 | |
| | `eastern-europe` | <img src="regional/eastern-europe/coverage.png" width="210"> | 518 | 138.6 | 69.5 | |
| | `iberia` | <img src="regional/iberia/coverage.png" width="210"> | 627 | 142.8 | 71.6 | |
| | `iceland` | <img src="regional/iceland/coverage.png" width="210"> | 391 | 133.8 | 67.1 | |
| | `madeira` | <img src="regional/madeira/coverage.png" width="210"> | 255 | 128.7 | 64.5 | |
| | `nordic` | <img src="regional/nordic/coverage.png" width="210"> | 422 | 135.0 | 67.7 | |
| | `southern-europe` | <img src="regional/southern-europe/coverage.png" width="210"> | 616 | 142.3 | 71.4 | |
| | `svalbard` | <img src="regional/svalbard/coverage.png" width="210"> | 280 | 129.6 | 65.0 | |
| | `western-palearctic` | <img src="regional/western-palearctic/coverage.png" width="210"> | 801 | 149.4 | 74.9 | |
|
|
| ### Asia |
|
|
| | region | coverage | classes | fp32 MB | fp16 MB | |
| |---|---|---:|---:|---:| |
| | `china-north-central` | <img src="regional/china-north-central/coverage.png" width="210"> | 752 | 147.5 | 73.9 | |
| | `china-northeast` | <img src="regional/china-northeast/coverage.png" width="210"> | 650 | 143.6 | 72.0 | |
| | `china-southeast` | <img src="regional/china-southeast/coverage.png" width="210"> | 808 | 149.6 | 75.0 | |
| | `china-southwest` | <img src="regional/china-southwest/coverage.png" width="210"> | 816 | 149.9 | 75.1 | |
| | `himalaya` | <img src="regional/himalaya/coverage.png" width="210"> | 812 | 149.8 | 75.1 | |
| | `indo-gangetic` | <img src="regional/indo-gangetic/coverage.png" width="210"> | 814 | 149.8 | 75.1 | |
| | `japan` | <img src="regional/japan/coverage.png" width="210"> | 577 | 140.9 | 70.6 | |
| | `south-asia-peninsular` | <img src="regional/south-asia-peninsular/coverage.png" width="210"> | 644 | 143.4 | 71.9 | |
| | `tibet` | <img src="regional/tibet/coverage.png" width="210"> | 811 | 149.7 | 75.1 | |
|
|
| ### North America |
|
|
| | region | coverage | classes | fp32 MB | fp16 MB | |
| |---|---|---:|---:|---:| |
| | `north-america-east` | <img src="regional/north-america-east/coverage.png" width="210"> | 800 | 149.3 | 74.8 | |
| | `north-america-west` | <img src="regional/north-america-west/coverage.png" width="210"> | 802 | 149.4 | 74.9 | |
|
|
| ### South America |
|
|
| | region | coverage | classes | fp32 MB | fp16 MB | |
| |---|---|---:|---:|---:| |
| | `amazonia` | <img src="regional/amazonia/coverage.png" width="210"> | 809 | 149.7 | 75.0 | |
| | `andes` | <img src="regional/andes/coverage.png" width="210"> | 809 | 149.7 | 75.0 | |
| | `eastern-brazil` | <img src="regional/eastern-brazil/coverage.png" width="210"> | 812 | 149.8 | 75.1 | |
| | `galapagos` | <img src="regional/galapagos/coverage.png" width="210"> | 136 | 124.1 | 62.3 | |
| | `southern-cone` | <img src="regional/southern-cone/coverage.png" width="210"> | 807 | 149.6 | 75.0 | |
|
|
| ### Africa |
|
|
| | region | coverage | classes | fp32 MB | fp16 MB | |
| |---|---|---:|---:|---:| |
| | `cape-verde` | <img src="regional/cape-verde/coverage.png" width="210"> | 143 | 124.4 | 62.4 | |
| | `mauritius` | <img src="regional/mauritius/coverage.png" width="210"> | 72 | 121.7 | 61.0 | |
| | `reunion` | <img src="regional/reunion/coverage.png" width="210"> | 73 | 121.8 | 61.1 | |
| | `sao-tome-principe` | <img src="regional/sao-tome-principe/coverage.png" width="210"> | 110 | 123.2 | 61.8 | |
| | `seychelles` | <img src="regional/seychelles/coverage.png" width="210"> | 115 | 123.3 | 61.9 | |
| | `southern-africa` | <img src="regional/southern-africa/coverage.png" width="210"> | 802 | 149.4 | 74.9 | |
|
|
| ### Oceania |
|
|
| | region | coverage | classes | fp32 MB | fp16 MB | |
| |---|---|---:|---:|---:| |
| | `australia-east` | <img src="regional/australia-east/coverage.png" width="210"> | 708 | 145.8 | 73.1 | |
| | `hawaii` | <img src="regional/hawaii/coverage.png" width="210"> | 272 | 129.3 | 64.8 | |
| | `new-caledonia` | <img src="regional/new-caledonia/coverage.png" width="210"> | 168 | 125.4 | 62.9 | |
| | `new-zealand` | <img src="regional/new-zealand/coverage.png" width="210"> | 266 | 129.1 | 64.7 | |
|
|
| ## File naming and versioning |
|
|
| Files are named `birdnet-<upstream>-[<region>-]<variant>-b<build>.onnx`, where |
| `upstream` is the BirdNET release these weights come from (`v3.0-preview3.1`) and |
| `build` is this repo's build revision of that conversion. A new upstream release |
| or a new conversion always gets a new filename; a published file's bytes never |
| change. `models.json` is the machine-readable index: it lists every file with its |
| variant, checksum, input contract, and which backends it actually runs on |
| (including where a backend is *not* supported), plus a `selection` map from |
| hardware/backend to the file to download. |
|
|
| ## Deployment |
|
|
| - Point your host at a tile's model + its `_labels.txt` (matching counts) and |
| restart. Labels are `Scientific name_Common name`. |
| - Confidence is a per-class sigmoid; slicing does not change a kept class's score |
| (unlike a softmax model), so thresholds transfer directly from the full model. |
| - Binaries are hosted here on HuggingFace; the derivation tooling lives separately. |
|
|