Griffin

Griffin is an aerial-ground cooperative perception dataset collected in CARLA, pairing a ground vehicle with a UAV (drone) for cooperative 3D detection and tracking. It contains 255 scenes (~15 s each, ~150 frames at 10 Hz) across four UAV-altitude subsets, totaling over 37.7k samples and 914.8k 3D annotations.

The 123D parser converts the vehicle-side (ground agent): four cardinal pinhole cameras, the 80-beam top LiDAR, ego poses, and 3D boxes. Each scene becomes one log, routed to its official train / val partition.

Note

The drone-side (UAV) agent is also available as a separate single-agent conversion (dataset=griffin_drone): five pinhole cameras (four cardinal + one nadir), ego poses, and 3D boxes, with aerial state (UAV flag, per-frame altitude) in a custom modality. The drone carries no LiDAR. True first-class cooperation (vehicle + drone with cross-agent transforms as a core datatype) remains a design-first follow-up; the vehicle and drone logs of a scene already share one global (ENU) frame, so they can be aligned by scene id + timestamp.

Overview

Paper

Griffin: Aerial-Ground Cooperative Detection and Tracking Dataset and Benchmark (arXiv preprint, 2025)

Download

Code

github.com/wang-jh18-SVM/Griffin

License

MIT License

Available splits

griffin_{50scenes_25m,50scenes_40m,50scenes_55m,100scenes_random}_{train,val}

Available Modalities

Name

Available

Description

Ego Vehicle

Ego poses are provided in an ENU world frame; vehicle parameters follow the CARLA ego model, see EgoStateSE3.

Map

X

n/a

Bounding Boxes

Bounding boxes are available with the GriffinBoxDetectionLabel. For more information, see BoxDetectionsSE3.

Traffic Lights

X

n/a

Cameras

Griffin (vehicle-side) has 4x Camera:

  • PCAM_F0: front

  • PCAM_B0: back

  • PCAM_L0: left

  • PCAM_R0: right

Lidars

Griffin (vehicle-side) has 1x Lidar:

  • LIDAR_TOP: lidar_top (80-beam, 10 Hz, ego frame)

Dataset Specific
class py123d.parser.registry.GriffinBoxDetectionLabel[source]

Griffin (aerial-ground cooperative) dataset annotation categories.

Griffin annotates dynamic traffic participants with CARLA-derived semantic types. The official benchmark collapses these into three evaluation classes (car, bicycle, pedestrian); we keep the native granularity here and map down to DefaultBoxDetectionLabel in to_default().

Category collapsing follows obj_type_mapping in the official converter. See Wang et al., “Griffin: Aerial-Ground Cooperative Detection and Tracking Dataset and Benchmark”, arXiv preprint 2503.06983 (2025), and the official toolkit (https://github.com/wang-jh18-SVM/Griffin).

PEDESTRIAN = 0
CAR = 1
TRUCK = 2
BUS = 3
MOTORCYCLE = 4
BICYCLE = 5
to_default()[source]

Inherited, see superclass.

Return type:

DefaultBoxDetectionLabel

Download

Download the dataset from Hugging Face or Baidu Netdisk and extract the KITTI-style griffin-release trees. The 123D conversion expects the official directory structure with subset folders directly under $GRIFFIN_DATA_ROOT:

$GRIFFIN_DATA_ROOT/
├── griffin_50scenes_25m/
│   └── griffin-release/
│       └── vehicle-side/
│           ├── calib/            # {front,back,left,right,lidar_top}.json (extrinsic + intrinsic)
│           ├── camera/
│           │   ├── front/        # {frame}.png  (frame = 6-digit, e.g. 000620)
│           │   ├── back/
│           │   ├── left/
│           │   └── right/
│           ├── label/            # {frame}.txt  (ego-frame 3D boxes)
│           ├── lidar/
│           │   └── lidar_top/    # {frame}.ply  (ego-frame, intensity field "I")
│           ├── pose/             # {frame}.json (ENU pose, degrees)
│           └── scene_infos.json
├── griffin_50scenes_40m/
│   └── ...
├── griffin_50scenes_55m/
│   └── ...
└── griffin_100scenes_random/
    └── ...

The official train / val partitions are embedded in the package (py123d.parser.griffin.splits), so only the griffin-release trees are required.

Installation

Griffin conversion requires the griffin extras group (plyfile for the LiDAR .ply files and scipy for the pose/box Euler-angle conversion):

pip install py123d[griffin]

Conversion

Data already extracted to $GRIFFIN_DATA_ROOT (see Download):

py123d-conversion dataset=griffin

Convert a different subset or partition by overriding splits:

py123d-conversion dataset=griffin \
    'dataset.parser.splits=[griffin_100scenes_random_train, griffin_100scenes_random_val]'

Note

By default the conversion stores relative sensor file paths rather than the sensor data itself. To embed sensors, adapt the lidar_store_option / camera_store_option in the griffin.yaml converter configuration.

Dataset Issues

  • Ego Vehicle: Vehicle parameters are representative CARLA values; the ego frame is taken to coincide with the IMU frame.

  • Coordinate frames: LiDAR points and labels are stored in the ego frame (X-forward, Y-left, Z-up); poses use an ENU world frame with xyz Euler angles in degrees. The parser lifts boxes to the global frame and keeps LiDAR points ego-relative.

  • Labels: Non-traffic CARLA categories (e.g. military props) are outside the Griffin perception taxonomy and are skipped during conversion.

  • Drone-side: Converted separately (dataset=griffin_drone) as a single-agent UAV log: 5 cameras incl. a nadir bottom camera (PCAM_D0), no LiDAR, and aerial state in a CustomModality (id aerial). Cooperative (joint vehicle + drone) perspectives are not modelled as a first-class type yet.

Citation

If you use Griffin in your research, please cite:

@misc{wang2025griffin,
  title={Griffin: Aerial-Ground Cooperative Detection and Tracking Dataset and Benchmark},
  author={Jiahao Wang and Xiangyu Cao and Jiaru Zhong and Yuner Zhang and Haibao Yu and Lei He and Shaobing Xu},
  year={2025},
  eprint={2503.06983},
  archivePrefix={arXiv},
  primaryClass={cs.CV},
  url={https://arxiv.org/abs/2503.06983},
}