Paper · 2023-02-14 · cs.CV, cs.AI, cs.RO
ConceptFusion: Open-set Multimodal 3D Mapping
ConceptFusion stores CLIP-aligned features in a 3D map. Each pixel's feature mixes a whole-image embedding with per-mask region embeddings and is fused by SLAM-style point fusion. Text, image, click and audio queries score map points by cosine similarity, with no training. Author-reported: 0.446 3D mIoU on UnCoCo structured text queries, versus 0.289 for supervised OpenSeg-3D.
Open-vocabulary segmentationSurfel mappingSimultaneous localization and mapping (SLAM)3d-mappingopen-vocabularyzero-shotmultimodal-queriesslamfeature-fusionrobotics
arXivPDFCodeMarkdown13 min read
AI-compiled by claude-haiku-5-5 on 2026-10-31, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
A robot that builds a 3D map of a room usually stores shapes and colours. A map of this kind can only answer questions about the object types it was trained to recognise. ConceptFusion stores, for each point of the map, a numeric description of what that point looks like in the language of a large pretrained image model. The map can then be searched with a word, a photo, a sound or a click on the map, and it finds the points that match.
The hard part is that the pretrained image model describes whole pictures, not small regions. The authors combine the description of the whole picture with descriptions of many small cut-out regions, giving more weight to the whole picture for regions that resemble it. These per-pixel descriptions are then added to the 3D map in the same way depth and colour are.
The authors report that this works without any further training and keeps rare object names searchable. Their evaluation is on indoor, tabletop and driving scenes, and on two robots: a tabletop arm and a car.
TL;DR
- Each 3D map point stores a language-aligned feature vector, fused over frames with a confidence-weighted average §3.1 eq. 1 eq. 2.
- Per-pixel features are built zero-shot from a CLIP-style image embedding of the whole frame and of mask-cropped regions, combined with similarity weights §3.2 eq. 3 eq. 4 eq. 5 eq. 6.
- Queries from text, click, image or audio are cosine scores against the map, with no training §3.3.
- Author-reported: on UnCoCo structured text queries, 0.446 3D mIoU against 0.289 for supervised OpenSeg-3D tab. 1.
- The official repository is MIT-licensed. Its extraction script differs from the paper: SAM replaces Mask2Former and the uniqueness term is removed extract_conceptfusion_features.py README.md.
Problem
Maps that tag objects with semantic labels mostly work over a fixed label set chosen at training time. Maps can usually be queried only by class name or by text prompt §1. Foundation models such as CLIP cover open vocabularies but output one vector per image, not per pixel §1. Pixel-aligned models built on CLIP, such as LSeg and OpenSeg, are finetuned on small labelled datasets, and the authors report that this finetuning makes them forget rare concepts §1 §3.2.
The target is a map that is open-set, meaning concepts are supplied at query time, and multimodal, meaning it can be queried by text, images, audio and 3D clicks, all in one vector space §1 §3.
Method
Overview. The system takes posed RGB-D frames and fuses a per-pixel foundation-model feature into a point map, using the same surface-fusion pipeline as for depth and colour §1 §3.1. Pixel features are built from one image-level embedding, one embedding per instance-mask bounding box, and similarity weights §3.2. The map is then searched with cosine similarity to a query vector §3.3. Spatial relations are answered by a small set of functions over query results, with an LLM optionally parsing the language §3.4 app. A8.
Steps.
- Frame preprocessing. Each frame gives a colour image, a depth image, a vertex map, a normal map and a camera pose §3.1. Points with noisy depth are dropped by the depth-fusion procedure of PointFusion §3.1 app. A3.
- Class-agnostic masks. A universal instance-segmentation model proposes R masks per image. Mask2Former (100 proposals per image) or SAM is used §3 app. A4.
- Global and local embeddings. The global embedding is the foundation model's embedding of the whole image. Each mask's bounding box is embedded the same way, giving R local embeddings §3.2.
- Similarity weights. For each region, compute the cosine similarity of its local embedding to the global one eq. 3. Compute the average similarity of that local embedding to the other local embeddings, which measures uniqueness eq. 4. Combine both in a softmax across regions with temperature τ eq. 5.
- Region feature. The region feature is a weighted mix of the global and local embeddings, with weight w_i on the global one eq. 6. The result is normalised and assigned to every pixel of that region §3.2.
- Pixel feature. A pixel can lie in several regions. Its feature is the sum of the region features assigned to it, normalised once after accumulation §3.2.
- Map fusion. Each pixel's feature is fused into the map point it projects to, using a confidence weight that falls off with radial distance from the camera centre §3.1 eq. 1 eq. 2. The fused vector per map point is the feature the queries use.
- Querying. Each map point gets a score in [-1, 1], the cosine similarity between its fused vector and the query vector. Thresholding, non-maxima suppression and optional clustering then give 3D regions of interest §3.3. The query vector depends on the modality: CLIP text encoder for text; the clicked point's fused vector for clicks; CLIP image embedding for images; AudioCLIP embedding for audio §3.3.
- Spatial queries. Five comparator functions take two queries (distance, left-of or right-of, on-top-of, under, plus containment and size in the appendix). An LLM maps a natural-language question onto these functions. Other experiments feed the raw text query to the CLIP text encoder §3.4 app. A8.
# Pixel-aligned features for one frame [§3.2] [eq. 3-6]
# Input: image (H, W, 3); R mask proposals with bounding boxes
# Output: pixel_features (H, W, d), normalised per pixel
def pixel_aligned_features(image, masks):
# Whole-image embedding from the foundation model [§3.2]
global_feature = normalise(encode_image(image))
# One embedding per proposal's bounding box [§3.2]
local_features = [
normalise(encode_image(crop(image, box)))
for box in bounding_boxes(masks)
]
# Cosine similarity of each local to the global [eq. 3]
similarity = [dot(local, global_feature) for local in local_features]
# Mean similarity to the other locals, i.e. uniqueness [eq. 4]
# Written as divided by R, not R-1, in the paper
uniqueness = [
sum(dot(local_i, local_j) for j != i) / R
for i, local_i in enumerate(local_features)
]
# Softmax over regions, temperature tau = 1 [eq. 5] [§3.2]
logits = [(s + u) / tau for s, u in zip(similarity, uniqueness)]
weights = softmax(logits)
# Weighted mix of global and local, normalised [eq. 6]
region_features = [
normalise(w * global_feature + (1 - w) * local)
for w, local in zip(weights, local_features)
]
# Sum region features onto their pixels, normalise once [§3.2]
pixel_sums = zeros(H, W, d)
for region, feature in zip(masks, region_features):
pixel_sums[region.pixels] += feature
return normalise(pixel_sums)# Fuse one pixel's feature into a map point [§3.1] [eq. 1-2]
# Input: point k with feature f_k and confidence c_k;
# pixel feature f_uv and radial distance gamma of that pixel
# Output: updated f_k and c_k
def fuse_pixel(f_k, c_k, f_uv, gamma):
# Confidence falls off with radial distance; sigma = 0.6 [§3.1]
alpha = exp(-gamma ** 2 / (2 * sigma ** 2))
# Confidence-weighted running average of the feature [eq. 1]
f_k = (c_k * f_k + alpha * f_uv) / (c_k + alpha)
# Accumulate the confidence [eq. 2]
c_k = c_k + alpha
return f_k, c_kHyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| Fusion confidence scale σ | 0.6 | §3.1 eq. 1 | γ is "radial distance"; its unit and normalisation are not stated |
| Softmax temperature τ | 1 | §3.2 eq. 5 | "in all reported results" |
| Uniqueness term | used with Mask2Former, dropped with SAM | §3 | Authors say SAM gives much less mask redundancy |
| Mask proposals per image | 100 | §3 app. A4 | Mask2Former, Swin-L backbone, class-agnostic proposals only |
| Point-fusion distance threshold | 5 cm | app. A3 | Positions; default of PointFusion |
| Point-fusion normal threshold | 20 degrees | app. A3 | Normals; default of PointFusion |
| Odometry and mapping rate | 15 Hz | §3 | Frame-rate per the authors |
| Pixel-feature extraction time | 10 to 15 s per image | §3 | Offline, NVIDIA RTX 3090 |
| Outdoor odometry | LeGO-LOAM on lidar | app. A3 | Lidar depths projected onto the image |
| Foundation models | DINO and CLIP variants; OpenAI CLIP and OpenCLIP | app. A5 | Checkpoint for the pixel features not stated in the paper |
| Audio encoder | AudioCLIP, trained on AudioSet | app. A5 | |
| LLM for spatial parsing | text-davinci-003; temperature 0.7, max length 256, top-p 1 | app. A8 | Prompt given in full; 100 queries, all parsed correctly |
| Evaluation IoU thresholds | 0.15, 0.25, 0.5 | tab. 1 | |
| Ignored background classes | wall, floor, ceiling, door, window (indoor); road, sidewalk, building (outdoor) | app. A6 | |
| Mask-area filter | 0.0005 of image area | code only: extract_conceptfusion_features.py | Declared but never used in the loop |
| SAM mask generator | 8 sample points per side, prediction-IoU threshold 0.92, one crop layer | code only: extract_conceptfusion_features.py | Paper gives no SAM settings |
| Pixel-feature size | 120 by 160 by 1024 (code default) | code only: extract_conceptfusion_features.py extract_conceptfusion_features.py | Dimension 1024 follows the ViT-H-14 default; the paper does not state it |
| OpenCLIP model | ViT-H-14, laion2b_s32b_b79k | code only: extract_conceptfusion_features.py | Paper does not name this checkpoint |
| Dataset sampling stride | 20 frames | code only: extract_conceptfusion_features.py | Config default |
| Text demo visual threshold | 0.6 on min-max rescaled score | code only: demo_text_query.py | Visualisation only, not in the paper |
| Click demo visual threshold | 0.8 on min-max rescaled score | code only: demo_click_query.py | Visualisation only, not in the paper |
Results
Author-reported throughout. Setup: UnCoCo tabletop sequences (20 RGB-D sequences, 78 household objects, about 500K queries), with the first two sequences used for tuning and excluded §4.1 app. A7. Baselines are LSeg-3D and OpenSeg-3D (LSeg and OpenSeg features fused with the same pipeline) and MaskCLIP-3D §4. Metrics are 3D mIoU and the fraction of queries whose detection reaches IoU 0.15, 0.25 or 0.5 tab. 1.
Text queries, UnCoCo structured tab. 1
| Method | 3D mIoU | IoU>0.15 | IoU>0.25 | IoU>0.5 |
|---|---|---|---|---|
| LSeg-3D (supervised) | 0.128 | 25% | 16.66% | 9.72% |
| OpenSeg-3D (supervised) | 0.289 | 43.05% | 36.11% | 27.78% |
| MaskCLIP-3D (zero-shot) | 0.091 | 25.97% | 9.09% | 1.30% |
| ConceptFusion | 0.446 | 77.78% | 69.44% | 45.83% |
Text queries, UnCoCo unstructured (long free-form) tab. 2, averaged over 20 trials
| Method | 3D mIoU | IoU>0.15 | IoU>0.25 | IoU>0.5 |
|---|---|---|---|---|
| LSeg-3D | 0.122 | 31.45% | 20.65% | 5.65% |
| OpenSeg-3D | 0.153 | 27.26% | 21.94% | 11.29% |
| MaskCLIP-3D | 0.092 | 20.63% | 11.88% | 3.06% |
| ConceptFusion | 0.378 | 70.16% | 59.52% | 34.03% |
Image queries, UnCoCo structured tab. 3, averaged over 3 trials
| Method | 3D mIoU | IoU>0.15 | IoU>0.25 | IoU>0.5 |
|---|---|---|---|---|
| LSeg-3D | 0.134 | 26.88% | 21.51% | 9.68% |
| OpenSeg-3D | 0.112 | 23.66% | 18.28% | 8.60% |
| MaskCLIP-3D | 0.094 | 21.51% | 11.83% | 4.30% |
| ConceptFusion | 0.331 | 54.84% | 51.61% | 31.18% |
Audio queries, UnCoCo tab. 4
| Query type | Random | AudioCLIP (privileged boxes) | ConceptFusion |
|---|---|---|---|
| Source-ambiguous, accuracy | 7.14% | 23.81% | 64.29% (IoU 0.287) |
| Ecological, accuracy | 5.56% | 22.22% | 66.67% (IoU 0.301) |
Open-set 2D segmentation, mAcc / f-mIoU tab. 5
| Method | ScanNet | Replica | SemanticKITTI |
|---|---|---|---|
| LSeg (supervised) | 0.70 / 0.63 | 0.52 / 0.33 | 0.84 / 0.82 |
| OpenSeg (supervised) | 0.63 / 0.62 | 0.54 / 0.41 | 0.78 / 0.77 |
| MaskCLIP (zero-shot) | 0.24 / 0.28 | 0.01 / 0.05 | 0.70 / 0.66 |
| Mask2Former + global CLIP (zero-shot) | 0.35 / 0.48 | 0.13 / 0.10 | 0.22 / 0.20 |
| ConceptFusion (zero-shot) | 0.63 / 0.58 | 0.31 / 0.24 | 0.79 / 0.78 |
Ablation, ScanNet tab. 6
| Variant | mAcc | f-mIoU |
|---|---|---|
| Global CLIP for every pixel | 0.35 | 0.48 |
| Mask2Former + local CLIP only | 0.43 | 0.33 |
| Remove uniqueness term (eq. 4) | 0.55 | 0.46 |
| Full method | 0.63 | 0.58 |
Segmentation model, Replica tab. 8
| Mask source | mAcc | f-mIoU |
|---|---|---|
| Mask2Former | 24.16 | 31.31 |
| SAM | 31.53 | 38.70 |
Spatial reasoning, 100 queries over 5 ScanRefer scenes, 25 per type tab. 7
| Method | Distance | Relative position | Support | Containment |
|---|---|---|---|---|
| Random | 24% | 36% | 52% | 44% |
| 2.5D (single RGB-D image) | 32% | 28% | 76% | 68% |
| ConceptFusion | 84% | 76% | 96% | 72% |
Qualitative only. Zero-shot tabletop rearrangement with a UR5e arm on novel objects, and text-driven navigation on a drive-by-wire car over a 4000 m² urban area §4.3 fig. 8 fig. 9. The paper reports no success rates for either. The LLM-planner demo in AI2-THOR is also qualitative §5 fig. 10.
Claimed margin. The abstract says the method outperforms supervised baselines "by more than 40% margin on 3D IoU". The table above gives 0.446 against 0.289 mIoU for the best supervised baseline, which is a difference of 0.157 in mIoU. The paper does not define the 40% figure §1 tab. 1.
Paper vs code
Checked against the official repository at 4457c1f718a5612c2efc57b93a2dc152fed8a03d, which the project page links. The repository's README lists its own deviations README.md.
- Mask proposals. Paper uses Mask2Former (100 proposals) or SAM §3. Code uses only SAM, with
points_per_side=8in the call, although the argument class default is 32 extract_conceptfusion_features.py extract_conceptfusion_features.py. The mask-area filter is declared but unused extract_conceptfusion_features.py. - Uniqueness term removed. Paper includes the mean-similarity term in the weights eq. 4 eq. 5. Code uses only the global-to-local similarity in the softmax:
softmax(similarity_scores)extract_conceptfusion_features.py. The README gives the same deviation README.md. - No temperature. Paper has τ = 1 explicitly eq. 5. Code has no temperature term, which amounts to τ = 1 extract_conceptfusion_features.py.
- Normalisation. Paper normalises once after accumulating over regions §3.2. Code normalises each region's feature and then again after each accumulation step extract_conceptfusion_features.py.
- Global feature. Paper computes it from the foundation model on the full image §3.2. Code uses the OpenCLIP ViT-H-14
laion2b_s32b_b79kcheckpoint extract_conceptfusion_features.py extract_conceptfusion_features.py. - Odometry and fusion. Paper uses LeGO-LOAM for outdoor sequences app. A3. Code fuses with gradSLAM's PointFusion, using ground-truth odometry (
odom="gt") and nearest-neighbour resizing of the feature map to image size run_feature_fusion_and_save_map.py run_feature_fusion_and_save_map.py. - Fusion confidence. Paper gives α = exp(−γ²/2σ²) with σ = 0.6 eq. 1 §3.1. The repository does not contain this formula. It relies on gradSLAM's
conceptfusionbranch, which is not pinned here and not included in this checkout. - Default feature model. Paper's pipeline is CLIP-based §3.2. The fusion script's default
model_typeis"vit"(DINO), and LSeg and DINO extractors are inmodels_common.py. The CLIP path is only inextract_conceptfusion_features.pyrun_feature_fusion_and_save_map.py models_common.py. - LLM parser and 3D comparators. Paper has an LLM parser and five comparator modules §3.4 app. A8. The repository has no code for either. A grep for the function names and for the LLM API finds nothing; the only OpenAI mention is the optional CLIP install in the README.
- Queries. Paper describes image and audio queries §3.3. The repository has text and click demos only demo_text_query.py demo_click_query.py. Both demos rescale scores to [0, 1] and threshold them for display, with thresholds of 0.6 (text) and 0.8 (click) demo_text_query.py demo_click_query.py. The paper gives no threshold value.
- Datasets and evaluation. UnCoCo is not in the repository. The README lists its download as a TODO. There is no evaluation code for the mIoU or the detection metrics README.md §4.1.
Pitfalls
- γ is undefined in units. The paper calls γ the radial distance and in one place says it is normalised to the camera centre §3.1. σ = 0.6 gives very different confidences in metres than in normalised units. The implementation is in gradSLAM, outside this repository.
- Initial confidence and new points. The paper does not state the initial confidence of a new map point or how it is set for points that receive their first observation. Read the gradSLAM implementation before you rely on eq. 2 (
c_kupdate) for new points. - Uniqueness sign. Eq. 4 is named "uniqueness" in the text, but it is a mean similarity to the other regions, and eq. 5 adds it to the similarity to the global embedding. A region that resembles the others therefore gets more weight on the global embedding, the opposite of what the name suggests. Implement the formula as written.
- Uniqueness normalisation. Eq. 4 divides the sum over j ≠ i by R, not R − 1 eq. 4. Eq. 5 reuses the index i in its denominator sum; read it as a sum over regions. Implement as written, or follow the paper's text for R − 1. The paper does not say which.
- Several regions per pixel. The paper lets a pixel belong to several regions and normalises after accumulation §3.2. Normalising after every addition, as the code does, changes the scale of contributions. The repository's choice is the one that runs.
- Compute cost. Each frame needs one CLIP pass for the whole image and one per mask (100 with Mask2Former), which the paper reports as 10 to 15 s per image on an RTX 3090 §3. The authors list the memory cost of dense maps with millions of points, each carrying a high-dimensional concept vector, as the first limitation §6.
- Dimension and storage. The paper does not state the feature dimension. The repository's default ViT-H-14 gives 1024 values per point extract_conceptfusion_features.py.
- Spatial distances. The paper does not define how point sets for "how far" are formed or how their distance is computed, beyond the figure caption, which describes distance between centroids of the matched point sets §3.4 fig. 5. The appendix gives the LLM prompt only app. A8. Relation definitions such as "to the right of" are described only in words.
- Thresholds for detection. Thresholding, non-maxima suppression and clustering are described but not parameterised §3.3. The demo thresholds are for display and should not be used as detection thresholds.
- Negation and composition. The authors say the pixel features are foreground-centred, lack compositionality and do not handle negation §6. Queries such as "not a cup" are not supported by the method.
- Table typo. The SemanticKITTI LSeg f-mIoU in tab. 5 is printed as "082". We read it as 0.82, but check the PDF before quoting it.
- Numbering. Equation numbers are taken from the LaTeX order. Table and figure numbers are counted in source order (the appendix uses A-numbers). Check them against the PDF before citing them externally.
Lineage
- Builds on: CLIP and its variants for open-set image embeddings, AudioCLIP for audio, and DINO for alternative features §1 app. A5. The mapping uses gradSLAM and PointFusion app. A3 §3.
- Compared against: LSeg-3D and OpenSeg-3D, which fuse finetuned pixel-aligned models with the same pipeline, and MaskCLIP-3D, a zero-shot per-pixel method §4.1. The related-work section also covers VL-Maps, NLMap-SayCan, CoWs, CLIP-Fields and OpenScene as concurrent work §2 §4.
- Superseded by: not stated in this paper, and no later card in the wiki covers it.
Source and license
Adapted from “ConceptFusion: Open-set Multimodal 3D Mapping” by Krishna Murthy Jatavallabhula, Alihusein Kuwajerwala, Qiao Gu, Mohd Omama, Tao Chen, Alaa Maalouf, Shuang Li, Ganesh Iyer, Soroush Saryazdi, Nikhil Keetha, Ayush Tewari, Joshua B. Tenenbaum, Celso Miguel de Melo, Madhava Krishna, Liam Paull, Florian Shkurti, Antonio Torralba (arXiv:2302.07241), used under CC BY-SA 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. This page is licensed under CC BY-SA 4.0. Code citations refer to https://github.com/concept-fusion/concept-fusion at commit 4457c1f718a5 (MIT). Any quoted code is shown under that license.