https://github.com/birdnet-team/biodcase-tiny-2025
Development framework for the BioDCASE-Tiny 2025 competition
Science Score: 39.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
○CITATION.cff file
-
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
✓DOI references
Found 5 DOI reference(s) in README -
○Academic publication links
-
○Academic email domains
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (15.5%) to scientific vocabulary
Keywords
Repository
Development framework for the BioDCASE-Tiny 2025 competition
Basic Info
- Host: GitHub
- Owner: birdnet-team
- License: apache-2.0
- Language: Python
- Default Branch: main
- Homepage: https://biodcase.github.io/challenge2025/task3
- Size: 765 KB
Statistics
- Stars: 6
- Watchers: 3
- Forks: 1
- Open Issues: 1
- Releases: 0
Topics
Metadata Files
README.md
This repository contains the development framework for the BioDCASE-Tiny 2025 competition (Task 3), focusing on TinyML implementation for bird species recognition on the ESP32-S3-Korvo-2 development board.
For complete competition details, visit the official BioDCASE 2025 Task 3 website.
Background
BioDCASE-Tiny is a competition for developing efficient machine learning models for bird audio recognition that can run on resource-constrained embedded devices. The project uses the ESP32-S3-Korvo-2 development board, which offers audio processing capabilities in a small form factor suitable for field deployment.
Table of Contents
- Setup and Installation
- Usage
- Dataset
- Development
- ESP32-S3-Korvo-2 Development Board
- Code Structure
- Development Tips
- Evaluation Metrics
- License
- Citation
- Funding
- Partners
Setup and Installation
Prerequisites
- Python 3.11+ with pip and venv
- Docker for ESP-IDF environment
- USB cable and ESP32-S3-Korvo-2 development board
Installation Steps
Clone the repository:
bash git clone https://github.com/birdnet-team/BioDCASE-Tiny-2025.git cd BioDCASE-Tiny-2025Create a virtual environment (recommended)
bash
python3 -m venv .venv
source .venv/bin/activate
Install Python dependencies:
bash pip install -e .Set your serial device port in the pipeline_config.yaml
yaml
embedded_code_generation:
serial_device: <YOUR_DEVICE>
Running on Windows
As the required tflite-micro package is not easily available for Windows we recommend using WSL to run this project.
To make your device accessible for WSL you can use this guide: https://learn.microsoft.com/en-us/windows/wsl/connect-usb
To determine your serial device port you can use the following command:
bash
dmesg | grep tty
You might also need to grant some rights to run the deployment:
bash
sudo adduser $USER dialout
sudo chmod a+rw $SERIAL_PORT
Usage
- Modify model.py with your architecture (make sure to compile with optimizer and loss)
- Modify the training loop in the same file, if you need to
- Modify pipeline_config.yaml parameters of feature extraction
- run biodcase.py
Important: Writing custom features rather than using what is implemented here, requires implementing a numerically equivalent version on the embedded target too, as that is a necessary condition for the evaluated model to behave identically on the host and on the embedded target. This is a non-trivial undertaking, so we generally advice to stick to what is already implemented in this repository.
Dataset
The BioDCASE-Tiny 2025 competition uses a specialized dataset of Yellowhammer bird vocalizations. Key features include:
- 2+ hours of audio recordings
- Songs from multiple individuals recorded at various distances (6.5m to 200m)
- Recordings in different environments (forest and grassland)
- Includes negative samples (other bird species and background noise)
- Dataset is split into training, validation, and evaluation sets
The training set contains recordings from 8 individuals, while the validation set contains recordings from 2 individuals. An additional 2 individuals are reserved for the final evaluation.
Dataset Structure
The dataset is organized as follows:
Development_Set/
├── Training_Set/
│ ├── Yellowhammer/
│ │ └── *.wav (Yellowhammer vocalizations)
│ └── Negatives/
│ └── *.wav (Other species and background noise)
└── Validation_Set/
├── Yellowhammer/
│ └── *.wav (Yellowhammer vocalizations)
└── Negatives/
└── *.wav (Other species and background noise)
Yellowhammer/ - Contains target species vocalizations with filenames following format
YH_SongID_Location_Distance.wav- SongID: 3-digit identifier for each song
- Location: "forest", "grassland", or "speaker" for original recordings
- Distance: A (original) through H (farthest at ~200m)
Negatives/ - Contains negative samples with filenames following format
Type_ID.wav- Type: "Background" for noise or "bird" for non-target species vocalizations
- ID: File identifier
Download
Download the dataset from: BioDCASE-Tiny 2025 Dataset
After downloading paste the folders into /data/01_raw/clips
Development
Quickstart
To run the complete pipeline execute:
bash
python biodcase.py
This will execute the data preprocessing, extract the features, train the model and deploy it to your board.
Once deployed, benchmarking code on the ESP32-S3 will display info, via serial monitor, about the runtime performance of the preprocessing steps and actual model.
Step-by-Step Deployment Instructions
The steps of the pipeline can be executed individually
Data Preprocessing
bash python data_preprocessing.pyFeature Extraction
bash python feature_extraction.pyModel Training
bash python model_training.pyDeployment
bash python embedded_code_generation.py
Data Processing Pipeline
The data processing pipeline follows these steps:
1. Raw audio files are read and preprocessed
2. Features are extracted according to configuration in pipeline_config.yaml
3. The dataset is split into training/validation/testing sets
4. Features are used for model training
Model Training
The model training process is managed in model_training.py. You can customize:
- Model architecture in model.py and, optionally, the training loop
- Training hyperparameters in pipeline_config.yaml
- Feature extraction parameters to optimize model input
ESP32-S3 Deployment
To deploy your model to the ESP32-S3-Korvo-2 board, you'll use the built-in deployment tools that handle model conversion, code generation, and flashing. The deployment process:
- Converts your trained Keras model to TensorFlow Lite format optimized for the ESP32-S3
- Packages your feature extraction configuration for embedded use
- Generates C++ code that integrates with the ESP-IDF framework
- Compiles the firmware using Docker-based ESP-IDF toolchain
- Flashes the compiled firmware to your connected ESP32-S3-Korvo-2 board
ESP32-S3-Korvo-2 Development Board
The ESP32-S3-Korvo-2 board features: - ESP32-S3 dual-core processor - Built-in microphone array - Audio codec for high-quality audio processing - Wi-Fi and Bluetooth connectivity - USB-C connection for programming and debugging
Code Structure
Key Entry Points
biodcase.py- Main execution pipelinemodel.py- Define your model architecturefeature_extraction.py- Audio feature extraction implementationsembedded_code_generation.py- ESP32 code generation utilitiesbiodcase_tiny/embedded/esp_target.py- ESP target definition and configurationbiodcase_tiny/embedded/firmware/main- Firmware source code
Benchmarking
The codebase includes performance benchmarking tools that measure: - Feature extraction time - Model inference time - Memory usage on the target device
Development Tips
Feature Extraction Parameters: Carefully tune the feature extraction parameters in
pipeline_config.yamlfor your specific audio dataset.Model Size: Keep your model compact. The ESP32-S3 has limited memory, so optimize your architecture accordingly.
Profiling: Use the profiling tools to identify bottlenecks in your implementation.
Memory Management: Be mindful of memory allocation on the ESP32. Monitor the allocations reported by the firmware.
Docker Environment: The toolchain uses Docker to provide a consistent ESP-IDF environment, making it easier to build on any host system.
Evaluation Metrics
The BioDCASE-Tiny competition evaluates models based on multiple criteria:
Classification Performance
- Average precision: the average value of precision across all recall levels from 0 to 1.
Resource Efficiency
- Model Size: Tflite model file size (KB)
- Inference Time: Average time required for single audio classification, including feature extraction (ms)
- Peak Memory Usage: Maximum RAM usage during inference (KB)
Ranking
Participants will be ranked separately for each one of the evaluation criteria.
License
This project is licensed under the Apache License 2.0 - see the license headers in individual files for details.
Citation
If you use the BioDCASE-Tiny framework or dataset in your research, please cite the following:
Framework Citation
bibtex
@misc{biodcase_tiny_2025,
author = {Carmantini, Giovanni and Förstner, Friedrich and Isik, Can and Kahl, Stefan},
title = {BioDCASE-Tiny 2025: A Framework for Bird Species Recognition on Resource-Constrained Hardware},
year = {2025},
institution = {Cornell University and Chemnitz University of Technology},
type = {Software},
publisher = {GitHub},
journal = {GitHub Repository},
howpublished = {\url{https://github.com/birdnet-team/BioDCASE-Tiny-2025}}
}
Dataset Citation
bibtex
@dataset{yellowhammer_dataset_2025,
author = {Morandi, Ilaria and Linhart, Pavel and Kwak, Minkyung and Petrusková, Tereza},
title = {BioDCASE 2025 Task 3: Bioacoustics for Tiny Hardware Development Set},
year = {2025},
publisher = {Zenodo},
doi = {10.5281/zenodo.15228365},
url = {https://doi.org/10.5281/zenodo.15228365}
}
Funding
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 development of BirdNET is supported by the German Federal Ministry of Education and Research through the project “BirdNET+” (FKZ 01|S22072). The German Federal Ministry for the Environment, Nature Conservation and Nuclear Safety contributes through the “DeepBirdDetect” project (FKZ 67KI31040E). In addition, the Deutsche Bundesstiftung Umwelt supports BirdNET through the project “RangerSound” (project 39263/01).
Partners
BirdNET is a joint effort of partners from academia and industry. Without these partnerships, this project would not have been possible. Thank you!

Owner
- Name: BirdNET-Team
- Login: birdnet-team
- Kind: organization
- Location: Germany
- Repositories: 1
- Profile: https://github.com/birdnet-team
GitHub Events
Total
- Issues event: 1
- Watch event: 3
- Issue comment event: 1
- Push event: 7
- Public event: 1
- Pull request event: 5
- Fork event: 1
- Create event: 2
Last Year
- Issues event: 1
- Watch event: 3
- Issue comment event: 1
- Push event: 7
- Public event: 1
- Pull request event: 5
- Fork event: 1
- Create event: 2
Dependencies
- docker.io/espressif/idf $IDF_TAG build
- absl-py 2.1.0
- annotated-types 0.7.0
- astunparse 1.6.3
- audioread 3.0.1
- certifi 2025.1.31
- cffi 1.17.1
- charset-normalizer 3.4.1
- click 8.1.8
- cloudpickle 3.1.1
- colorama 0.4.6
- contourpy 1.3.1
- cycler 0.12.1
- dask 2025.2.0
- decorator 5.1.1
- docker 7.1.0
- flatbuffers 25.2.10
- fonttools 4.56.0
- fsspec 2025.3.0
- gast 0.6.0
- google-pasta 0.2.0
- grpcio 1.70.0
- h5py 3.12.1
- idna 3.10
- importlib-metadata 8.6.1
- iniconfig 2.0.0
- jinja2 3.1.6
- joblib 1.4.2
- kaleido 0.2.1
- keras 3.8.0
- kiwisolver 1.4.8
- lazy-loader 0.4
- libclang 18.1.1
- librosa 0.10.2.post1
- llvmlite 0.44.0
- locket 1.0.0
- markdown 3.7
- markdown-it-py 3.0.0
- markupsafe 3.0.2
- matplotlib 3.9.4
- mdurl 0.1.2
- ml-dtypes 0.4.1
- msgpack 1.1.0
- namex 0.0.8
- narwhals 1.31.0
- numba 0.61.0
- numpy 2.0.2
- opt-einsum 3.4.0
- optree 0.14.0
- packaging 24.2
- pandas 2.2.3
- partd 1.4.2
- pillow 11.1.0
- platformdirs 4.3.6
- plotly 6.0.1
- pluggy 1.5.0
- pooch 1.8.2
- protobuf 5.29.3
- pyarrow 19.0.1
- pycparser 2.22
- pydantic 2.11.3
- pydantic-core 2.33.1
- pygments 2.19.1
- pyparsing 3.2.1
- pytest 8.3.5
- python-dateutil 2.9.0.post0
- pytz 2025.1
- pywin32 308
- pyyaml 6.0.2
- requests 2.32.3
- rich 13.9.4
- scikit-learn 1.6.1
- scipy 1.15.1
- setuptools 75.8.0
- six 1.17.0
- soundfile 0.13.1
- soxr 0.5.0.post1
- tensorboard 2.18.0
- tensorboard-data-server 0.7.2
- tensorflow 2.18.0
- tensorflow-io-gcs-filesystem 0.37.1
- termcolor 2.5.0
- tflite-micro 0.dev20250207030249
- threadpoolctl 3.5.0
- toolz 1.0.0
- tqdm 4.67.1
- typing-extensions 4.12.2
- typing-inspection 0.4.0
- tzdata 2025.1
- urllib3 2.3.0
- werkzeug 3.1.3
- wheel 0.45.1
- wrapt 1.17.2
- zipp 3.21.0
- dask ^2025.2.0
- docker ^7.1.0
- jinja2 ^3.1.6
- kaleido 0.2.1
- keras ^3.8.0
- librosa ^0.10.2.post1
- llvmlite >=0.44
- matplotlib <3.10
- numba ^0.61.0
- numpy <2.2
- pandas ^2.2.3
- plotly ^6.0.1
- pyarrow ^19.0.1
- pydantic ^2.11.3
- pytest ^8.3.5
- python ^3.11
- tensorflow ^2.18.0
- tflite-micro ^0.dev20250207030249
- tqdm ^4.67.1