Perch-v2-Models / README.md
tphakala's picture
Card: add western-palearctic tile row
6642faf verified
|
Raw
History Blame Contribute Delete
8.42 kB
---
pretty_name: Perch v2 Models (full + regional catalog)
license: apache-2.0
base_model:
- cgeorgiaw/Perch
tags:
- bioacoustics
- birdnet
- perch
- bird
- vocalization
- audio-classification
- onnx
library_name: onnx
---
# Perch v2 Models (full + regional catalog)
Google's Perch v2 bioacoustic classifier in three deployment variants, plus a catalog of **region-specific slices** that are smaller and faster while staying numerically identical (bit-exact) to the full model on the species they keep.
## Origin and attribution
- **Perch v2** by **Google Research** ([bird-vocalization-classifier](https://www.kaggle.com/models/google/bird-vocalization-classifier/)): EfficientNet-B3, ~12M embedding + ~91M classification params, ~15,000 species.
- ONNX conversion and the DFT-to-MatMul (`no_dft`) optimization by [justinchuby](https://huggingface.co/justinchuby/Perch-onnx).
- Labels from [cgeorgiaw/Perch](https://huggingface.co/cgeorgiaw/Perch) (iNaturalist taxonomy).
- Regional slicing uses the **BirdNET Geomodel v3.0** range filter (birdnet-team/geomodel) to pick each region's species.
## Variants and hardware
| filename token | precision | best for |
|---|---|---|
| `_fp32` | FP32, with DFT | GPU (CUDA/TensorRT), Intel CPU |
| `_no_dft_fp32` | FP32, DFT removed | OpenVINO (RPi5 fast path); also runs on ORT/CUDA |
| `_int8_arm` | partial INT8 (MatMul-only) | ARM CPU / Raspberry Pi, low RAM |
## Full model
| file | MB |
|---|---:|
| `full/perch_v2_fp32.onnx` | 409 |
| `full/perch_v2_no_dft_fp32.onnx` | 413 |
| `full/perch_v2_int8_arm.onnx` | 131 |
| `full/perch_v2_labels.txt` | 14,795 classes |
## Why regional models
These slices are built for **real-time detection on resource-constrained devices**, phones, Raspberry Pi and other single-board computers, where running the full 14,795-class Perch v2 continuously is costly in both RAM and CPU. Most of that cost goes to recognising species that cannot occur at the listener's location. Restricting the model to a region's species shrinks the memory footprint and the per-inference compute (the classifier head is ~88% of the model), so an always-on detector keeps up with the live audio stream and leaves headroom for the rest of the application, on hardware where the full model would struggle. Each tile stays **bit-exact** to the full model on the species it keeps; the only change is that out-of-region species are not emitted, which at a fixed monitoring location is exactly what you want.
## Regional catalog
Each tile: BirdNET Geomodel v3.0 range filter (top ~800 species for temperate regions, ~1200 for bird-rich tropical/subtropical ones, up to ~3500 for the hyper-diverse Neotropics) + 198 FSD50K sound events + a 27-species cosmopolitan core. Ships `_no_dft_fp32` (OpenVINO/GPU) and `_int8_arm` (ARM) + labels + indices. All bit-exact vs the full model on the species they keep.
Each tile folder also has `coverage.png` (a map of the region it covers) and `metadata.json` (species count, covered countries, and the continental `group` it belongs to).
Tiles are organised by continent below. `regional/groups.json` lists the same grouping (ordered continents -> tiles) in one file, and each tile's `metadata.json` carries its `group` / `group_display` / `group_order`, so an application can rebuild these sections without scraping this table.
### Europe
| region | coverage | classes | fp32 MB | int8-arm MB |
|---|---|---:|---:|---:|
| `nordic` | <img src="regional/nordic/coverage.png" width="210"> | 638 | 65.0 | 44.5 |
| `british-isles` | <img src="regional/british-isles/coverage.png" width="210"> | 776 | 68.4 | 45.4 |
| `central-europe` | <img src="regional/central-europe/coverage.png" width="210"> | 873 | 70.8 | 46.0 |
| `baltics` | <img src="regional/baltics/coverage.png" width="210"> | 655 | 65.4 | 44.6 |
| `iberia` | <img src="regional/iberia/coverage.png" width="210"> | 856 | 70.4 | 45.9 |
| `southern-europe` | <img src="regional/southern-europe/coverage.png" width="210"> | 839 | 70.0 | 45.8 |
| `eastern-europe` | <img src="regional/eastern-europe/coverage.png" width="210"> | 739 | 67.5 | 45.2 |
| `western-palearctic` | <img src="regional/western-palearctic/coverage.png" width="210"> | 1599 | 88.7 | 50.5 |
| `iceland` | <img src="regional/iceland/coverage.png" width="210"> | 591 | 63.9 | 44.3 |
| `svalbard` | <img src="regional/svalbard/coverage.png" width="210"> | 480 | 61.1 | 43.6 |
| `canary-islands` | <img src="regional/canary-islands/coverage.png" width="210"> | 598 | 64.0 | 44.3 |
| `madeira` | <img src="regional/madeira/coverage.png" width="210"> | 459 | 60.6 | 43.4 |
| `azores` | <img src="regional/azores/coverage.png" width="210"> | 426 | 59.8 | 43.2 |
### Asia
| region | coverage | classes | fp32 MB | int8-arm MB |
|---|---|---:|---:|---:|
| `south-asia-peninsular` | <img src="regional/south-asia-peninsular/coverage.png" width="210"> | 879 | 70.9 | 46.0 |
| `indo-gangetic` | <img src="regional/indo-gangetic/coverage.png" width="210"> | 1406 | 83.9 | 49.3 |
| `himalaya` | <img src="regional/himalaya/coverage.png" width="210"> | 1407 | 83.9 | 49.3 |
| `japan` | <img src="regional/japan/coverage.png" width="210"> | 799 | 69.0 | 45.5 |
| `china-northeast` | <img src="regional/china-northeast/coverage.png" width="210"> | 877 | 70.9 | 46.0 |
| `china-north-central` | <img src="regional/china-north-central/coverage.png" width="210"> | 976 | 73.3 | 46.6 |
| `china-southeast` | <img src="regional/china-southeast/coverage.png" width="210"> | 1373 | 83.1 | 49.1 |
| `china-southwest` | <img src="regional/china-southwest/coverage.png" width="210"> | 1409 | 84.0 | 49.3 |
| `tibet` | <img src="regional/tibet/coverage.png" width="210"> | 1407 | 83.9 | 49.3 |
### North America
| region | coverage | classes | fp32 MB | int8-arm MB |
|---|---|---:|---:|---:|
| `north-america-east` | <img src="regional/north-america-east/coverage.png" width="210"> | 999 | 73.9 | 46.8 |
| `north-america-west` | <img src="regional/north-america-west/coverage.png" width="210"> | 1002 | 74.0 | 46.8 |
### South America
| region | coverage | classes | fp32 MB | int8-arm MB |
|---|---|---:|---:|---:|
| `amazonia` | <img src="regional/amazonia/coverage.png" width="210"> | 3388 | 132.7 | 61.5 |
| `andes` | <img src="regional/andes/coverage.png" width="210"> | 3535 | 136.3 | 62.4 |
| `eastern-brazil` | <img src="regional/eastern-brazil/coverage.png" width="210"> | 2184 | 103.0 | 54.1 |
| `southern-cone` | <img src="regional/southern-cone/coverage.png" width="210"> | 1855 | 95.0 | 52.0 |
| `galapagos` | <img src="regional/galapagos/coverage.png" width="210"> | 336 | 57.6 | 42.7 |
### Africa
| region | coverage | classes | fp32 MB | int8-arm MB |
|---|---|---:|---:|---:|
| `southern-africa` | <img src="regional/southern-africa/coverage.png" width="210"> | 1002 | 74.0 | 46.8 |
| `reunion` | <img src="regional/reunion/coverage.png" width="210"> | 274 | 56.1 | 42.3 |
| `mauritius` | <img src="regional/mauritius/coverage.png" width="210"> | 272 | 56.0 | 42.3 |
| `seychelles` | <img src="regional/seychelles/coverage.png" width="210"> | 318 | 57.2 | 42.6 |
| `cape-verde` | <img src="regional/cape-verde/coverage.png" width="210"> | 346 | 57.8 | 42.7 |
| `sao-tome-principe` | <img src="regional/sao-tome-principe/coverage.png" width="210"> | 324 | 57.3 | 42.6 |
### Oceania
| region | coverage | classes | fp32 MB | int8-arm MB |
|---|---|---:|---:|---:|
| `australia-east` | <img src="regional/australia-east/coverage.png" width="210"> | 946 | 72.6 | 46.4 |
| `new-zealand` | <img src="regional/new-zealand/coverage.png" width="210"> | 486 | 61.3 | 43.6 |
| `hawaii` | <img src="regional/hawaii/coverage.png" width="210"> | 478 | 61.1 | 43.6 |
| `new-caledonia` | <img src="regional/new-caledonia/coverage.png" width="210"> | 377 | 58.6 | 42.9 |
## Usage
Each model takes 5 s of 32 kHz mono audio (`[1, 160000]`) and outputs a `label` vector of logits over its species list; pair it with the sibling `*_labels.txt` (line count matches the logit count). Pick a variant by hardware (table above). Confidence is a softmax over the model's own classes, so a regional tile normalizes over fewer species than the full model; recalibrate detection thresholds per model.
## Provenance
Regional slices are gathered from the ProtoPNet head of `perch_v2_no_dft.onnx` and validated bit-exact against the full model on the species they keep. Perch v2 is by Google; see the license above.