# UAV Acoustic Localization Dataset **Paper:** "Beamformed 360-Degree Sound Maps: U-Net-Driven Acoustic Source Segmentation and Localization" (IWAENC 2026) Extended version: "Acoustic Imaging for UAV Detection: Dense Beamformed Energy Maps and U-Net SELD" Belman Jahir Rodríguez, Sergio F. Chevtchenko, Marcelo Herrera Martínez, Yeshwanth Bethi, Saeed Afshar International Centre for Neuromorphic Systems (ICNS), Western Sydney University arXiv: 2508.00307 --- ## What is this? A real-world open-field dataset of a DJI Air 3 drone recorded with a custom **24-microphone 3D array**, synchronized with GPS flight logs. The goal is acoustic Sound Source Localization (SSL) formulated as **dense semantic segmentation** over beamformed azimuth–elevation energy maps. --- ## Quick Start — what to use for each split | Split | Use these folders / segments | Approx. duration | |---|---|---| | **Training** | `training/Nov_25_2024/flight_11` (drone) + `training/Mar_18_2025/flight_1` (drone) + `test_2/Mar_18_2025/flight_2` → segment `no_drone_1` (ambient) | 22 + 30 + ~4.8 min | | **Test 1** | `test_1/Oct_11_2024/flight_5` (drone + ambient, unseen location) | 3 + 1 min | | **Test 2** | `test_2/Mar_18_2025/flight_2` → segment `drone` + segment `no_drone_2` (ambient) | 20 + ~4.8 min | The one counter-intuitive part: `training/Mar_18_2025/flight_1` has **no ambient/no-drone audio of its own** — its negative-class data is borrowed from a different folder (`test_2/.../flight_2`). See **"Where the no-drone audio comes from"** below for the full explanation before you start processing. --- ## Recording Sessions | Session | Flight ID | Location | Role | Audio+CSV Size | Folder Size (incl. 360° video) | Notes | |---|---|---|---|---|---|---| | Oct 11, 2024 | 5 | Site 2 | Test 1 | ~1.1 GB | ~3.0 GB | 3 min drone + 1 min no-drone; unseen location, 360° video included (`VID_20241011_144730_00_009 1.mp4`, ~1.9 GB) | | Nov 25, 2024 | 11 | Site 1 | Training | ~7.1 GB | ~27 GB | 22 min drone; 360° video included (`VID_20241125_153442_00_011.insv`, ~20 GB, raw Insta360 format) | | Mar 18, 2025 | 1 | Site 1 | Training | ~8.1 GB | ~8.1 GB | 30 min drone only — no ambient audio of its own, see below; no 360° video for this session | | Mar 18, 2025 | 2 | Site 1 | Test 2 | ~11 GB | ~11 GB | 20 min drone + ~10 min ambient tail, one continuous WAV, split for two purposes — see below; no 360° video for this session | --- ## Microphone Array - 24 channels, 4 Zoom F6 recorders (6 ch each), 48 kHz - Three tripod legs with 6 Rode mics each (upright tetrahedral) + 1 horizontal ring of 6 mics - Inter-mic distances: 4 cm – 1.1 m - Effective frequency range: 200–4000 Hz (spatial aliasing / resolution) - Sync: synthetic impulse at array origin → ±1 sample accuracy (7 mm acoustic error) - 360° video: Insta360 X4 mounted on top ### Mic positions | Ring | Mics | Radius (m) | Height (m) | Azimuth offsets | |------|------|-----------|-----------|-----------------| | Z3 | 1–3 | 0.10 | 1.12 | 0°, −120°, −240° | | Z3 | 4–6 | 0.17 | 0.92 | 0°, −120°, −240° | | Z2 | 7–9 | 0.25 | 0.77 | 0°, −120°, −240° | | Z2 | 10–12| 0.32 | 0.60 | 0°, −120°, −240° | | Z1 | 13–15| 0.42 | 0.42 | 0°, −120°, −240° | | Z1 | 16–18| 0.63 | 0.02 | 0°, −120°, −240° | | Z0 | 19–24| 0.25 | 0.77 | −40°, −80°, −160°, −200°, −280°, −320° | --- ## Dataset Structure The precomputed `.npz` beamformed chunks (~2 TB) are **not included**; use the scripts in `code/` to regenerate them directly from the WAV files below plus the flight-log CSVs. Sessions are grouped by their **role in the paper's train/val/test split** (`training/`, `test_1/`, `test_2/`) rather than by date, so it's immediately clear which folder to use for each purpose. ``` dataset/ training/ Nov_25_2024/ # ~22 min drone, Site 1 flight_11/ *_device_{1..4}_nosync_part1.wav Nov-25th-2024-04-32PM-Flight-Airdata.csv alignment_params.json ref/ Nov-25th-2024-03-19PM-Flight-Airdata.csv Mar_18_2025/ # ~30 min drone only, Site 1 flight_1/ *_device_{1..4}_nosync_part1.wav Mar-18th-2025-11-19AM-Flight-Airdata.csv alignment_params.json # this flight has NO no-drone audio of its own — see note below ref/ Mar-18th-2025-10-31AM-Flight-Airdata.csv test_1/ Oct_11_2024/ # ~3 min drone + ~1 min no-drone, Site 2 (unseen location) flight_5/ device_{1..4}_nosync.wav Oct-11th-2024-03-49PM-Flight-Airdata.csv alignment_params.json # skip_seconds, corrections, start_index, etc. ref/ DJIFlightRecord_2024-10-11_[14-32-34].csv # reference flight over array center test_2/ Mar_18_2025/ # 20 min drone + no-drone tail (split for train+test), Site 1 flight_2/ *_device_{1..4}_nosync_part1.wav # drone (0-1290s) + no_drone_1 (1290-1577s) + no_drone_2 (1577-1864s) *_device_{1..4}_nosync_part2.wav # separate later continuation, NOT used to build the paper's dataset (kept for completeness only) Mar-18th-2025-11-55AM-Flight-Airdata.csv alignment_params.json # segments: drone (test_2), no_drone_1 (training!), no_drone_2 (test_2) ref/ Mar-18th-2025-10-31AM-Flight-Airdata.csv # same reference flight as training/Mar_18_2025 (duplicated here for convenience) code/ audio_beamforming.py # delay-and-sum beamforming core geo_utils.py # GPS -> Cartesian, azimuth/elevation io_utils.py # WAV loading, sync alignment, CSV parsing requirements.txt dataset_creation/ create_dataset.py # unified script — use this (see "Reproducing the NPZ Dataset" below) ``` This release covers the dataset and the code to regenerate the beamformed NPZ chunks from it — it does **not** include the model training or inference code, or the trained model weights. --- ## Alignment Parameters Each session folder has an `alignment_params.json` with: | Parameter | Description | |---|---| | `corrections_samples` | Per-device fine offset in samples (48 kHz) to correct inter-device clock drift | | `ref_csv` | Reference flight CSV used to define the GPS coordinate origin (0,0,0) | | `segments[].skip_seconds` | Seconds to seek from WAV start to reach that segment | | `segments[].start_index_csv` | First CSV row where the drone is airborne (skip motor-start rows) | | `segments[].initial_azimuth_deg` | Manual azimuth offset to align GPS frame with array orientation | | `segments[].flight_csv` | AirData CSV for this segment (`null` for no-drone segments) | All beamforming and dataset generation is done directly from the WAV files using the `skip_seconds` + `corrections_samples` offsets in `alignment_params.json`. ### Where the no-drone audio comes from All no-drone (negative class) audio in this dataset comes from a single place: **`test_2/Mar_18_2025/flight_2`**'s WAV files, in the ~574 s tail recorded after the drone landed (seconds 1290–1864). It is **embedded in the same continuous WAV** as the drone flight — do not pre-cut it. Use the `skip_seconds` / `skip_seconds_end` from `alignment_params.json` directly, as `create_dataset.py` does. This tail is split into two non-overlapping halves so train and test never share frames: - **`no_drone_1`** (seconds 1290–1577, `role: training`) — pair with `training/Mar_18_2025/flight_1` and `training/Nov_25_2024/flight_11` to form the full training set. - **`no_drone_2`** (seconds 1577–1864, right after `no_drone_1`, `role: test_2`) — pair with `flight_2`'s own `drone` segment to form Test 2. Both segments are defined in `test_2/Mar_18_2025/flight_2/alignment_params.json` → `segments`. `training/Mar_18_2025/flight_1` has **no no-drone WAVs of its own** — when generating its training NPZ chunks, also run `create_dataset.py` against `test_2/Mar_18_2025/flight_2/alignment_params.json --segment no_drone_1` and include that output in the training set. This split was verified directly against the actual NPZ chunks used to train the paper's model (`audio_time_s` field: `no_drone_1` ranges 1290.0–1576.9s, `no_drone_2` ranges 1577.0–1864.0s) and against the model's `hyperparams.yaml` (`train_folder` includes `.../Mar_18_2025/2_no_drone_1/`, `test_folder` includes `.../Mar_18_2025/2_no_drone_2/`). Note: `flight_2`'s folder also contains `*_part2.wav` files — a separate, later continuation recording (~534s). These were **not** used to build the paper's dataset (confirmed against the original dataset-creation scripts and the released NPZ chunks, which only reference `part1`); they are kept here only as extra unused audio, in case it's useful to future users. All labels for no-drone chunks are 0. --- ## Reproducing the NPZ Dataset The WAV files and CSVs are already in place under `dataset///`. To regenerate the full beamformed NPZ dataset (not included here due to size, ~2 TB): 1. Install dependencies: ```bash pip install -r code/requirements.txt pip install pyproj pyyaml ``` 2. Run the unified dataset creation script for each session: ```bash cd code/dataset_creation # Test 1 (Oct 2024, Site 2, unseen location) python create_dataset.py --config ../../dataset/test_1/Oct_11_2024/flight_5/alignment_params.json # Training — Nov 2024 drone flight python create_dataset.py --config ../../dataset/training/Nov_25_2024/flight_11/alignment_params.json # Training — Mar 2025 flight 1 (drone) python create_dataset.py --config ../../dataset/training/Mar_18_2025/flight_1/alignment_params.json # Training — no-drone half (from flight_2's WAVs!) — include this output in the training set python create_dataset.py --config ../../dataset/test_2/Mar_18_2025/flight_2/alignment_params.json --segment no_drone_1 # Test 2 — Mar 2025 flight 2 (drone segment) python create_dataset.py --config ../../dataset/test_2/Mar_18_2025/flight_2/alignment_params.json --segment drone # Test 2 — Mar 2025 flight 2 (no-drone half, same WAV files) python create_dataset.py --config ../../dataset/test_2/Mar_18_2025/flight_2/alignment_params.json --segment no_drone_2 # Optional: skip MP4 output for faster processing python create_dataset.py --config ... --no-video # Optional: custom output folder python create_dataset.py --config ... --output /path/to/npz/ ``` Each run generates `.npz` chunks (one per 100 ms frame) with: - `beamformed_data` (91, 23, 4800) — DAS output across full az/el grid - `labels` (91, 23) — binary mask, 1 within 10° of true DoA - metadata scalars: `csv_azimuth`, `csv_elevation`, `altitude_m`, `total_distance`, `vx/vy/vz_mps`, `pos_x/y` --- ## Results Summary The following results (from the paper) were produced with a modified U-Net trained on this dataset's NPZ chunks — 64 base filters, depth 3, 3×3 kernels, skip-attention, Tversky loss, FFT input restricted to 200–2200 Hz with F=16 bins, input tensor (2E × 2E × F) = (46 × 46 × 16). Model training/inference code and trained weights are not part of this release. | Method | False-Positive Rate (no-drone) | Angular Error (0–50 m) | |---|---|---| | DAS Beamforming | 67.0% | — | | U-Net (ours) | **14.9%** | lower across all bins | U-Net generalizes to unseen location (Test 1, Oct 2024, Site 2) trained only on Site 1. Also validated on DCASE 2019 TAU Spatial: 68% F1, 4.9° DoA (multi-source); 79% F1, 3.0° (single-source). --- ## Citation ```bibtex @inproceedings{rodriguez2026beamformed, title={Beamformed 360-Degree Sound Maps: U-Net-Driven Acoustic Source Segmentation and Localization}, author={Rodr{\'{i}}guez, Belman Jahir and Chevtchenko, Sergio F. and Herrera Mart{\'{i}}nez, Marcelo and Bethi, Yeshwanth and Afshar, Saeed}, booktitle={International Workshop on Acoustic Signal Enhancement (IWAENC)}, year={2026} } @article{rodriguez2026acoustic, title={Acoustic Imaging for UAV Detection: Dense Beamformed Energy Maps and U-Net SELD}, author={Rodr{\'{i}}guez, Belman Jahir and Chevtchenko, Sergio F. and Herrera Mart{\'{i}}nez, Marcelo and Bethi, Yeshwanth and Afshar, Saeed}, journal={arXiv preprint arXiv:2508.00307}, year={2026} } ``` --- ## License Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0). See [LICENSE](LICENSE) for full terms.