This repo contains BirdNET models and scripts for processing large amounts of audio data or single audio files. This is the most advanced version of BirdNET for acoustic analyses and we will keep this repository up-to-date with new models and improved interfaces to enable scientists with no CS background to run the analysis.
Click here to download the Windows installer and follow the setup instructions.
Download the newest Raven model here and follow the setup instructions.
Feel free to use BirdNET for your acoustic analyses and research. If you do, please cite as:
@article{kahl2021birdnet, title={BirdNET: A deep learning solution for avian diversity monitoring}, author={Kahl, Stefan and Wood, Connor M and Eibl, Maximilian and Klinck, Holger}, journal={Ecological Informatics}, volume={61}, pages={101236}, year={2021}, publisher={Elsevier} }
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Developed by the K. Lisa Yang Center for Conservation Bioacoustics at the Cornell Lab of Ornithology in collaboration with Chemnitz University of Technology.
Go to https://birdnet.cornell.edu to learn more about the project.
Want to use BirdNET to analyze a large dataset? Don’t hesitate to contact us: [email protected]
Follow us on Twitter @BirdNET_App
We also have a discussion forum on Reddit if you have a general question or just want to chat.
Have a question, remark, or feature request? Please start a new issue thread to let us know. Feel free to submit a pull request.
-
more than 6,000 species worldwide
-
covers frequencies from 0 Hz to 15 kHz with two-channel spectrogram (one for low and one for high frequencies)
-
0.826 GFLOPs, 50.5 MB as FP32
-
enhanced and optimized metadata model
-
global selection of species (birds and non-birds) with 6,522 classes (incl. 10 non-event classes)
You can find a list of previous versions here: BirdNET-Analyzer Model Version History
-
updated species range model based on eBird data
-
more accurate (spatial) species range prediction
-
slightly increased long-tail distribution in the temporal resolution
-
see this discussion post for more details
Model V2.4 uses the following settings:
-
48 kHz sampling rate (we up- and downsample automatically and can deal with artifacts from lower sampling rates)
-
we compute 2 mel spectrograms as input for the convolutional neural network:
-
first one has fmin = 0 Hz and fmax = 3000; nfft = 2048; hop size = 278; 96 mel bins
-
second one has fmin = 500 Hz and fmax = 15 kHz; nfft = 1024; hop size = 280; 96 mel bins
-
-
both spectrograms have a final resolution of 96x511 pixels
-
raw audio will be normalized between -1 and 1 before spectrogram conversion
-
we use non-linear magnitude scaling as mentioned in Schlüter 2018
-
V2.4 uses an EfficienNetB0-like backbone with a final embedding size of 1024
-
See this comment for more details
This document provides instructions for downloading and installing the GUI, and conducting some of the most common types of analyses. Within the document, a link is provided to download example sound files that can be used for practice.
Download the PDF here: BirdNET-Analyzer Usage Guide
Watch our presentation on how to use BirdNET-Analyzer to train your own models: BirdNET - BioacousTalks at YouTube
BirdNET powers a number of fantastic community projects dedicated to bird song identification, all of which use models from this repository. These are some highlights, make sure to check them out!
Project | Description |
---|---|
HaikuBox Learn more at: HaikuBox.com |
|
BirdNET-Pi Learn more at: BirdNETPi.com |
|
BirdWeather Learn more at: BirdWeather.com |
|
ecoPi:Bird Learn more at: oekofor.netlify.app |
|
Chirpity Learn more at: chirpity.mattkirkland.co.uk |
|
Go-BirdNET Learn more at: github.com/tphakala/go-birdnet |
|
whoBIRD Learn more at: whoBIRD |
Other cool projects:
-
BirdCAGE is an application for monitoring the bird songs in audio streams: BirdCAGE at GitHub
-
BattyBirdNET-Analyzer is a tool to assist in the automated classification of bat calls: BattyBirdNET-Analyzer at GitHub
Working on a cool project that uses BirdNET? Let us know and we can feature your project here.
We have created an interactive map of projects that use BirdNET. If you are working on a project that uses BirdNET, please let us know here and we can add it to the map.
You can access the map here: Open projects map
If you want to analyze audio files without any additional coding or package install, you can now use Raven Pro software to run BirdNET models. After download, BirdNET is available through the new "Learning detector" feature in Raven Pro. For more information on how to use this feature, please visit the Raven Pro Knowledge Base.
Download the newest model version here, extract the zip-file and move the extracted folder to the Raven models folder. On Windows, the models folder is C:\Users\<Your user name>\Raven Pro 1.6\Models
. Start Raven Pro and select BirdNET_GLOBAL_6K_V2.4_Model_Raven as learning detector.
The easiest way to setup BirdNET on your machine is to install birdnetlib through pip with:
pip3 install birdnetlib
Make sure to install Tensorflow Lite, librosa and ffmpeg like mentioned below. You can run BirdNET with:
from birdnetlib import Recording
from birdnetlib.analyzer import Analyzer
from datetime import datetime
# Load and initialize the BirdNET-Analyzer models.
analyzer = Analyzer()
recording = Recording(
analyzer,
"sample.mp3",
lat=35.4244,
lon=-120.7463,
date=datetime(year=2022, month=5, day=10), # use date or week_48
min_conf=0.25,
)
recording.analyze()
print(recording.detections)
For more examples and documentation, make sure to visit pypi.org/project/birdnetlib/. For any feature request or questions regarding birdnetlib, please contact Joe Weiss or add an issue or PR at github.com/joeweiss/birdnetlib.
Install Python 3:
sudo apt-get update
sudo apt-get install python3-dev python3-pip
pip3 install --upgrade pip
Install TFLite runtime (recommended) or Tensorflow (has to be 2.15):
pip3 install tflite-runtime
OR
pip3 install tensorflow==2.15.0
Install Librosa to handle audio files:
pip3 install librosa resampy
sudo apt-get install ffmpeg
Clone the repository
git clone https://github.com/kahst/BirdNET-Analyzer.git
cd BirdNET-Analyzer
Before you attempt to setup BirdNET-Analyzer on your Windows machine, please consider downloading our fully-packaged version that does not require you to install any additional packages and can be run "as-is".
You can download this version here: BirdNET-Analyzer Windows
-
Download the BirdNET-Analyzer-setup.exe file
-
Before installing, make sure to right-click the exe-file, select "Properties" and check the box "Unblock" under "Security" at the bottom of the "General" tab.
-
If Windows does not display this option, the file can be unblocked with the PowerShell 7 command
Unblock-File -Path .\BirdNET-Analyzer.zip
-
-
During installation, you may see a warning "Windows protected your PC" due to the lack of a digital signature. Simply select "More info" and then "Run anyway" to proceed with the installation.
-
Follow the on-screen instructions
-
After installation, click the desktop icon or navigate to the extracted folder at
C:\Users\<Your user name>\AppData\Local\Programs\BirdNET-Analyzer
-
You can start the analysis through the command prompt with
BirdNET-Analyzer.exe --i "path\to\folder" ...
(see Usage (CLI) section for more details), or you can launchBirdNET-Analyzer-GUI.exe
to start the analysis through a basic GUI.
For more advanced use cases (e.g., hosting your own API server), follow these steps to set up BirdNET-Analyzer on your Windows machine:
Install Python 3.9 or higher (has to be 64bit version)
-
Download and run installer: Download Python installer
|
❗Make sure to check: ☑ "Add path to environment variables" during install❗ |
Install Tensorflow (has to be 2.5 or later), Librosa and NumPy
-
Open command prompt with
Win + S
type "command" and click on "Command Prompt" -
Type
pip install --upgrade pip
-
Type
pip install librosa resampy
-
Install Tensorflow by typing
pip install tensorflow
ℹ️
|
You might need to run the command prompt as "administrator".
Type Win + S , search for command prompt and then right-click, select "Run as administrator".
|
Install Visual Studio Code (optional)
-
Download and install VS Code: Download VS Code installer
-
Select all available options during install
Install BirdNET using Git (for simple download see below)
-
Download and install Git Bash: Download Git Bash installer
-
Select Visual Studio Code as default editor (optional)
-
Keep all other settings as recommended
-
Create folder in personal directory called "Code" (or similar)
-
Change to folder and right click, launch "Git bash here"
-
Type
git clone https://github.com/kahst/BirdNET-Analyzer.git
-
Keep BirdNET updated by running
git pull
for BirdNET-Analyzer folder occasionally
Install BirdNET from zip
-
Download BirdNET: Download BirdNET Zip-file
-
Unpack zip file (e.g., in personal directory)
-
Keep BirdNET updated by re-downloading the zip file occasionally and overwrite existing files
Run BirdNET from command line
-
Open command prompt with
Win + S
type "command" and click on "Command Prompt" -
Navigate to the folder where you installed BirdNET (cd path\to\BirdNET-Analyzer)
-
See Usage (CLI) section for command line arguments
ℹ️
|
With Visual Studio Code installed, you can right-click the BirdNET-Analyzer folder and select "Open with Code". With proper extensions installed (View → Extensions → Python) you will be able to run all scripts from within VS Code. |
ℹ️
|
Installation was only tested on M1 and M2 chips. Feedback on older Intel CPUs or newer M3 chips is welcome! |
You need to install the Xcode command-line tools:
xcode-select --install
Clone the git repository into your prefered folder if you have not done that yet:
cd ~/YOUR_FOLDER
git clone https://github.com/kahst/BirdNET-Analyzer.git
cd BirdNET-Analyzer
We are going to create a virtual environment to install the required packages. Virtual environments allow you to manage separate package installations for different projects.
python3 -m venv venv-birdnet
source venv-birdnet/bin/activate
python -m pip install -U pip
The nexttime you want to use BirdNET, go to the BirdNET-Analyzer folder and run source venv-birdnet/bin/activate
to activate the virtual environment.
TensorFlow for macOS and Metal plug-in:
python -m pip install tensorflow==2.15.0 tensorflow-metal
Librosa and ffmpeg:
python -m pip install librosa resampy
Run the example. It will take a while the first time you run it. Subsequent runs will be faster.
python analyze.py
ℹ️
|
Now, you can install and use birdnetlib. |
-
Inspect config file for options and settings, especially inference settings. Specify a custom species list if needed and adjust the number of threads TFLite can use to run the inference.
-
Run
analyzer.py
to analyze an audio file. You need to set paths for the audio file and selection table output. Here is an example:python3 analyze.py --i /path/to/audio/folder --o /path/to/output/folder
ℹ️Your custom species list has to be named 'species_list.txt' and the folder containing the list needs to be specified with --slist /path/to/folder
. You can also specify the number of CPU threads that should be used for the analysis with--threads <Integer>
(e.g.,--threads 16
). If you provide GPS coordinates with--lat
and--lon
, the custom species list argument will be ignored.Here’s a complete list of all command line arguments:
--i, Path to input file or folder. If this is a file, --o needs to be a file too. --o, Path to output file or folder. If this is a file, --i needs to be a file too. --lat, Recording location latitude. Set -1 to ignore. --lon, Recording location longitude. Set -1 to ignore. --week, Week of the year when the recording was made. Values in [1, 48] (4 weeks per month). Set -1 for year-round species list. --slist, Path to species list file or folder. If folder is provided, species list needs to be named "species_list.txt". If lat and lon are provided, this list will be ignored. --sensitivity, Detection sensitivity; Higher values result in higher sensitivity. Values in [0.5, 1.5]. Defaults to 1.0. --min_conf, Minimum confidence threshold. Values in [0.01, 0.99]. Defaults to 0.1. --overlap, Overlap of prediction segments. Values in [0.0, 2.9]. Defaults to 0.0. --rtype, Specifies output format. Values in ['table', 'audacity', 'r', 'kaleidoscope', 'csv']. Defaults to 'table' (Raven selection table). --threads, Number of CPU threads. --batchsize, Number of samples to process at the same time. Defaults to 1. --locale, Locale for translated species common names. Values in ['af', 'de', 'it', ...] Defaults to 'en'. --sf_thresh, Minimum species occurrence frequency threshold for location filter. Values in [0.01, 0.99]. Defaults to 0.03. --classifier, Path to custom trained classifier. Defaults to None. If set, --lat, --lon and --locale are ignored. --fmin and --fmax, Minimum and maximum frequency for bandpass filter. Defaults to 0 and 15000. --output_file, Path to combined Raven selection table. If set and rtype is 'table', all results will be combined into this file. Defaults to None. --skip_existing_results, skip files that have already been analyzed. Defaults to False.
Here are two example commands to run this BirdNET version:
python3 analyze.py --i example/ --o example/ --slist example/ --min_conf 0.5 --threads 4 python3 analyze.py --i example/ --o example/ --lat 42.5 --lon -76.45 --week 4 --sensitivity 1.0
-
Run
embeddings.py
to extract feature embeddings instead of class predictions. Result file will contain timestamps and lists of float values representing the embedding for a particular 3-second segment. Embeddings can be used for clustering or similarity analysis. Here is an example:python3 embeddings.py --i example/ --o example/ --threads 4 --batchsize 16
Here’s a complete list of all command line arguments:
--i, Path to input file or folder. If this is a file, --o needs to be a file too. --o, Path to output file or folder. If this is a file, --i needs to be a file too. --overlap, Overlap of prediction segments. Values in [0.0, 2.9]. Defaults to 0.0. --threads, Number of CPU threads. --batchsize, Number of samples to process at the same time. Defaults to 1. --fmin and --fmax, Minimum and maximum frequency for bandpass filter. Defaults to 0 and 15000.
-
After the analysis, run
segments.py
to extract short audio segments for species detections to verify results. This way, it might be easier to review results instead of loading hundreds of result files manually.Here’s a complete list of all command line arguments:
--audio, Path to folder containing audio files. --results, Path to folder containing result files. --o, Output folder path for extracted segments. --min_conf, Minimum confidence threshold. Values in [0.01, 0.99]. Defaults to 0.1. --max_segments, Number of randomly extracted segments per species. --seg_length, Length of extracted segments in seconds. Defaults to 3.0. --threads, Number of CPU threads.
-
When editing your own
species_list.txt
file, make sure to copy species names from the labels file of each model.You can find label files in the checkpoints folder, e.g.,
checkpoints/V2.3/BirdNET_GLOBAL_3K_V2.3_Labels.txt
.Species names need to consist of
scientific name_common name
to be valid. -
You can generate a species list for a given location using
species.py
in case you need it for reference. Here is an example:python3 species.py --o example/species_list.txt --lat 42.5 --lon -76.45 --week 4
Here’s a complete list of all command line arguments:
--o, Path to output file or folder. If this is a folder, file will be named 'species_list.txt'. --lat, Recording location latitude. --lon, Recording location longitude. --week, Week of the year when the recording was made. Values in [1, 48] (4 weeks per month). Set -1 for year-round species list. --threshold, Occurrence frequency threshold. Defaults to 0.03. --sortby, Sort species by occurrence frequency or alphabetically. Values in ['freq', 'alpha']. Defaults to 'freq'.
The year-round list may contain some species, that are not included in any list for a specific week. See kahst#211 for more details.
-
This is a very basic version of the analysis workflow, you might need to adjust it to your own needs.
-
Please open an issue to ask for new features or to document unexpected behavior.
-
I will keep models up to date and upload new checkpoints whenever there is an improvement in performance. I will also provide quantized and pruned model files for distribution.
Install docker for Ubuntu:
sudo apt install docker.io
Build Docker container:
sudo docker build -t birdnet .
ℹ️
|
You need to run docker build again whenever you make changes to the script. |
In order to pass a directory that contains your audio files to the docker file, you need to mount it inside the docker container with -v /my/path:/mount/path
before you can run the container.
You can run the container for the provided example soundscapes with:
sudo docker run -v $PWD/example:/audio birdnet analyze.py --i audio --o audio --slist audio
You can adjust the directory that contains your recordings by providing an absolute path:
sudo docker run -v /path/to/your/audio/files:/audio birdnet analyze.py --i audio --o audio --slist audio
You can also mount more than one drive, e.g., if input and output folder should be different:
sudo docker run -v /path/to/your/audio/files:/input -v /path/to/your/output/folder:/output birdnet analyze.py --i input --o output --slist input
See Usage (CLI) section above for more command line arguments, all of them will work with Docker version.
ℹ️
|
If you like to specify a species list (which will be used as post-filter and needs to be named 'species_list.txt'), you need to put it into a folder that also has to be mounted. |
You can host your own analysis service and API by launching the server.py
script.
This will allow you to send files to this server, store submitted files, analyze them and send detection results back to a client.
This could be a local service, running on a desktop PC, or a remote server.
The API can be accessed locally or remotely through a browser or Python client (or any other client implementation).
-
Install one additional package with
pip3 install bottle
. -
Start the server with
python3 server.py
. You can also specify a host name or IP and port number, e.g.,python3 server.py --host localhost --port 8080
.Here’s a complete list of all command line arguments:
--host, Host name or IP address of API endpoint server. Defaults to '0.0.0.0'. --port, Port of API endpoint server. Defaults to 8080. --spath, Path to folder where uploaded files should be stored. Defaults to '/uploads'. --threads, Number of CPU threads for analysis. Defaults to 4. --locale, Locale for translated species common names. Values in ['af', 'de', 'it', ...] Defaults to 'en'.
ℹ️The server is single-threaded, so you’ll need to start multiple instances for higher throughput. This service is intented for short audio files (e.g., 1-10 seconds). -
Query the API with a client. You can use the provided Python client or any other client implementation. Request payload needs to be
multipart/form-data
with the following fields:audio
for raw audio data as byte code, andmeta
for additional information on the audio file. Take a look at our example client implementation in theclient.py
script.This script will read an audio file, generate metadata from command line arguments and send it to the server. The server will then analyze the audio file and send back the detection results which will be stored as a JSON file.
Here’s a complete list of all command line arguments:
--host, Host name or IP address of API endpoint server. --port, Port of API endpoint server. --i, Path to file that should be analyzed. --o, Path to result file. Leave blank to store with audio file. --lat, Recording location latitude. Set -1 to ignore. --lon, Recording location longitude. Set -1 to ignore. --week, Week of the year when the recording was made. Values in [1, 48] (4 weeks per month). Set -1 for year-round species list. --overlap, Overlap of prediction segments. Values in [0.0, 2.9]. Defaults to 0.0. --sensitivity, Detection sensitivity; Higher values result in higher sensitivity. Values in [0.5, 1.5]. Defaults to 1.0. --pmode, Score pooling mode. Values in ['avg', 'max']. Defaults to 'avg'. --num_results, Number of results per request. --sf_thresh, Minimum species occurrence frequency threshold for location filter. Values in [0.01, 0.99]. Defaults to 0.03. --save, Define if files should be stored on server. Values in [True, False]. Defaults to False.
-
Parse results from the server. The server will send back a JSON response with the detection results. The response also contains a
msg
field, indicatingsuccess
orerror
. Results consist of a sorted list of (species, score) tuples.This is an example response:
{"msg": "success", "results": [["Poecile atricapillus_Black-capped Chickadee", 0.7889], ["Spinus tristis_American Goldfinch", 0.5028], ["Junco hyemalis_Dark-eyed Junco", 0.4943], ["Baeolophus bicolor_Tufted Titmouse", 0.4345], ["Haemorhous mexicanus_House Finch", 0.2301]]}
ℹ️Let us know if you have any questions, suggestions, or feature requests. Also let us know when hosting an analysis service - we would love to give it a try.
We provide a very basic GUI which lets you launch the analysis through a web interface.
-
You need to install two additional packages in order to use the GUI with
pip3 install pywebview gradio
-
Launch the GUI with
python3 gui.py
. -
Set all folders and parameters, after that, click 'Analyze'.
You can train your own custom classifier on top of BirdNET. This is useful if you want to detect species that are not included in the default species list. You can also use this to train a classifier for a specific location or season. All you need is a dataset of labeled audio files, organized in folders by species (we use folder names as labels). This also works for non-bird species, as long as you have a dataset of labeled audio files. Audio files will be resampled to 48 kHz and converted into 3-second segments (we will use the center 3-second segment if the file is longer, we will pad with random noise if the file is shorter). We recommend using at least 100 audio files per species (although training also works with less data). You can download a sample training data set here.
-
Collect training data and organize in folders based on species names.
-
Species labels should be in the format
<scientific name>_<species common name>
(e.g.,Poecile atricapillus_Black-capped Chickadee
), but other formats work as well. -
It can be helpful to include a non-event class. If you name a folder 'Noise', 'Background', 'Other' or 'Silence', it will be treated as a non-event class.
-
Run the training script with
python3 train.py --i <path to training data folder> --o <path to trained classifier model output>
.Here is a list of all command line arguments:
--i, Path to training data folder. Subfolder names are used as labels. --o, Path to trained classifier model output. --crop_mode, Crop mode for training data. Values in ['center', 'first', 'segments']. Defaults to 'center'. --crop_overlap, Overlap of training data segments in seconds if crop_mode is 'segments'. Defaults to 0. --epochs, Number of training epochs. Defaults to 50. --batch_size, Batch size. Defaults to 32. --val_split, Validation split ratio. Defaults to 0.2. --learning_rate, Learning rate. Defaults to 0.001. --hidden_units, Number of hidden units. Defaults to 0. If set to >0, a two-layer classifier is used. --dropout, Dropout rate. Defaults to 0. --mixup, Whether to use mixup for training. --upsampling_ratio, Balance train data and upsample minority classes. Values between 0 and 1. Defaults to 0. --upsampling_mode, Upsampling mode. Can be 'repeat', 'mean' or 'smote'. Defaults to 'repeat'. --model_format, Model output format. Can be 'tflite', 'raven' or 'both'. Defaults to 'tflite'. --model_save_mode, Model save mode. Can be 'replace' or 'append'. Defaults to 'replace'. --cache_mode, Cache mode. Can be 'none', 'load' or 'save'. Defaults to 'none'. --cache_file, Path to cache file. Defaults to 'train_cache.npz'. --threads, Number of CPU threads. --fmin and --fmax, Minimum and maximum frequency for bandpass filter. Defaults to 0 and 15000. --autotune, Whether to use automatic hyperparameter tuning (this will execute multiple training runs to search for optimal hyperparameters). --autotune_trials, Number of training runs for hyperparameter tuning. Defaults to 50. --autotune_executions_per_trial, The number of times a training run with a set of hyperparameters is repeated. Defaults to 1.
-
After training, you can use the custom trained classifier with the
--classifier
argument of theanalyze.py
script. If you want to use the custom classifier in Raven, make sure to set--model_format raven
.ℹ️Adjusting hyperparameters (e.g., number of hidden units, learning rate, etc.) can have a big impact on the performance of the classifier. We recommend trying different hyperparameter settings. If you want to automate this process, you can use the --autotune
argument (in that case, make sure to install keras_tuner withpip3 install keras-tuner
).Example usage (when downloading and unzipping the sample training data set):
python3 train.py --i train_data/ --o checkpoints/custom/Custom_Classifier.tflite python3 analyze.py --classifier checkpoints/custom/Custom_Classifier.tflite
ℹ️Setting a custom classifier will also set the new labels file. Due to these custom labels, the location filter and locale will be disabled. -
You can include negative samples for classes by prefixing the folder names with a '-' (e.g.,
-Poecile atricapillus_Black-capped Chickadee
). Do this with samples that definitely do not contain the species. Negative samples will only be used for training and not for validation. Also keep in mind that negative samples will only be used when a corresponding folder with positive samples exists. Negative samples cannot be used for binary classification, instead include these samples in the non-event folder. -
To train with multi-label data separate the class labels with commas in the folder names (e.g.,
Poecile atricapillus_Black-capped Chickadee, Cardinalis cardinalis_Northern Cardinal
). This can also be combined with negative samples as described above. The validation split will be performed combination of classes, so you might want to ensure sufficient data for each combination of classes. When using multi-label data the upsampling mode will be limited to 'repeat'.
This project is supported by Jake Holshuh (Cornell class of ’69) and The Arthur Vining Davis Foundations. Our work in the K. Lisa Yang Center for Conservation Bioacoustics is made possible by the generosity of K. Lisa Yang to advance innovative conservation technologies to inspire and inform the conservation of wildlife and habitats.
The German Federal Ministry of Education and Research is funding the development of BirdNET through the project "BirdNET+" (FKZ 01|S22072). Additionally, the German Federal Ministry of Environment, Nature Conservation and Nuclear Safety is funding the development of BirdNET through the project "DeepBirdDetect" (FKZ 67KI31040E).