Paper · 2018-02-22 · cs.CV
xView: Objects in Context in Overhead Imagery
xView is an overhead object-detection dataset from WorldView-3 imagery at 0.3 m GSD: over 1 million boxes in 60 classes over 1,400+ km², built with three-stage quality control. An SSD baseline trained on multi-resolution chips (300/400/500 px) reaches total mAP 0.2590, against 0.1456 for vanilla 300 px chips (author-reported).
Object detectionDataset curationobject-detectiondatasetsatellite-imageryremote-sensingquality-control
arXivPDFCodeMarkdown10 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
Satellites photograph the Earth every day, but almost none of those photos come with labels that say where the cars, buildings, ships and cranes are. Researchers who want a computer to find such things need a labeled collection to learn from, and most public collections cover only a few kinds of objects or a few places. This paper introduces xView, a large collection of satellite photos in which people drew boxes around more than a million objects and tagged each one with one of 60 types.
The labeling was done in stages. Crowd workers drew boxes, other workers checked them, and expert reviewers compared a sample against a carefully labeled reference set before a batch was accepted. Objects range from small vehicles to large facilities, and many classes are rare, so the data is also a test of how well a detector copes with imbalance and with objects at very different sizes.
To show the data is hard, the authors trained a standard detector on three versions of the photos. The version that cut each image into tiles of several sizes did clearly better than the plain tiling, and simple image augmentation did not help. The results are the authors' own, and the detector setup is described only loosely, so the paper is most useful as a dataset reference and a starting benchmark.
TL;DR
xView is a satellite object-detection dataset of WorldView-3 imagery at 0.3 m ground sample distance, with 60 classes, over 1 million axis-aligned boxes and more than 1,400 km² of coverage [abstract] §3.4. Each 1 km² chip was annotated in QGIS and passed through worker, supervisory and expert quality control §3.2 §3.3. The paper's SSD baseline reports total mAP 0.1456 on 300×300 chips, 0.2590 with multi-resolution chips (300, 400, 500 px), and 0.1549 with augmentation on top of multi-resolution tab. 1 §4. Use it if you need an overhead detection benchmark, but note that the training recipe is not stated, and the mAP protocol is only in the released scoring code.
Problem
Public overhead datasets were, in the authors' view, limited by low class count, poor geographic diversity, few training instances or narrow class scope §1. Small objects are a particular problem: objects range from about 3 m (10 px at 0.3 m GSD) to more than 3,000 m §1. Existing datasets are compared in §1 and §2: COWC has cars only from aerial imagery in six locations, SpaceNet focuses on buildings and roads, and FMoW has no vehicles §2. The paper states the goal as a general-purpose, multi-class overhead detection benchmark that is familiar to both computer-vision and remote-sensing communities §1.
Method
The contribution has two parts: a dataset-building pipeline and a baseline experiment.
Dataset construction §3.
- Select areas of interest (AOIs) from lat-long points of relevant sites, such as mines, ports and airfields, and draw polygons around them where imagery confirms the objects §3.1.
- Cut the imagery into 1 km² chips, one per UTM-derived grid cell that intersects an AOI polygon. Strips with different weather can be chosen for the same AOI §3.1.
- Annotate each chip with axis-aligned bounding boxes in QGIS using an in-house plugin. Annotators label each object individually, use the child class when confident and the parent class otherwise, and skip objects that are roughly 20% visible or less §3.2.
- Run three-stage quality control: worker review on a rotating basis, supervisory checks for duplicates, invalid labels or geometries, and unlabeled objects, and expert review against a gold set §3.3.
The 60 classes sit under seven parent classes, with some classes (such as helipad) having no parent §3.1 tab. 2.
Expert quality control §3.3. Six 1 km² chips per batch are labeled by experts to form the gold set. A batch passes only if its precision is at least 0.75 and its recall at least 0.95 at IoU 0.5, compared with the gold set. Failing batches are remediated and resubmitted.
# Expert quality control of one annotation batch [§3.3]
# Input: batch boxes; gold boxes from six expert-labeled 1 km^2 chips
# Output: True if the batch is accepted
def passes_expert_qc(batch, gold):
# Match batch boxes to gold boxes at IoU >= 0.5 [§3.3]
precision, recall = match_at_iou(batch, gold, iou=0.5)
# Accept only if both thresholds are met [§3.3]
return precision >= 0.75 and recall >= 0.95Baseline experiments §4. The detector is SSD, which predicts from several feature layers for multi-scale detection §4. Three training sets are built from the same data:
- vanilla: non-overlapping 300×300 chips. Boxes that cross a chip edge are cropped to the chip §4.
- multires: chips of 300², 400² and 500² pixels, the three sizes combined into one dataset. How they are combined is not stated §4.
- aug: the multires set with added shifting, rotation, noise and blurring. Rotations are bounded in both directions, but the bounds are not stated §4 fig. 7.
All three are evaluated on the vanilla test set, and the experimental split is 70% train and 30% test of the whole dataset §4.
# Build the three baseline training sets [§4]
# Input: full xView scenes (about 3000 x 3000 px per 1 km^2)
# Output: vanilla, multires and aug training sets
def cut_chips(scene, chip_size):
# Non-overlapping square chips; boxes are cropped at the edge [§4]
return non_overlapping_grid(scene, chip_size)
def build_datasets(scenes):
# Vanilla: one chip size [§4]
vanilla = [cut_chips(s, 300) for s in scenes]
# Multires: 300, 400 and 500 px chips, combined [§4]
multires = [cut_chips(s, n) for s in scenes for n in (300, 400, 500)]
# Aug: multires plus shift, rotate, noise and blur [§4] [fig. 7]
aug = augment(multires)
return vanilla, multires, augNote that augment stands for the four augmentations listed in §4, whose parameters are not stated.
Hyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| Ground sample distance | 0.3 m | [abstract] §1 | WorldView-3 imagery |
| Chip area | 1 km² (about 3000×3000 px) | §3.1 §4 | Source chip before cutting |
| Vanilla chip size | 300×300 px, non-overlapping | §4 | Boxes cropped at chip edge |
| Multires chip sizes | 300², 400², 500² px | §4 | Combination method not stated |
| Augmentations | shift, rotation, noise, blur | §4 fig. 7 | Magnitudes and rotation bounds not stated |
| Experimental split | 70% train / 30% test | §4 | How the split is drawn is not stated |
| Release split (objects) | train 59.2%, test 20.0%, val 20.8% | §3.4 | Split per image |
| Minimum per category per split | 5 instances | §3.4 | |
| Visibility rule for labels | label unless about 20% or less visible | §3.2 | Annotation rule, not training |
| Expert QC gold set | six 1 km² chips per batch | §3.3 | Labeled by co-authors and analysts |
| Expert QC thresholds | precision ≥ 0.75, recall ≥ 0.95, IoU 0.5 | §3.3 | |
| Expert QC sampling points | batches at 10%, 40%, 70%, 100% of the dataset | §3.3 | Interpretation not stated |
| Detector | SSD (multi-layer prediction) | §4 | Backbone not stated |
| Hardware | four M60 GPUs | §4 | |
| Training budget | seven days cap, same for all three | §4 | |
| Learning rate, batch size, optimizer, iterations, anchors, input normalisation | not stated | — | Training code is not in the released repository |
| Default chip size at inference | 300 | create_detections.py | Overridable with -cs |
| Predictions per chip at inference | 250 | create_detections.py | Fixed in code |
| IoU threshold for scoring | 0.5 | score.py | Default; paper does not state one for mAP |
Results
Author-reported. Setup: xView with 60 classes; SSD detector; the three training variants (vanilla, multires, aug) are all tested on the vanilla test set; four M60 GPUs with a seven-day cap §4. Baseline for comparisons: vanilla §4. The paper's text names the metric as total mean average precision §4.
| Setting | Metric | Vanilla | Multires | Aug | Source |
|---|---|---|---|---|---|
| All 60 classes | total mAP | 0.1456 | 0.2590 | 0.1549 | tab. 1 §4 |
Per-class average precision, as printed in the paper:
| Class | Vanilla | Multires | Aug |
|---|---|---|---|
| Aircraft Hangar | 0.1698 | 0.5270 | 0.3247 |
| Barge | 0.1829 | 0.3738 | 0.2210 |
| Building | 0.4718 | 0.5534 | 0.4451 |
| Bus | 0.2949 | 0.3773 | 0.2609 |
| Cargo Truck | 0.0493 | 0.0972 | 0.0445 |
| Cargo/container car | 0.3659 | 0.4737 | 0.1676 |
| Cement mixer | 0.0863 | 0.1441 | 0.1220 |
| Construction site | 0.0172 | 0.1711 | 0.0032 |
| Container crane | 0.0663 | 0.2879 | 0.1648 |
| Container ship | 0.2269 | 0.4660 | 0.3400 |
| Crane Truck | 0.0946 | 0.0838 | 0.0894 |
| Damaged/demolished building | 0.0269 | 0.0785 | 0.0366 |
| Dump truck | 0.1468 | 0.2275 | 0.0858 |
| Engineering vehicle | 0.0020 | 0.1234 | 0.0357 |
| Excavator | 0.3535 | 0.4691 | 0.2064 |
| Facility | 0.0777 | 0.3750 | 0.1201 |
| Ferry | 0.0532 | 0.3771 | 0.2197 |
| Fishing vessel | 0.1768 | 0.1839 | 0.0968 |
| Fixed-wing aircraft | 0.0888 | 0.1218 | 0.1042 |
| Flat car | 0.0000 | 0.0000 | 0.0000 |
| Front loader/Bulldozer | 0.1644 | 0.3220 | 0.1959 |
| Ground grader | 0.1590 | 0.1910 | 0.0289 |
| Haul truck | 0.3542 | 0.2109 | 0.6875 |
| Helicopter | 0.3788 | 0.5800 | 0.2965 |
| Helipad | 0.2459 | 0.4500 | 0.1889 |
| Hut/Tent | 0.0004 | 0.0006 | 0.0000 |
| Locomotive | 0.0760 | 0.1929 | 0.1124 |
| Maritime vessel | 0.1947 | 0.4040 | 0.2884 |
| Mobile crane | 0.0248 | 0.1375 | 0.0945 |
| Motorboat | 0.0811 | 0.2488 | 0.1110 |
| Oil Tanker | 0.0958 | 0.3677 | 0.1193 |
| Passenger Vehicle | 0.4765 | 0.5569 | 0.2980 |
| Passenger car | 0.0305 | 0.0471 | 0.0000 |
| Passenger/cargo plane | 0.6508 | 0.6691 | 0.6104 |
| Pickup Truck | 0.0011 | 0.0078 | 0.0000 |
| Pylon | 0.0089 | 0.0011 | 0.0625 |
| Railway vehicle | 0.0000 | 0.0833 | 0.0000 |
| Reach stacker | 0.0000 | 0.2625 | 0.0000 |
| Sailboat | 0.2614 | 0.0450 | 0.0453 |
| Shed | 0.0071 | 0.3027 | 0.0277 |
| Shipping container | 0.0283 | 0.3835 | 0.0426 |
| Shipping container lot | 0.1644 | 0.5676 | 0.1890 |
| Small aircraft | 0.4610 | 0.3771 | 0.4815 |
| Small car | 0.3607 | 0.4083 | 0.3651 |
| Storage Tank | 0.3484 | 0.4462 | 0.3700 |
| Straddle carrier | 0.3045 | 0.4293 | 0.3262 |
| Tank car | 0.3733 | 0.1123 | 0.2664 |
| Tower | 0.0042 | 0.1233 | 0.0000 |
| Tower crane | 0.0196 | 0.0385 | 0.0303 |
| Tractor | 0.0000 | 0.1109 | 0.0000 |
| Trailer | 0.0651 | 0.2151 | 0.0861 |
| Truck | 0.1526 | 0.0469 | 0.1356 |
| Truck Tractor | 0.0048 | 0.2129 | 0.0000 |
| Truck Tractor w/ Box Trailer | 0.1355 | 0.0863 | 0.1188 |
| Truck Tractor w/ Flatbed Trailer | 0.0322 | 0.1261 | 0.0336 |
| Truck Tractor w/ Liquid Tank | 0.0180 | 0.4744 | 0.0000 |
| Tugboat | 0.2044 | 0.0380 | 0.4119 |
| Utility Truck | 0.0098 | 0.2846 | 0.0091 |
| Vehicle Lot | 0.1105 | 0.4115 | 0.1402 |
| Yacht | 0.0701 | 0.0701 | 0.1868 |
| Total mAP | 0.1456 | 0.2590 | 0.1549 |
Source: tab. 1 §4.
Points the paper makes about these numbers §4: multires beats both vanilla and aug on total mAP; the best classes are large or uniformly backed (for example planes on runways); small cars, despite a high instance count, are detected poorly; pickup truck and hut/tent score under 1% AP in every run; and construction site rises from 0.0172 (vanilla) to 0.1711 (multires). The authors state that the augmented run was still improving when training stopped and expect it to improve with more iterations; this is a claim, not a tested result.
Paper vs code
Official code: DIUx-xView/xView1_baseline at 8efe3407861046458427ac6c47b424a62d5079db, Apache-2.0 README.md. The repository is published under the DIUx-xView organisation, and its README links the first author's blog post for the baseline models README.md. The paper does not link the repository, so the attribution rests on that organisation and README link.
Several differences and gaps:
- Training code is absent. The repository contains only inference (
inference/) and scoring (scoring/) code and pre-trained frozen models provided as release assets README.md. None of the SSD training hyperparameters in the paper can be checked against code. - Inference chip size. The code defaults to 300 px and accepts any size through
-cscreate_detections.py. The paper does not say which chip size each released model expects. - Box decoding is implicit. The code reads the model's boxes in (y, x) order, swaps them to (x, y), and multiplies by the chip size, implying the model outputs boxes normalised to the chip create_detections.py. The paper says nothing about this.
- Fixed output count. The code hard-codes 250 predictions per chip create_detections.py. The paper does not state it.
- Partial borders dropped. Chip counts use integer division, so pixels beyond the last full chip are ignored create_detections.py. The paper does not mention this.
- Scoring defaults are not in the paper.
score()uses IoU 0.5 by default score.py and matches greedily in prediction order, with each prediction assigned only to its highest-IoU ground-truth box matching.py. Predictions with confidence 0 are dropped score.py. AP follows the PASCAL VOC envelope method score.py. Classes 75, 82 and 87 are excluded score.py, and a class with no ground truth scores 0.0 score.py. The paper gives none of these. - Split metrics. The code also reports small/medium/large and common/rare splits score.py, which the paper does not use.
No other discrepancies were found in the parts the code covers.
Pitfalls
- The training recipe is missing. SSD backbone, learning rate, batch size, optimiser, number of iterations, anchors and normalisation are not stated, and the released repository has no training code. An implementer cannot reproduce the 0.2590 number from this card alone.
- Two different splits. §3.4 describes a release split (train, test, val) with per-image splitting. §4 uses a 70/30 train/test split of the entire dataset, and says all three runs are scored on the vanilla test set. How the two relate, and how the 70/30 split was drawn, is not stated.
- Multires is underspecified. The paper does not say whether the 300, 400 and 500 px chips are mixed at random, sampled per iteration, or stored in separate files §4.
- Augmentation parameters are missing. Shift size, rotation range, noise level and blur kernel are not stated. Rotation is "bounded in both directions" with no number fig. 7 §4.
- Edge cropping. Boxes that straddle a chip edge are cut at the edge, which the authors say can cut large objects such as facilities and stadiums §4. No minimum visible fraction is given for training, while the annotation rule is about 20% visibility §3.2.
- mAP protocol. The paper reports mAP without naming the IoU threshold or the AP method. The scoring code uses IoU 0.5 and VOC-style AP, and treats classes with no ground truth as 0 (see Paper vs code). Compare numbers only under the same protocol.
- Figure numbering. The text cites Figure 8 for small-car extracts, but the source contains no figure numbered 8 in that position §4. The introduction cites Figure 11 for geographic locations §1, while in source order Figure 11 is the chip comparison and Figure 12 is the location map §6.2. Numbers here follow source order, because no compiled PDF was available.
- Costs the abstract hides. Training was limited to seven days on four M60 GPUs for every run, so the augmented run may be under-trained by the authors' own account §4.
- Label noise is acknowledged. Clusters of objects, such as tightly packed buildings, were sometimes labeled as one object, and the authors say this matches real-world errors §3.2.
Lineage
- Builds on: SSD (Single Shot MultiBox Detector), cited as §4 without an arXiv id in the paper.
- Compared against: PASCAL VOC, COCO, ImageNet detection, OpenImages V2, COWC, SpaceNet and FMoW §1 §2.
- Superseded by: not known from content already in this wiki.
Source and license
Adapted from “xView: Objects in Context in Overhead Imagery” by Darius Lam, Richard Kuzma, Kevin McGee, Samuel Dooley, Michael Laielli, Matthew Klaric, Yaroslav Bulatov, Brendan McCord (arXiv:1802.07856), 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/DIUx-xView/xView1_baseline at commit 8efe34078610 (Apache-2.0). Any quoted code is shown under that license.