Object Detection
ultralytics
ONNX
English
yolov8
aerial-imagery
drone
vehicle-detection
birds-eye-view
geo-trax
trajectory
urban-traffic
tracking
Eval Results (legacy)
Instructions to use rfonod/geo-trax with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- ultralytics
How to use rfonod/geo-trax with ultralytics:
from ultralytics import YOLOvv8 model = YOLOvv8.from_pretrained("rfonod/geo-trax") source = 'http://images.cocodataset.org/val2017/000000039769.jpg' model.predict(source=source, save=True) - Notebooks
- Google Colab
- Kaggle
File size: 13,439 Bytes
f264e2b afc8061 f264e2b 3285aae afc8061 f264e2b afc8061 f264e2b 72c73cd f264e2b b5bafe1 0aa37ed f264e2b 0aa37ed f264e2b 0aa37ed f264e2b c169663 f264e2b afc8061 f264e2b 526df0e f264e2b b5bafe1 f264e2b 35229d8 f264e2b afc8061 f264e2b afc8061 f264e2b 72c73cd b5bafe1 72c73cd f264e2b c169663 f264e2b c169663 f264e2b 72c73cd | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 | ---
license: cc-by-4.0
base_model:
- Ultralytics/YOLOv8
base_model_relation: finetune
pipeline_tag: object-detection
library_name: ultralytics
num_parameters: 11137922
github: https://github.com/rfonod/geo-trax
language:
- en
tags:
- ultralytics
- yolov8
- object-detection
- aerial-imagery
- drone
- vehicle-detection
- birds-eye-view
- geo-trax
- trajectory
- urban-traffic
- tracking
- arxiv:2411.02136
datasets:
- rfonod/songdo-vision
- Voxel51/VisDrone2019-DET
- detection-datasets/coco
model-index:
- name: rfonod/geo-trax/geotrax_hbb_yolov8s_1920_v1
results:
- task:
type: object-detection
dataset:
type: rfonod/songdo-vision
name: Songdo Vision
split: test
metrics:
- type: precision # mAP@0.5 not available as a standard metric type on HF
value: 0.951
name: mAP@0.5
- type: precision
value: 0.711
name: mAP@0.5:0.95
- type: precision
value: 0.911
name: Precision
- type: recall
value: 0.935
name: Recall
---
# Geo-trax: YOLOv8s Vehicle Detector for Drone BEV Imagery
[](https://github.com/rfonod/geo-trax)
[](https://pypi.org/project/geo-trax/)
[](https://huggingface.co/spaces/rfonod/geo-trax)
[](LICENSE)
[](https://doi.org/10.1016/j.trc.2025.105205)
[](https://arxiv.org/abs/2411.02136)
[](https://huggingface.co/datasets/rfonod/songdo-vision)
[](https://huggingface.co/datasets/rfonod/songdo-traffic)
[](https://www.real-lab.ch/geo-trax)
[](https://youtu.be/gOGivL9FFLk)
This is the default detection model for **[Geo-trax](https://github.com/rfonod/geo-trax)**, a
comprehensive pipeline for extracting georeferenced vehicle trajectories from high-altitude drone
(bird's-eye view) video footage. The model detects vehicles in aerial imagery and underpins the
results reported in the associated [publication](https://doi.org/10.1016/j.trc.2025.105205).

🎬 This accelerated animation previews some of the capabilities of Geo-trax. Watch the full
demonstration (~4 min) on [YouTube](https://youtu.be/gOGivL9FFLk).
## Model Details
| Property | Value |
|---|---|
| Architecture | YOLOv8s (HBB, horizontal bounding boxes) |
| Input resolution | 1920 × 1920 px |
| Classes | 6 trained (4 primary + 2 auxiliary; see below) |
| Parameters | 11.1 M (11,137,922) |
| Framework | [Ultralytics](https://github.com/ultralytics/ultralytics) ≥ 8.4.64 |
| Trained on | 19,339 annotated aerial images (679,306 labeled instances); multi-stage, see [publication](https://doi.org/10.1016/j.trc.2025.105205) |
| Validated on | [Songdo Vision](https://doi.org/10.5281/zenodo.13828407) test set (1,084 images, 55,124 vehicle instances) |
### Classes and Detection Performance
Metrics reported on the [Songdo Vision](https://doi.org/10.5281/zenodo.13828407) test split
(1,084 images, 55,124 labeled vehicle instances). The `Instances` column is the per-class
support in the test set. See Table 3 of the
[publication](https://doi.org/10.1016/j.trc.2025.105205) for full results.
| ID | Label | Notes | Instances | Precision | Recall | mAP@50 | mAP@50-95 |
|---|---|---|---:|---|---|---|---|
| 0 | Car | incl. vans | 49,508 | 0.979 | 0.981 | 0.992 | 0.835 |
| 1 | Bus | | 1,759 | 0.952 | 0.977 | 0.988 | 0.826 |
| 2 | Truck | | 3,052 | 0.887 | 0.916 | 0.935 | 0.722 |
| 3 | Motorcycle | | 805 | 0.827 | 0.866 | 0.888 | 0.463 |
| 4 | Pedestrian | not evaluated | n/a | n/a | n/a | n/a | n/a |
| 5 | Bicycle | not evaluated | n/a | n/a | n/a | n/a | n/a |
| **All** | | | **55,124** | **0.911** | **0.935** | **0.951** | **0.711** |
The model reaches **0.951 mAP@50** and **0.711 mAP@50-95** overall, with near-saturated accuracy
on cars and buses (mAP@50 ≥ 0.988). Trucks and especially motorcycles are harder: motorcycles are
small, sparse in the test set (805 instances), and the main driver of the lower mAP@50-95.
### Evaluation Plots
Precision-recall curves and the normalized confusion matrix on the Songdo Vision test set:
<table>
<tr>
<td align="center"><img src="assets/PR_curve.png" alt="Precision-Recall Curve" width="420"><br><sub>Precision-Recall Curve</sub></td>
<td align="center"><img src="assets/confusion_matrix_normalized.png" alt="Normalized Confusion Matrix" width="420"><br><sub>Normalized Confusion Matrix</sub></td>
</tr>
</table>
> **Note on pedestrian and bicycle classes:** The model was trained on pedestrian and bicycle
> instances; however, these classes are **not evaluated and not recommended for use**. They were
> underrepresented in the training data, are not annotated in the Songdo Vision dataset (making
> reliable evaluation impossible), and achieve poor detection performance in practice.
## How to Use
> 🚀 **Try it first, no install:** the [interactive 🤗 Space](https://huggingface.co/spaces/rfonod/geo-trax) runs this detector in your browser on your own aerial image or short clip.
### With Geo-trax (recommended)
This model is the default in Geo-trax and downloads automatically on first use:
```bash
pip install geo-trax
geotrax extract video.mp4 # detect, track, and stabilize; auto-downloads the model
geotrax batch video.mp4 --no-geo # detect, track, and stabilize; skip georeferencing
geotrax batch video.mp4 # full pipeline including georeferencing (requires orthophotos)
geotrax batch video.mp4 --sahi # optional SAHI inference for better small-object detection
```
See the Geo-trax [GitHub README](https://github.com/rfonod/geo-trax) for the full pipeline,
configuration options, and georeferencing.
### Direct Ultralytics inference (PyTorch)
```python
from ultralytics import YOLO
from huggingface_hub import hf_hub_download
weights = hf_hub_download(repo_id="rfonod/geo-trax", filename="geotrax_hbb_yolov8s_1920_v1.pt")
model = YOLO(weights)
results = model("drone_frame.jpg", imgsz=1920, conf=0.25, iou=0.45, classes=[0, 1, 2, 3])
results[0].show()
```
> **Tip:** The model was trained and validated at **1920 px** input resolution. Downscaling to
> 1280 px is possible with a small accuracy trade-off; going below 960 px significantly degrades
> detection of small vehicles (motorcycles, distant cars). Pass `classes=[0, 1, 2, 3]` to
> restrict inference to the four evaluated classes and suppress unreliable predictions.
### ONNX inference
An ONNX export (opset 12, static 1920 × 1920 input) is available for deployment without a PyTorch dependency:
```python
import numpy as np
import onnxruntime as ort
from huggingface_hub import hf_hub_download
onnx_path = hf_hub_download(repo_id="rfonod/geo-trax", filename="geotrax_hbb_yolov8s_1920_v1.onnx")
session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
# Prepare input: BGR image resized/padded to 1920×1920, normalized to [0, 1]
img = np.random.rand(1, 3, 1920, 1920).astype(np.float32) # replace with real image
outputs = session.run(None, {"images": img})
# outputs[0] shape: (1, 10, 75600) — 10 = 4 bbox coords + 6 class scores
```
## Training Data
Training followed a multi-stage strategy starting from **YOLOv8s weights pretrained on COCO**
as the initial foundation. Two successive stages were applied:
**Stage 1 (BASE):** The model was trained on a large, diverse collection drawn from eight
public aerial and drone datasets (CARPK, PUCPR+, CyCAR, UAVDT, HARPY, RAI4VD, UIT-ADrone,
and VisDrone) combined with the [Songdo Vision](https://doi.org/10.5281/zenodo.13828407)
dataset, totalling 19,339 training images with 679,306 annotations across 6 vehicle classes
(car, bus, truck, motorcycle, pedestrian, bicycle).
**Stage 2 (FINE):** The BASE-trained model was subsequently fine-tuned on a curated,
high-quality subset of 9,004 images with 321,368 annotations, emphasising accurate annotations
and higher-resolution images, again combined with
[Songdo Vision](https://doi.org/10.5281/zenodo.13828407), to yield the final weights released here.
**Training set composition** (annotations per class):
| Stage | Images | Annotations | Car | Bus | Truck | Motorcycle | Pedestrian | Bicycle |
|---|---:|---:|---:|---:|---:|---:|---:|---:|
| BASE | 19,339 | 679,306 | 561,666 | 15,587 | 28,830 | 44,512 | 24,239 | 4,472 |
| FINE | 9,004 | 321,368 | 266,745 | 8,047 | 14,305 | 30,925 | 1,260 | 86 |
[Songdo Vision](https://doi.org/10.5281/zenodo.13828407) comprises 5,419 annotated drone frames
(4,335 training / 1,084 test; 80/20 split) collected during a large-scale urban traffic
monitoring experiment in Songdo, South Korea. It covers four primary vehicle classes captured
at 140-150 m altitude by DJI Mavic 3 drones, contributing 217,311 training and 55,124 test
instances to the totals above.
**Training configuration:**
| Setting | Value |
|---|---|
| Initialization | YOLOv8s pretrained on COCO |
| Optimizer | SGD |
| Learning rate (initial / final factor) | 0.01 / 0.01 |
| Momentum | 0.937 |
| Weight decay | 0.0005 |
| Batch size | 8 |
| Early stopping | 50-epoch patience |
| Input resolution | 1920 × 1920 px (letterbox padding) |
| Mixed precision | AMP enabled |
| Augmentation | random scaling, translation, horizontal flip, mosaic, colour jitter, Gaussian/median blur, grayscale, CLAHE |
See the [publication](https://doi.org/10.1016/j.trc.2025.105205) for complete dataset statistics,
training details, and ablation results.
## Intended Use and Limitations
- **GSD assumption:** The bundled Geo-trax config assumes a ground sampling distance (GSD) of
~0.027 m/px (DJI Mavic 3, 4K, 140-150 m altitude). Adjust this value in the config for
different hardware or flight altitudes.
- **Supported classes:** Car, bus, truck, and motorcycle (class IDs 0-3). The model was also
trained on pedestrian and bicycle instances; however, these classes achieve poor detection
performance and are not recommended for use (see the class table above). Geo-trax filters to
the four primary classes by default; when using Ultralytics directly, pass
`classes=[0, 1, 2, 3]` to suppress unreliable predictions.
## Related datasets and resources
- **Live demo**: interactive 🤗 Space — [`rfonod/geo-trax` (Spaces)](https://huggingface.co/spaces/rfonod/geo-trax)
- **Songdo Traffic**: the georeferenced vehicle-trajectory dataset this model helps produce via
the Geo-trax pipeline:
[`10.5281/zenodo.13828384`](https://doi.org/10.5281/zenodo.13828384) ·
HF [`rfonod/songdo-traffic`](https://huggingface.co/datasets/rfonod/songdo-traffic)
- **Songdo Vision**: the vehicle-detection (annotated image) dataset used to train and validate
this model: [`10.5281/zenodo.13828407`](https://doi.org/10.5281/zenodo.13828407) ·
HF [`rfonod/songdo-vision`](https://huggingface.co/datasets/rfonod/songdo-vision)
- **Source video recordings** (not open access):
[`10.5075/EPFL.20.500.14299/253923`](https://doi.org/10.5075/EPFL.20.500.14299/253923)
- **Publication**: *Transportation Research Part C* (2025):
[`10.1016/j.trc.2025.105205`](https://doi.org/10.1016/j.trc.2025.105205) ·
[arXiv:2411.02136](https://arxiv.org/abs/2411.02136)
- **Software**: Geo-trax: [github.com/rfonod/geo-trax](https://github.com/rfonod/geo-trax) ·
Zenodo [`10.5281/zenodo.12119542`](https://doi.org/10.5281/zenodo.12119542) ·
[demo video](https://youtu.be/gOGivL9FFLk)
## Citation
If you use this model, please cite the associated publication:
```bibtex
@article{fonod2025advanced,
title = {Advanced computer vision for extracting georeferenced vehicle trajectories from drone imagery},
author = {Fonod, Robert and Cho, Haechan and Yeo, Hwasoo and Geroliminis, Nikolas},
journal = {Transportation Research Part C: Emerging Technologies},
volume = {178},
pages = {105205},
year = {2025},
doi = {10.1016/j.trc.2025.105205}
}
```
If you additionally use the [Geo-trax software](https://github.com/rfonod/geo-trax), please
also cite the specific version you used via its Zenodo record. For example, for version 1.3.0:
```bibtex
@software{fonod2026geo-trax,
author = {Fonod, Robert},
title = {Geo-trax: A Comprehensive Framework for Georeferenced Vehicle Trajectory Extraction from Drone Imagery},
url = {https://github.com/rfonod/geo-trax},
doi = {10.5281/zenodo.12119542},
version = {1.3.0},
year = {2026}
}
```
## License
This model is released under the
[Creative Commons Attribution 4.0 International (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/)
license; see the [LICENSE](LICENSE) file for the full terms. The Geo-trax codebase is distributed
separately under the [MIT License](https://github.com/rfonod/geo-trax/blob/main/LICENSE).
|