AeroNova — Aerial Person Detection for Drone Disaster Relief
Single-class (person) YOLO detector for humans seen from 50–100 m flight
altitude at a slant angle. Built for the SIH problem statement "AI based
automatic alarm generation and dropping of payload at a particular object
through a drone."
The problem this solves
A 1.7 m human at 100 m altitude is 9–34 px tall depending on camera angle.
Feeding a 2304×1296 frame to YOLO at imgsz=640 downscales that person to
~5 px — below the stride-8 detection head. The target is destroyed before the
first forward pass, and no amount of training recovers it.
This model is trained on 640 px tiles cut from full frames at native
resolution, so a 20 px person stays 20 px. You must slice at inference with
the same tile size and overlap or recall collapses — measured at 15× worse
in the 16–32 px bucket when the scales do not match.
Results
| Target size | ≈ altitude / angle | GT | Found | Recall |
|---|
| < 16 px | ~100 m nadir | 2,493 | 1,334 | 0.535 |
| 16-32 px | ~100 m slant / 50 m nadir | 6,210 | 4,178 | 0.673 |
| 32-64 px | ~50 m slant | 3,878 | 3,158 | 0.814 |
| >= 64 px | < 30 m | 330 | 300 | 0.909 |
Overall @ IoU 0.25: recall 0.695, AP 0.617, precision 0.636 on 541 held-out frames (12,911 persons).
Precision is deliberately traded for recall (conf=0.15): a false alarm costs
a wasted payload, a miss costs a life. False positives are suppressed
downstream by temporal confirmation in ground coordinates — 3 sightings at
a consistent GPS position — rather than by a threshold that would discard real
20 px victims.
Usage
1from huggingface_hub import hf_hub_download
2from ultralytics import YOLO
3
4model = YOLO(hf_hub_download("Siddh10/sih-aerial-person", "best.pt"))
5# Do NOT run full-frame on large images -- slice at 640/0.2 to match training.
Full pipeline, including sliced inference and pixel→GPS projection:
https://github.com/SiddhPatel0424/AeroNova
Training data
VisDrone2019-DET, converted to a single person class (pedestrian + people
merged — a rescue drone does not care whether the victim is upright).
ignored-regions are pixel-masked rather than dropped, and boxes with
occlusion == 2 are removed as label noise. 27,488 tiles / 199,891 boxes.
Limitations — read these before quoting the model
- VisDrone is urban drone footage, not disaster footage. There is a real
domain gap to flood and earthquake scenes.
- Below ~16 px, recall is poor. That is optics, not model quality. The fix
is a longer lens, lower altitude, or a thermal camera — not more epochs.
- This is yolo11n (nano), chosen so a Raspberry Pi can run it, trained for
35 effective epochs on a laptop GPU. A larger model with a full schedule has
headroom above these numbers.
- Altitude claims are inferred from box pixel size, not measured — VisDrone
has no altitude labels. The honest claim is performance at the box sizes
corresponding to 50–100 m, per the GSD calculation in the repo.
Licence
AGPL-3.0, inherited from Ultralytics YOLO.