Paper · 2020-11-17 · cs.CV, cs.RO
RELLIS-3D Dataset: Data, Benchmarks and Analysis
RELLIS-3D is an off-road multimodal dataset from a ground robot on a university campus: 6,235 pixel-labelled camera images and 13,556 point-labelled LiDAR scans in 20 classes, with raw sensor streams. Author-reported baselines reach 51.6 to 52.9 mIoU on images (HRNet+OCR, Gated-SCNN) and 20.0 to 43.1 on point clouds (KPConv, SalsaNext), well below urban-data results.
Semantic segmentationLong-tailed recognitionsemantic-segmentationlidaroff-roaddatasetbenchmark
arXivPDFCodeMarkdown11 min read
AI-compiled by claude-haiku-5-5 on 2026-10-18, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Most self-driving research uses city streets, so the data and tools are built for roads. A robot that drives over dirt trails, grass, bushes and puddles needs to know what each of those is, and whether it can drive over it or must avoid it. RELLIS-3D is a dataset recorded by a ground robot on a university campus. It holds camera images, laser scans (LiDAR), stereo images and GPS and motion sensor readings. People labelled each pixel of 6,235 photos and each point of 13,556 laser scans into 20 kinds of terrain and objects.
The authors ran two well-known segmentation models on the labelled data. Both did much worse than on city datasets. They think the main reason is that a few classes are rare. The raw recordings are published too, so others can build new methods without driving the robot again.
TL;DR
RELLIS-3D is an off-road dataset with camera, LiDAR, stereo and GPS/INS data. It has pixel labels for 6,235 images and point labels for 13,556 LiDAR scans, in 20 classes §IV-B §IV-A. The authors report 51.55 (HRNet+OCR) and 52.92 (Gated-SCNN) mIoU on images, and 43.07 (SalsaNext) and 19.97 (KPConv) on point clouds tab. 2. Check the split and class-count inconsistencies under Pitfalls before quoting numbers. The repository states non-commercial terms for the data and code README.md.
Problem
LiDAR and inertial navigation alone perform poorly off-road. They mark bushes as obstacles even where a larger vehicle could drive through them §I. Semantic labels help, but most segmentation datasets are urban. The off-road datasets that exist either have one sensor type or few labels §I §II tab. 1. Off-road scenes also have unclear class boundaries, uneven terrain, and class frequencies that differ between sites §I §V-B.
Method
This is a dataset and benchmark paper. It has no new model. It describes three things: the sensor rig and its calibration §III-A–§III-D, the recording and labelling pipeline §IV-A–§IV-B, and reference segmentation runs with their metric §V.
- Record five sequences by teleoperating the robot along three unpaved trails. Each sequence lasts around five minutes §IV-A.
- Synchronise the sensors with PTP. The GPS/IMU unit cannot be PTP-synced, so each LiDAR or camera frame takes the GPS/IMU reading with the closest timestamp §III-B.
- Calibrate the cameras with a pinhole model plus distortion, using the ROS camera calibrator built on OpenCV §III-C. Estimate LiDAR–camera extrinsics with three cited methods, and check them with the mean line re-projection error, since no ground truth exists §III-D.
- Label images. Trained annotators label pixels, with one annotator per sequence, followed by in-house checks. The camera stream is downsampled to 5 Hz, and frames where the robot is stationary are not duplicated §IV-B.
- Label LiDAR scans from the image labels, as in the pseudocode below §IV-B.
- Use the 20-class ontology, which includes void. It borrows from RUGD and adds classes such as mud, barriers and rubble. Puddle and deep water are separate classes §IV-A.
- Evaluate with mIoU on fixed splits, for two image models and two point-cloud models §V-A–§V-C.
# Label LiDAR scans from labelled images [§IV-B] [§III-D]
# Input: labelled images, camera-LiDAR calibration, scans of one sequence
# Output: one class per point, for every scan
def label_sequence(images, calibration, scans):
# Start from the image labels projected into each scan [§IV-B]
initial = project_image_labels(images, calibration, scans)
# Register and loop-close the sequence to get one pose per scan [§IV-B]
poses = slam_register(scans)
# Refine by hand over overlapping scans in the stacked cloud [§IV-B]
return refine_labels(initial, scans, poses)# Mean IoU over classes [eq. 1] [§V-A]
# Input: predicted, truth: class id per pixel or point (flat arrays)
# Output: scalar mIoU
def mean_iou(predicted, truth, num_classes):
ious = []
# One class at a time, counting pixels or points [§V-A]
for c in range(num_classes):
true_pos = count(predicted == c and truth == c)
false_pos = count(predicted == c and truth != c)
false_neg = count(predicted != c and truth == c)
# Division fails when a class has no pixels; handling not stated
ious.append(true_pos / (true_pos + false_pos + false_neg))
# Average over the C classes; whether void is counted is not stated
return mean(ious)Key equation:
mIoU = \frac{1}{C}\sum_{c=1}^{C}\frac{TP_c}{TP_c+FP_c+FN_c} eq. 1
Here TP, FP and FN are true positives, false positives and false negatives for class c, and C is the number of classes §V-A.
Hyperparameters
The paper states almost no training settings. The rows marked code come from the official repository, not from the paper. They describe the setup the authors used, but the paper does not confirm it.
| Name | Value | Where | Notes |
|---|---|---|---|
| Ontology | 20 classes incl. void | §IV-A | Image benchmark uses 19 (dirt dropped) §V-B |
| Scan classes (benchmark) | 15 incl. void | §V-C tab. 2 | Sky, object, asphalt, building absent from table |
| Sequences | 5, about 5 min each, 3 trails | §IV-A | Single facility; diversity limited §VI |
| Image annotations | 6,235 pixel-labelled images | §IV-B | Camera downsampled to 5 Hz |
| Scan annotations | 13,556 scans | §IV-B | Stated as "up to 13,056 points" per scan |
| Image split | 3,302 train / 983 val / 1,672 test | §V-B | Sums to 5,957, not 6,235 (see Pitfalls) |
| Scan split | 7,800 train / 2,413 val / 3,343 test | §V-C | Sums to 13,556 |
| LiDAR (Ouster OS1) | 64 channels, 2048 horizontal, 10 Hz, 45° vertical FOV | §III-A | |
| LiDAR (Velodyne) | 32 channels, 10 Hz, 40° vertical FOV | §III-A | |
| Camera | Basler acA1920-50gc, 1920×1200, 10 Hz | §III-A | 16 mm lens |
| Stereo | Nerian Karmin2 + SceneScan, 10 Hz | §III-A | |
| GPS/IMU | 300 Hz GPS, 100 Hz IMU | §III-A | Paper also says updates at 100 Hz §III-B |
| Time sync | PTP for all but GPS/IMU | §III-B | |
| HRNet+OCR input (train) | 1024×640 | code: seg_hrnet_ocr_w48_train_512x1024_sgd_lr1e-3_wd5e-4_bs_12_epoch484.yaml | File name says 512×1024 crop |
| HRNet+OCR optimiser | SGD, momentum 0.9, no Nesterov | code: seg_hrnet_ocr_w48_train_512x1024_sgd_lr1e-3_wd5e-4_bs_12_epoch484.yaml | |
| HRNet+OCR LR, weight decay | 0.001, 5e-4 | code: seg_hrnet_ocr_w48_train_512x1024_sgd_lr1e-3_wd5e-4_bs_12_epoch484.yaml | Sibling file uses LR 0.01 seg_hrnet_ocr_w48_train_512x1024_sgd_lr1e-2_wd5e-4_bs_12_epoch484.yaml |
| HRNet+OCR batch | 4 per GPU, launched on 2 GPUs | code: seg_hrnet_ocr_w48_train_512x1024_sgd_lr1e-3_wd5e-4_bs_12_epoch484.yaml run_hrnet.sh | File name says bs 12 |
| HRNet+OCR epochs | 484 | code: seg_hrnet_ocr_w48_train_512x1024_sgd_lr1e-3_wd5e-4_bs_12_epoch484.yaml | |
| Gated-SCNN LR, batch multiplier | 0.001, 3 | code: run_gscnn.sh | Argparse default LR is 0.01 train.py |
| Gated-SCNN epochs | 175 (default) | code: train.py | Run script does not override |
| Gated-SCNN crop, scale, decay | crop 720 (default); scale 0.5–2.0; weight decay 1e-4; momentum 0.9 | code: train.py | Defaults used by the run script |
| Gated-SCNN normalisation | mean [0.5422, 0.6425, 0.5662], std [0.5422, 0.6425, 0.5662] | code: rellis.py | Same values as HRNet loader |
| SalsaNext optimiser | SGD, LR 0.01, momentum 0.9, weight decay 1e-4 | code: salsanext_ouster.yml | |
| SalsaNext schedule | 150 epochs, 1 warm-up epoch, LR decay 0.99 per epoch | code: salsanext_ouster.yml | Decay comment says "after initial cycle" |
| SalsaNext batch | 16 | code: salsanext_ouster.yml | |
| SalsaNext loss | cross-entropy, class weights from point counts (epsilon 0.001) | code: salsanext_ouster.yml salsanext_ouster.yml | Weights use counts in rellis.yaml rellis.yaml |
| SalsaNext post-processing | KNN on, k 5, search 5, sigma 1.0, cutoff 1.0; CRF off | code: salsanext_ouster.yml | |
| SalsaNext sensor | spherical projection, 2048×64, FOV +22.5° to −22.5° | code: salsanext_ouster.yml | Matches the 45° FOV in §III-A |
| KPConv input | sphere radius 4.0 m; grid 0.06 m; batch 30 | code: train_Rellis.py train_Rellis.py train_Rellis.py | |
| KPConv optimiser | SGD, LR 1e-2, momentum 0.98 | code: train_Rellis.py | |
| KPConv schedule | max 800 epochs; LR × 0.1^(1/150) per epoch; 230 steps per epoch | code: train_Rellis.py train_Rellis.py train_Rellis.py | |
| KPConv augmentation | anisotropic scale 0.8–1.2; colour 0.8; noise 0.001 | code: train_Rellis.py | |
| KPConv class weights | commented out | code: train_Rellis.py | |
| Void handling (3D) | ignored in KPConv and SalsaNext | code: Rellis.py rellis.yaml | Paper does not say |
Results
Author-reported. Setup: RELLIS-3D with the splits above; image models are 2D and score 19 classes, point-cloud models are 3D and score 15 classes. Hardware is not stated. The paper compares its numbers against published urban results: Cityscapes and SemanticKITTI §V-B §V-C. Those datasets differ, so the comparison is not like-for-like.
Per-class IoU tab. 2. A dash means the class is not in that model's class list. Mean is computed over the listed classes (see Pitfalls).
| Class | HRNet+OCR (image) | Gated-SCNN (image) | SalsaNext (scan) | KPConv (scan) | Source |
|---|---|---|---|---|---|
| sky | 96.94 | 97.02 | - | - | tab. 2 |
| grass | 90.20 | 84.95 | 64.74 | 56.41 | tab. 2 |
| tree | 80.53 | 78.52 | 79.04 | 49.25 | tab. 2 |
| bush | 76.76 | 70.33 | 72.90 | 58.45 | tab. 2 |
| concrete | 84.22 | 83.82 | 75.27 | 33.91 | tab. 2 |
| mud | 43.29 | 45.52 | 9.58 | 0.00 | tab. 2 |
| person | 89.48 | 90.31 | 83.17 | 81.20 | tab. 2 |
| puddle | 73.94 | 71.49 | 23.20 | 0.00 | tab. 2 |
| rubble | 62.03 | 66.03 | 5.01 | 0.00 | tab. 2 |
| barrier | 54.86 | 55.12 | 75.89 | 0.00 | tab. 2 |
| log | 0.00 | 2.92 | 18.76 | 0.00 | tab. 2 |
| fence | 39.52 | 41.86 | 16.13 | 0.40 | tab. 2 |
| vehicle | 41.54 | 46.51 | 23.12 | 0.00 | tab. 2 |
| object | 46.44 | 54.64 | - | - | tab. 2 |
| pole | 9.51 | 6.90 | 56.26 | 0.00 | tab. 2 |
| water | 0.72 | 0.94 | 0.00 | 0.00 | tab. 2 |
| asphalt | 33.25 | 44.18 | - | - | tab. 2 |
| building | 4.60 | 11.47 | - | - | tab. 2 |
| mean mIoU | 51.55 | 52.92 | 43.07 | 19.97 | tab. 2 |
Other reported results:
- Image models, on the same split, with urban references the paper cites: Gated-SCNN 52.92 vs 74.7 on Cityscapes; HRNet+OCR 51.55 vs 81.1 on Cityscapes §V-B.
- Point clouds: SalsaNext 43.07 mIoU; KPConv 19.07 mIoU in the text, but 19.97 in the table §V-C tab. 2. The paper gives SemanticKITTI references of 59.5 and 58.8 "respectively" §V-C.
- Label-distribution sampling for KPConv adds 0.6 mIoU points §V-C.
- Fence visibility: a fence hidden behind bushes in images and in a single scan appears only after several LiDAR scans are registered §V-D fig. 7.
- Largest errors in images, per the paper: log, pole, water and building §V-B tab. 2.
Paper vs code
Repository: https://github.com/unmannedlab/RELLIS-3D at commit
c17a118fcaed1559f03cc32cc3a91dedc557f8b8. It belongs to the authors'
lab; the paper's abstract links it README.md.
- Splits. The paper's image split (3,302 / 983 / 1,672) and scan split
(7,800 / 2,413 / 3,343) are not in the repo. Configs point to
train.lst,val.lst,pt_train.lstand similar files seg_hrnet_ocr_w48_train_512x1024_sgd_lr1e-3_wd5e-4_bs_12_epoch484.yaml Rellis.py. The counts cannot be checked. - "Same splits" for points. The paper says point experiments use "the same data splits as for the image data" §V-C, but the counts differ. The code loads separate point lists. The paper does not say whether this means the same sequences or the same frames.
- Image class mapping. The HRNet loader keeps sky, object, asphalt and building as classes, and maps raw ids to indices 5, 7, 8 and 9 rellis.py. The SalsaNext map sends sky, object, asphalt and building to void rellis.yaml. The paper's point table agrees with the SalsaNext map tab. 2.
- Void in HRNet. HRNet maps raw void (id 0) and dirt (id 1) to class 0, and its configured ignore value is 255, which this map never produces rellis.py seg_hrnet_ocr_w48_train_512x1024_sgd_lr1e-3_wd5e-4_bs_12_epoch484.yaml. Whether class 0 enters the loss or the mIoU was not checked.
- Which HRNet config produced the numbers. Both LR variants exist. The README
and
train.shuse the 0.001 file README.md. The paper does not say which one was used. - Batch size. The file name says
bs_12, but the config gives 4 per GPU on 2 GPUs (8 total) seg_hrnet_ocr_w48_train_512x1024_sgd_lr1e-3_wd5e-4_bs_12_epoch484.yaml. - SalsaNext config. The run script uses the Ouster config run_salsanext.sh. Its FOV matches the paper's 45° §III-A. A different config,
benchmarks/SalsaNext/salsanext.yml, names an HDL-64 sensor and is not the one the run script uses salsanext.yml. - KPConv class weights. The paper describes label-based sampling §V-C. The config's class-weight lines are commented out train_Rellis.py. How the label-based sampling is implemented was not checked.
- Evaluation code. The notebooks in
utils/(Evaluate_img.ipynb,Evaluate_pt.ipynb) were not reviewed. They are the metric code the README points to README.md. Check them before reproducing the mIoU numbers.
Pitfalls
- Numbering and version. Citations follow the IEEE conference template's Roman-numeral section style (§III-A and so on) in arXiv v4 source. A different version may renumber them.
- Image split does not add up. 3,302 + 983 + 1,672 = 5,957, but 6,235 images are annotated. The 278 missing images are not explained §IV-B §V-B.
- Class counts disagree. The text says 19 image classes and 15 point classes §V-B §V-C. The table caption says 20 and 16 tab. 2. The 20-class ontology includes void §IV-A.
- KPConv mIoU disagrees. 19.07 in the text, 19.97 in the table. The table value is the one that matches the arithmetic (see next point).
- Means. Arithmetic check on the table: the image means (51.55, 52.92) equal the average of the 18 listed class columns, and the point means (43.07, 19.97) equal the average of the 14 listed columns. So void is not in the mean. The paper does not say this.
- Accumulation and empty classes. Whether TP, FP and FN are summed over the test set or averaged per image is not stated. Handling of classes with no pixels is not stated §V-A.
- Point count. Scans are said to contain "up to 13,056 points" §IV-B, while the scan count is 13,556. The point count may be a typo. Not verified.
- GPS rate. §III-A lists 300 Hz GPS and 100 Hz IMU. §III-B says the GPS/IMU system updates at 100 Hz. Which stream is matched to frames is not stated.
- Label quality. Labels come from crowdsourcing with in-house checks §IV-B. The paper reports no inter-annotator agreement or error rate. Point labels are propagated from image labels, then refined, and scans can disagree where SLAM registration is imperfect §IV-B.
- Class imbalance is the stated cause. The paper attributes the weak image results mainly to imbalance and unclear boundaries §V-B, and the weak KPConv result to imbalance and unstructured data §V-C. These are the authors' beliefs; no ablation isolates them.
- Cross-dataset comparison. The Cityscapes and SemanticKITTI numbers come from other papers and other setups. Do not rank them against these results.
- Single site. All five sequences come from one facility §VI. The paper says diversity is a challenge for splits.
- Licences. This card is published under the paper's CC BY 4.0. The dataset and repository are not covered by that licence. The README states CC BY-NC-SA 3.0 for both README.md. Bundled GSCNN code is CC BY-NC-SA 4.0 LICENSE. No snippet from these repositories is quoted here; the code references are citations only. Anyone using the data or code must check the non-commercial terms first.
- Dataset availability. The README links Google Drive and Baidu Pan downloads, some limited in quota and one requiring email access README.md. Not all files are verified here.
Lineage
- Builds on: the RUGD ontology (not a card) for its class design §IV-A.
- Benchmarks: HRNet+OCR (Wang et al. and Yuan et al., arXiv:1909.11065); Gated-SCNN (arXiv:1907.05740); SalsaNext (arXiv:2003.03653); KPConv (arXiv:1904.08889). None has a card, so no content is taken from them §V-B §V-C.
- Compared against (named only): RUGD, Freiburg Forest / DeepScene, YCOR, the NREC person-detection set, and Dabbiru et al. §II tab. 1. Urban references: Cityscapes, SemanticKITTI and others §V.
- Superseded by: not stated.
Source and license
Adapted from “RELLIS-3D Dataset: Data, Benchmarks and Analysis” by Peng Jiang, Philip Osteen, Maggie Wigness, Srikanth Saripalli (arXiv:2011.12954), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/unmannedlab/RELLIS-3D at commit c17a118fcaed (No LICENSE file at repository root; README states CC BY-NC-SA 3.0 (non-commercial) for dataset and code; bundled GSCNN is CC BY-NC-SA 4.0, SalsaNext and HRNet are MIT). Any quoted code is shown under that license.