The UTUAV Urban Traffic Dataset

Version 2

We present the UTUAV dataset which consists of three different scenes captured in the second largest city of Colombia: Medellín. Road user classes representative of those in emerging countries such as Colombia, have been chosen: motorcycles (m), light vehicles (c) and heavy vehicles (b).

HOT NEWS!:

We invite people to use this dataset and to improve upon the baselines presented here (see under Results) and submit a paper with your results to the IEEE 16th International Conference on Pattern Recognition Systems (ICPRS-27). The current deadline for papers is the 25th October 2026. The conference will take place at Bordeaux (France) on 8-11 March 2027. Accepted and presented papers are planned to be published by the IEEE (Xplore).

The dataset was initially annotated by means of Viper annotation tool. Subsequently, the annotations were converted to the Pascal VOC (XML) format (directories named "Annotations", bounding boxes in absolute coordinates xmin, xmax, ymin, ymax) and to Ultralytics YOLOv8 format (directories named "labels", class label (0: m, 1: c, 2: b followed bounding boxes in normalised xywh coordinates relative to image width and height: xcentroid, ycentroid, width, height). The images are stored in directories named "images".

Publications:

If you use these datasets please cite the following publication:

@article{felipe2025utuav,
  title={UTUAV: A Drone Dataset for Urban Traffic Analysis},
  author={Felipe, Lepin and Velastin, Sergio A and Le{\'o}n, Roberto and Jes{\'u}s, Garc{\'\i}a-Herrero and Rojas-Mart{\'\i}nez, 
Gonzalo and Espinosa-Oviedo, Jorge Ernesto}, journal={Drones}, volume={10}, number={1}, pages={15}, year={2025}, publisher={MDPI AG} }

And for an earlier publication:
@article{espinosa2020detection,
  title={Detection of motorcycles in urban traffic using video analysis: A review},
  author={Espinosa, Jorge E and Velast{\'\i}n, Sergio A and Branch, John W},
  journal={IEEE transactions on intelligent transportation systems},
  volume={22},
  number={10},
  pages={6115--6130},
  year={2020},
  publisher={IEEE}
}
Researchers can use these datasets provided that is only for research, not commercial, purposes. To access these datasets please contact Prof. Sergio A Velastin with your name, institution and purpose of your research.

UTUAV-A Dataset (road side)

This dataset corresponds to an extension of Espinosa et al.  dataset, which originally contained only annotated motorbikes in 10,000 frames with a resolution of 640x364 pixels. The extension includes the annotation of light and heavy vehicles. The images were taken from an unmanned air vehicle (UAV), elevated 4.5 meters from the ground. The UAV is kept at the same position and small movement of the camera cab be noticed.

WARNING: We no longer work with this dataset. You can see further details in version 1 of the UTUAV dataset , that is no longer maintained and we cannot guarantee that it is up to date). 
Annotated Image of UTUAV-A Dataset

Bird-eye Datasets

Currently, we are concentrating on the following two sets ("B" and "C")  which are of bird-eye views of urban traffic taken from two different (but similar) heights for two different road topologies. These sets are useful to experiment with:

UTUAV-B Dataset

Exploiting the top view angle that a high elevation UAV could reach (approx 100 meters), this dataset is composed of 6,500 labelled images with a resolution of 3840x2160 (4k) pixels. The entire sequence is captured with a top view. The visualisation colors for the annotated bounding boxes (see pictures below) are red for light vehicles (c), blue for motorbikes (m) and green for heavy vehicles (b). Note that this visualisation does not show stationary vehicles.

BVisualisation
Annotated Image (4K resolution - Here resized) of UTUAV-B Dataset

UTUAV-C Dataset

This dataset came from a sequence of 10,560 frames, of which 6,600 are annotated, with a resolution of 3840x2160 (4k) pixels. This video sequence was also captured from an UAV, elevated at 120 meters from the ground. The road configuration is different. These differences have been introduced intentionally to test generalisation ability e.g. of detection on this dataset using a model trained with UTUAV-B. This dataset also uses a top view angle and uses the same color code for annotations as per UTUAV-B. Note that the visualisation does not show stationary vehicles.

CVisualisation
Annotated Image (4K resolution - Here resized) of UTUAV-C Dataset

Version 2

Version 2 has added important additions (thanks for Claudio Inal from Universidad Tecnica Federico Santa Maria, Chile):
  1. Explicit separate classes for static motorbike (ms), static cars (cs) and static buses/large vehicles (bs). This way, we provide B and C datasets with 6 classes (maybe useful to see if detection methods behave differently for static and moving objects).
  2. Then, the annotations of static vehicles were "merged" to their corresponding "main" classes, e.g. static motorbike objects were simply re-labelled as motorbikes and so on, thus creating new B and C datasets with 3 classes. Note: data and results for these two kinds of data (3-class and 6-class) are different to what we reported in our 2025 Drones paper.
  3. The above results in 4 separate datasets (all in Ultralytics YOLO format):
    1. B with 3 classes
    2. B with 6 classes
    3. C with 3 classes
    4. C with 6 classes
  4. We also provide frame-to-frame unique object ids for these datasets to help researcher experiment with tracking methods. These data is given in two formats (Note: please contact us if you need access to these data):
    1. XML pseudo Pascal VOC format where we have added attributes "track_id" (a unique number for each vehicles as they go from one frame to the next) and "occlusion" (always the same!, for future annotation refinement), one file per image
    2. MOT format (as per the MOT challenge). A single file of comma separated rows for each image: frame_id, track_id, top_left_x, top_left_y, width, height, confidence (always 1), class_id, visibility. These files have been generated from the pseudo Pascal VOC files.

Data Partitions

This refers on how the data is partitioned into training, validation and evaluation (test). We do not mix B with C as one of the purposes it to check generalisation (see above). Originally, we "naively" created such partitions by random selection of frames. This however tends to "inflate" evaluation metrics because the trained model had been exposed to similar images. This is aggravated by the fact that images come from temporal sequences (videos). In our Drones paper we showed the effects of various partitions and have now fixed the data with what we called SequentialGap300, meaning that the video sequence is used with a given number of sequential frames for training, followed by a gap of 300 (dropped) images, followed by a sequence of validation images, followed by a gap of 300 (dropped) images and finally a sequence of frames used for evaluation. 

In version 1, we provided various possible partitions and a rather confusing explanation of how to partition the overall data. To avoid confusion to make sure everyone uses the same data we now provide already partitioned data.

Downloading the data

Note for Chrome/Chromium users: Chrome's automated scanner may flag some of the files in this page as "uncommon download." The files are perfectly safe. If blocked, please right-click the link and select "Save link as...", use Firefox, or download via terminal: wget [URL]


The YOLO-annotated data can be downloaded using this link (17.1GB, you will need credentials that can be obtained by contacting Prof. Sergio A. Velastin). Once downloaded and extracted, you will find the following directory structure (it follows Ultralytics data structure for each of the 4 datasets. Note: as the images are the same for the 3-class and 6-class cases, the images subdirectories for the 6-class sets are empty, to reduce the size of the download):

UTUAV_B_C_3and6class
├── B_Sequential_Gap300-3class
│   ├── evaluation
│   │   ├── Annotations
│   │   ├── images
│   │   └── labels
│   ├── training
│   │   ├── Annotations
│   │   ├── images
│   │   └── labels
│   └── validation
│       ├── Annotations
│       ├── images
│       └── labels
├── B_Sequential_Gap300-6class
│   ├── evaluation
│   │   ├── Annotations
│   │   ├── images
│   │   └── labels
│   ├── training
│   │   ├── Annotations
│   │   ├── images
│   │   └── labels
│   └── validation
│       ├── Annotations
│       ├── images
│       └── labels
├── C_Sequential_Gap300-3class
│   ├── evaluation
│   │   ├── Annotations
│   │   ├── images
│   │   └── labels
│   ├── training
│   │   ├── Annotations
│   │   ├── images
│   │   └── labels
│   └── validation
│       ├── Annotations
│       ├── images
│       └── labels
└── C_Sequential_Gap300-6class
    ├── evaluation
    │   ├── Annotations
    │   ├── images
    │   └── labels
    ├── training
    │   ├── Annotations
    │   ├── images
    │   └── labels
    └── validation
        ├── Annotations
        ├── images
        └── labels


The lists of training/validation/evaluation filenames for B and C can be downloaded from here.

And use this link to download the pseudo-PascalVOC (XML) and MOT annotations. The XMLs contain the object locations and unique object ids (for tracking) for the complete B and C datasets. The same is the case for the MOT (MOT challenge format, first class id (motorbikes) is set to 1). It also contains the MOT files just for the evaluation partitions.

Hyperparameters

To try reproducing our results for YOLO and ACD_DETR, you can use this YOLO configuration file.

Possible problems training with Ultralytics

💡 Troubleshooting: older nvidia cards

I have been using Titan V GPU (which is a bit old but reasonably fast). The latest version of Ultralytics (8.4.90 at the time of writing) is very memory hungry and perhaps memory leaky with this GPU. Newer GPUs might not have this issue. The way it worked for me:

conda create -n env_yolo python=3.10 ipython
conda activate env_yolo
# This one supports Titan V
pip install torch==2.4.1 torchvision==0.19.1 --index-url https://download.pytorch.org/whl/cu121
# And a version o ultralytics that works with above but with numpy 1.*
pip install "numpy<2.0" ultralytics==8.3.197

💡 Troubleshooting: Training running on CPU instead of GPU? If your execution log says CPU instead of CUDA, your system's NVIDIA driver is likely too old for the default PyTorch installation. You can fix this by matching your PyTorch version to your driver. E.g. run this command inside your environment: pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 --force-reinstall

Ultralytics Database file

As an example, the 6-class B database file will look something like this:

# train and val datasets (image directory or *.txt file with image paths)
path: YOUR_DIRECTORY/B_Sequential_Gap300_6-class/

train: training  
val: validation
test: evaluation   # the full evaluation set

# number of classes
nc: 6

# class names (one letter else visualisation is cluttered), s="static"
names: ['m','c','b','ms','cs','bs']

Sample command to train a YOLO model:

#! /bin/sh

# S.A. Velastin Sept 2025
# UTUAV training B dataset, N
yolo mode= train cfg= YOUR_DIRECTORY/default_felipe.yaml data= YOUR_DIRECTORY/B_Sequential_Gap300_6-class.yaml imgsz= 1024 batch= 10 epochs= 100 model= yolo11n.pt exist_ok= True project= YOUR_RUNS_DIRECTORY name= Coco_100e_1024_v11n

#(to train from scratch, not from pre-trained Coco, use model= yolo11n.yaml)

ACD_DETR

To train with ACD-DETR first install it ACD-DETR (using a conda enviroment):

clone https://github.com/TYrant-TY/ACD-DETR
cd to the new directory
Setup a conda environment (sergio_rt) as explained in the repo

python setup.py install
pip install psutil  # else command “yolo” fails
pip install ipython  # more friendly python console

To use an ACD-DETR “N” model (for fair comparison with YOLO N models), copy the file ultralytics/cfg/models/rt-detr/ACD-DETR.yaml to ultralytics/cfg/models/rt-detr/ACD_DETR-n.yaml and modify to (adding the scales for an N model):

scales: # model compound scaling constants, i.e. 'model=yolov8n-cls.yaml' will call yolov8-cls.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]  # Add this for YOLOv11 N comparison (SAV/Gemini)
  l: [1.00, 1.00, 1024]

Please see under code below for a script to train with ACD_DETR. Please feel free to contact me if there is something missing in these instructions.

Code

For convenience (but without guarantees!) we provide a set of scripts and commands we have used to generate our result (credentials are needed to download).
  1. The *.sh files are normally used to train a model. Please modify according to your paths. Also note that we have used the convention that e.g. B_Sequential_Gap_300 refers to the 3-class data and B_Sequential_Gap_300Stat refers to the 6-class data!
  2. train_SAV.py is the script to train an ACD_DETR model (apologies that data paths are hard coded), to be executed within an ACD_DETR (conda) environment
  3. GenPreds.py is the script to generate the predictions (as YOLO labels) and metrics for a model. Run from an Ultralytics (conda) environment. It defaults to using the evaluation partition. For example: python GenPreds.py -m MODELPATH -c CONFIG_PATH -d DATAPATH -p DETECT_RUNS_PATH -n NAME --imgsz 1024
  4. GenPreds_DETR is the equivalent for ACD_DETR, to be executed within an ACD_DETR (conda) environment

Please contact us if there are any issues.

Results

In all the experiments reported here, we have used "N" models, trained for 100 epochs, imgsz=1024, using a Titan V GPU card under Linux Mint 22 with conda. These are summarised in this spreadsheet (the bold figures correspond to the best prediction results vertically i.e. comparing models trained with the same starting weights).



For any queries related to these datasets please contact  Jorge Espinosa or Sergio A Velastin

Our thanks also to Prof. Jesus Garcia Herrero (Universidad Carlos III de Madrid) and the many students that have been involved in this project.