Paper · 2022-04-19 · cs.CV, cs.CL, cs.LG
ELEVATER: A Benchmark and Toolkit for Evaluating Language-Augmented Visual Models
Benchmarks task-level transfer of language-augmented visual models on 20 classification and 35 detection datasets, with WordNet, Wiktionary and GPT-3 class knowledge and automatic hyper-parameter search. Proposes starting the linear head from the text encoder. Author-reported: CLIP ViT-B/32 linear probing at 5 shots averages 65.35% over 20 IC datasets, against 58.09% with a random head.
Vision-language pre-trainingZero-shot learningLinear probingTransfer learningbenchmarkvision-languagetransfer-learninglinear-probing
arXivPDFCodeMarkdown14 min read
AI-compiled by claude-haiku-5-5 on 2026-10-19, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Models trained to match pictures with their captions, such as CLIP, can often recognise classes they were never explicitly trained to label, as long as you describe those classes in words. This paper asks how to measure that kind of transfer fairly. It assembles 20 image-classification and 35 object-detection datasets, adds extra text about each class label (dictionary definitions, a WordNet path, and text generated by GPT-3), and provides a toolkit that searches the training settings automatically, so that no one has to tune them by hand.
The paper also changes how the new classifier is started. The usual choice is random numbers. The authors instead start it from the model's own text encoder, and report that this works better, especially when labelled examples are few.
The authors note that several of their findings differ from earlier reports, for example that few-shot training with the proposed initialisation beats zero-shot. Treat the numbers as the authors' own results.
TL;DR
ELEVATER is a benchmark (20 image-classification and 35 object-detection datasets, each with class-name knowledge) and a toolkit with automatic hyper-parameter search §3 §4. The headline method initialises the linear head of a language-augmented model from its text encoder, instead of random weights §4.2. The paper reports this as the better adaptation method across settings, and reports that external knowledge helps zero-shot transfer §5. All numbers are author-reported.
Problem
Language-augmented visual models are usually evaluated in ad hoc subsets, with adaptation details that are hard to reproduce §1. Existing zero-shot benchmarks are class-level, with disjoint train and test categories inside one domain, while task-level transfer across datasets had no public benchmark §2. Adapting such a model with a randomly initialised linear head is the default, but the paper finds that it makes full fine-tuning poor when data is scarce §5.1.
Method
Benchmark data. The image-classification (IC) suite has 20 datasets with 638,429 training and 192,677 test images, and 1,151 concepts in total app. A tab. 1. The object-detection (OD) suite has 35 Roboflow datasets with 132,314 training and 20,070 test images and 314 concepts app. A fig. 1.
Knowledge per class. Each class name is augmented with up to four text sources §3.1 fig. 1 (b):
- WordNet hierarchy: the words on the path from the class node up to the top parent.
- WordNet definition of the synset.
- Wiktionary definition.
- GPT-3 knowledge: five generated sequences per class, produced with an in-context prompt built from random pairs of class names and their Wiktionary definitions.
The paper says WordNet and Wiktionary coverage is incomplete, while GPT-3 covers every class but its quality is hard to judge §3.1.
Tracks. The industry track has no limit on pre-training data, except that benchmark images may not appear in pre-training when zero-shot or few-shot results are reported. The academic track restricts pre-training to named public datasets §3.2.
Baseline checkpoints. IC uses supervised ViT-B/32 (ImageNet-22K), CLIP ViT-B/32, UniCL Swin-Tiny and Knowledge UniCL Swin-Tiny. OD uses DyHead, GLIP, GLIP-A and Knowledge GLIP-A, all with Swin-Tiny backbones §3.2.
Evaluation settings. Sample efficiency covers zero-shot, few-shot and full data. IC uses N = 0, 5, 20, 50 and full. OD uses N = 0, 1, 3, 5, 10 and full. Few-shot subsets are drawn with three random seeds §3.3. Parameter efficiency compares linear probing (only the classifier is trained; for IC the image backbone is frozen) with full fine-tuning §3.3.
Language-augmented models. Such a model has an image encoder f and a text encoder g. Projection layers map both outputs into a joint space of dimension P. Zero-shot prediction takes the class whose averaged prompt embedding has the highest similarity to the image embedding §4.2 fig. 2 (b). Adaptation variants are compared as follows §4.2 fig. 2:
- Random head (original CLIP recipe): a randomly initialised linear layer on the projected features, P by K fig. 2 (c).
- Separate-Head (Language-S): the same P by K layer, initialised with the text-side class vectors V, with bias zero fig. 2 (d).
- Merge-Head (Language-M): a D by K layer on the backbone output, initialised with W_v V. This matches the trainable-parameter count of a language-free model fig. 2 (e) §5.1.
The paper recommends the language-initialised variants as the default. Its argument is that the initial classifier then reproduces the zero-shot classifier app. C, and that external knowledge can be concatenated into the prompt before encoding §4.2.
# Language-initialised linear head, Separate-Head [§4.2] [fig. 2 (d)]
# Input: class_names (K), prompt templates, text encoder g
# Output: weight W (P, K) and bias b (K); P = 512 for ViT-B/32 [§5.1]
def init_language_head(class_names, templates, text_encoder):
# One column per class, built from its prompts [§4.2]
columns = []
for name in class_names:
# Encode each prompt that contains the class name and any
# knowledge text [§4.2] [§3.1]
prompt_vectors = text_encoder(make_prompts(name, templates))
# Normalise each prompt embedding, then average them
# [code: vision_benchmark/evaluation/feature.py#L546-L547]
prompt_vectors = normalise(prompt_vectors) # (T, P)
class_vector = mean(prompt_vectors, axis=0) # (P,)
# Renormalise the averaged vector [code: ...feature.py#L548]
columns.append(normalise(class_vector))
W = stack(columns, axis=1) # (P, K)
# Bias starts at zero [§4.2]
b = zeros(K)
return W, bObject detection. GLIP is treated as a language-augmented detector: a CLIP-like dual encoder plus a cross-modal module. Linear probing updates the projection matrices W_v and W_t. Prompt tuning initialises the language input of the cross-modal module from V and trains only V §4.2. The paper says the boundary between linear probing and prompt tuning blurs when the cross-modal module is removed §4.2.
Toolkit. The IC protocol splits each class 80/20 into train and validation. It searches the learning rate and weight decay, trains each setting for 10 epochs, keeps the best validation score, and then runs a final training for 50 epochs §4.1. OD uses a validation set of 1 sample for N = 1, 3 and 5, 3 samples for N = 10, and the full split for the full-data setting §4.1. The learning rate drops on a validation plateau, and training stops after 9 epochs without improvement §4.1.
# Image-classification protocol: search, then final run [§4.1]
# Input: train_pool (N samples per class), test_set
# Output: test accuracy of the final run
def run_ic_protocol(train_pool, test_set):
# 80% / 20% split of each class [§4.1]
# [code: vision_benchmark/evaluation/feature.py#L144-L145]
train_split, val_split = split_each_class(train_pool, 0.2)
best_lr = None
best_wd = None
best_val = -1.0
# Six learning rates, 1e-6 to 1e-1, log-spaced
# [code: vision_benchmark/evaluation/full_model_finetune.py#L425]
for lr in log_grid(1e-6, 1e-1, count=6):
# Coarse-to-fine weight-decay search; 10 epochs per run [§4.1]
wd, val_score = search_weight_decay(lr, train_split, val_split)
if val_score > best_val:
best_lr = lr
best_wd = wd
best_val = val_score
# Final run on train plus validation, 50 epochs [§4.1]
# Returns the best per-epoch test accuracy, see Pitfalls
# [code: vision_benchmark/evaluation/full_model_finetune.py#L270-L275]
return train_final(train_pool, test_set, best_lr, best_wd, epochs=50)Hyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| IC few-shot sizes N | 0, 5, 20, 50, full | §3.3 | Three random seeds for the few-shot subset §3.3. |
| IC train/validation split | 80% / 20% per class | §4.1 feature.py feature.py | Validation count per class is ceil(0.2 × count). The code takes the first indices of each class, not random ones. |
| IC search epochs | 10 | §4.1 vitb32_CLIP.yaml | Per (learning rate, weight decay) setting. |
| IC final epochs | 50 | §4.1 vitb32_CLIP.yaml full_model_finetune.py | 10 search epochs plus 40 extra. |
| IC learning-rate grid | 1e-6 to 1e-1, six log-spaced values | not stated in paper full_model_finetune.py | Code only. |
| IC weight-decay search | 97 log-spaced candidates from 1e-6 to 1e6; 7 coarse starting points; then refinement with spans 8, 4, 2, 1 | not stated in paper full_model_finetune.py full_model_finetune.py full_model_finetune.py | Code only. The paper calls the search a grid. |
| IC optimiser | SGD, momentum 0.9, Nesterov off | not stated in paper vitb32_CLIP.yaml vitb32_CLIP.yaml default.py | Code only. |
| IC batch size | 64 per device | not stated in paper vitb32_CLIP.yaml | Code only. The default in config is 32 default.py. |
| IC learning-rate schedule | constant (no step milestones) | not stated in paper default.py full_model_finetune.py | The yaml's WarmupCosine block is not read by this path (see Pitfalls). |
| IC feature normalisation | off, with parameter-free batch norm on the features | app. C.1 default.py default.py | Batch norm has no affine parameters. |
| IC logit scale | fixed at 1 | app. C.2 default.py full_model_finetune.py | Not trainable. |
| IC zero-shot head init | class vectors from text encoder, bias zero | §4.2 full_model_finetune.py | Code only for the normalisation steps. |
| Precision | FP32 | §5 | FP16 was tried in preliminary runs and was worse on 16 of 20 IC datasets §5. |
| OD batch size | 4 | app. B | Same for all OD adaptation methods. |
| OD learning rate and weight decay | GLIP prompt tuning: 0.05 / 0.25. GLIP linear probing and fine-tuning: 1e-4 / 0.05. DyHead linear probing and fine-tuning: 1e-4 / 0.05. | app. B | Learning rate / weight decay. Set by empirical rules or simple tuning app. B. |
| OD scheduler | ReduceLROnPlateau, patience 3, factor 0.1 | §4.1 | Monitors the validation split. |
| OD early stop | after 9 epochs without improvement | §4.1 | Returns the best checkpoint by validation score. |
| Knowledge sequences | 5 GPT-3 sequences per class | §3.1 | The paper describes prompt construction only. |
Results
Author-reported. Averages over 20 IC datasets tab. 2 and 35 OD datasets tab. 3. Setup: FP32 §5; checkpoints and tracks as in §3.2. Entries are mean ± standard deviation over seeds. "–" means not reported.
Image classification, averaged over 20 datasets tab. 2
| Checkpoint | Adaptation | Init | Zero-shot | 5-shot | 20-shot | 50-shot | Full |
|---|---|---|---|---|---|---|---|
| CLIP ViT-B/32 | Linear probing | Random | 56.64 | 58.09 ± 2.80 | 69.97 ± 1.30 | 74.09 ± 0.69 | 78.38 |
| CLIP ViT-B/32 | Linear probing | Language-S | 56.64 | 65.35 ± 1.24 | 71.69 ± 0.93 | 74.89 ± 0.79 | 78.40 |
| CLIP ViT-B/32 | Linear probing | Language-M | 56.64 | 65.88 ± 0.79 | 72.05 ± 0.85 | 75.08 ± 0.73 | 78.96 |
| CLIP ViT-B/32 | Fine-tuning | Random | 56.64 | 29.75 ± 6.64 | 46.76 ± 11.9 | 61.70 ± 9.97 | 77.77 |
| CLIP ViT-B/32 | Fine-tuning | Language-S | 56.64 | 63.29 ± 3.18 | 72.19 ± 1.31 | 75.70 ± 1.14 | 79.97 |
| Supervised ViT-B/32 | Linear probing | Random | – | 56.00 ± 2.67 | 67.23 ± 1.66 | 71.35 ± 1.17 | 75.29 |
| Supervised ViT-B/32 | Fine-tuning | Random | – | 58.55 ± 2.58 | 71.27 ± 1.25 | 75.36 ± 1.42 | 80.39 |
| UniCL Swin-Tiny | Linear probing | Language-S | 27.15 | 54.31 ± 4.15 | 66.42 ± 2.08 | 70.49 ± 1.01 | 74.75 |
| UniCL Swin-Tiny | Fine-tuning | Language-S | 27.15 | 44.75 ± 5.42 | 56.53 ± 5.37 | 67.90 ± 5.31 | 78.48 |
| Knowledge UniCL Swin-Tiny | Linear probing | Language-S | 33.44 | 55.06 ± 2.36 | 66.26 ± 1.56 | 70.16 ± 1.09 | 74.47 |
| Knowledge UniCL Swin-Tiny | Fine-tuning | Language-S | 33.44 | 48.41 ± 2.84 | 58.06 ± 4.30 | 71.66 ± 2.02 | 78.05 |
The zero-shot value is shared by all rows of the same checkpoint, because adaptation does not change zero-shot accuracy.
Object detection, averaged over 35 datasets tab. 3 (few-shot columns are N = 1, 3, 5, 10)
| Checkpoint | Adaptation | Zero-shot | 1-shot | 3-shot | 5-shot | 10-shot | Full |
|---|---|---|---|---|---|---|---|
| GLIP (Swin-Tiny) | Prompt | 19.7 | 29.7 ± 0.4 | 36.5 ± 0.6 | 39.0 ± 1.1 | 41.8 ± 1.2 | 54.4 |
| GLIP (Swin-Tiny) | Linear probing | – | 22.2 ± 0.1 | 24.4 ± 0.2 | 25.1 ± 0.2 | 25.6 ± 0.6 | 35.2 |
| GLIP (Swin-Tiny) | Fine-tuning | – | 32.2 ± 0.7 | 39.2 ± 0.3 | 42.5 ± 0.9 | 49.1 ± 0.6 | 63.2 |
| DyHead (Swin-Tiny) | Linear probing | – | 15.2 ± 0.6 | 19.2 ± 0.9 | 19.8 ± 1.0 | 20.6 ± 1.1 | 31.4 |
| DyHead (Swin-Tiny) | Fine-tuning | – | 25.6 ± 0.4 | 37.1 ± 0.5 | 40.1 ± 1.5 | 44.6 ± 0.7 | 63.9 |
Knowledge added to CLIP tab. 4 (learned on top of CLIP, averaged over IC; wins are datasets out of 20)
| Model | 5-shot LP | 5-shot FT | Full LP | Full FT |
|---|---|---|---|---|
| CLIP | 65.35 ± 1.24 | 63.29 ± 3.18 | 78.40 | 79.97 |
| K-CLIP | 65.83 ± 1.50 | 65.10 ± 2.08 | 78.75 | 80.32 |
| Gain | +0.48 | +1.81 | +0.35 | +0.35 |
| Wins | 15/20 | 16/20 | 16/20 | 15/20 |
Zero-shot with knowledge sources fig. 5 (bottom table) (zero-shot accuracy, averaged)
| Model | Baseline | WordNet path | WordNet def. | Wiktionary | GPT-3 | Wiktionary + GPT-3 |
|---|---|---|---|---|---|---|
| UniCL, IC | 27.15 | 30.68 | 29.92 | 33.44 | 33.73 | 33.95 |
| GLIP-A, OD | 11.53 | 12.43 | 11.70 | 13.14 | 11.98 | 13.30 |
Comparison with self-supervised ViT-B/16 checkpoints tab. 5 (IC, averaged; starred row uses language initialisation)
| Checkpoint | Adaptation | Zero-shot | 5-shot | 20-shot | 50-shot | Full |
|---|---|---|---|---|---|---|
| CLIP* | Linear probing | 59.96 | 68.27 ± 0.97 | 74.76 ± 1.11 | 77.75 ± 0.81 | 81.17 |
| ViT (IN-21K → IN-1K) | Linear probing | – | 57.61 ± 3.62 | 69.93 ± 0.71 | 73.74 ± 0.79 | 77.60 |
| DeiT (IN-1K) | Linear probing | – | 54.06 ± 3.02 | 68.57 ± 3.43 | 75.53 ± 0.72 | 79.56 |
| MAE (IN-1K) | Linear probing | – | 33.37 ± 1.98 | 48.03 ± 2.70 | 58.26 ± 0.84 | 68.70 |
| MoCo-v3 (IN-1K) | Linear probing | – | 50.17 ± 3.43 | 61.99 ± 2.51 | 69.71 ± 1.03 | 74.92 |
| CLIP* | Fine-tuning | 59.96 | 69.12 ± 1.66 | 74.77 ± 2.34 | 78.21 ± 2.04 | 83.63 |
| ViT (IN-21K → IN-1K) | Fine-tuning | – | 57.18 ± 2.02 | 72.45 ± 2.85 | 78.53 ± 0.69 | 82.02 |
| DeiT (IN-1K) | Fine-tuning | – | 54.06 ± 3.02 | 68.53 ± 3.47 | 75.57 ± 0.68 | 79.55 |
| MAE (IN-1K) | Fine-tuning | – | 36.10 ± 3.25 | 54.13 ± 3.86 | 65.86 ± 2.42 | 74.43 |
| MoCo-v3 (IN-1K) | Fine-tuning | – | 39.30 ± 3.84 | 58.75 ± 5.55 | 70.33 ± 1.64 | 77.71 |
The paper's headline findings §1 §5 are these:
- Language-initialised heads beat random heads in every setting shown, and with them few-shot results are above zero-shot results §5.1 fig. 3.
- With random heads, fine-tuning is far worse than linear probing at few shots tab. 2. With language initialisation, fine-tuning overtakes linear probing from about 20 shots §5.1 tab. 2.
- CLIP beats the supervised ViT in the few-shot settings, and the gap narrows with more data §5.2 fig. 4 (a).
- Knowledge helps zero-shot transfer fig. 5 §5.4, and selecting a knowledge source on validation data gives small gains tab. 4.
Paper vs code
The official toolkit is Computer-Vision-in-the-Wild/Elevater_Toolkit_IC
at commit 00d0af78559d5f3d800ae4668210e6bd1f2f84b9, MIT licence. It is the
repository of the Computer-Vision-in-the-Wild organisation, which the ELEVATER
project page (named in the abstract) links through its issue tracker. The
repository covers the image-classification toolkit only. I searched GitHub
for other official repositories under the same organisation and found none
for object detection. The OD results are therefore not checked against code.
What I checked in the IC code:
- Search protocol. The paper calls the hyper-parameter search a grid §4.1. The code uses six log-spaced learning rates [code: vision_benchmark/evaluation/full_model_finetune.py#L425]. For weight decay it runs a coarse-to-fine search over 97 log-spaced candidates [code: vision_benchmark/evaluation/full_model_finetune.py#L163-L211]. The paper's grid values are not stated.
- Final-run epochs. The paper states 10 search epochs and 50 final epochs §4.1. The code matches: 10 plus 40 extra [code: vision_benchmark/resources/model/vitb32_CLIP.yaml#L38-L39] [code: vision_benchmark/evaluation/full_model_finetune.py#L474].
- Final training data. The paper says the final run is for reporting on the test split §4.1. The code merges train and validation for the final run by default default.py [code: vision_benchmark/evaluation/full_model_finetune.py#L487-L489].
- Head initialisation. The paper says the Separate-Head weights are initialised with V and bias zero §4.2. The code does this with text features and a zero bias [code: vision_benchmark/evaluation/full_model_finetune.py#L106-L116]. The code also normalises each prompt embedding and then the mean [code: vision_benchmark/evaluation/feature.py#L546-L548], which the paper does not describe.
- Frozen parts. In adaptation, the text tower, token embedding, final layer norm, positional embedding and logit scale are all frozen [code: vision_benchmark/evaluation/full_model_finetune.py#L85-L86]. Only the visual side and the head are trained.
- Few-shot sampling. The paper's few-shot protocol draws three random seeds §3.3. Its OD text also says the train/validation split is re-sampled three times §4.1. The IC code draws the few-shot subset with the seed [code: vision_benchmark/evaluation/feature.py#L618-L621]. The validation split takes the first indices of each class, and a code comment says it is not random feature.py.
- Knowledge truncation. The paper describes the WordNet hierarchy as the full path up to the top parent §3.1. The code keeps at most three nodes [code: vision_benchmark/evaluation/feature.py#L477].
- Knowledge text format. The code joins each knowledge string to the class name with a fixed separator and word-tokenises it [code: vision_benchmark/evaluation/feature.py#L530]. The paper does not give the format.
- Learning-rate schedule. The paper does not state an IC schedule. The code uses a constant rate full_model_finetune.py. The yaml carries a WarmupCosine setting that this path does not read [code: vision_benchmark/resources/model/vitb32_CLIP.yaml#L46-L47].
- Logit scale. The paper's appendix contrasts CLIP's learned temperature with downstream adaptation app. C.2. In the code the logit scale is fixed at exp(0) = 1 full_model_finetune.py.
Pitfalls
- Test-set epoch selection in the IC final run. The final run evaluates on the test split after every epoch and keeps the best accuracy and logits [code: vision_benchmark/evaluation/full_model_finetune.py#L270-L275] [code: vision_benchmark/evaluation/full_model_finetune.py#L288]. The reported IC number is therefore the best epoch on the test split, not a fixed final epoch. If you compare against this paper, state whether you did the same. A fixed-epoch protocol may report a different number.
- N-shot is counted before the split. The sampled subset is split 80/20
into train and validation feature.py.
During search, each class therefore trains on about 80% of N. The final run
merges the two parts back default.py. The
paper defines N as the training-set size §3.3, and the code applies it
before the split. The sampler is in the external
vision_datasetspackage, so I did not confirm that it returns exactly N per class. - N = 1 has no training sample. Validation takes ceil(0.2 × 1) = 1 sample per class feature.py. The IC script therefore raises N = 1 to N = 2 and disables the final merge [code: vision_benchmark/commands/linear_probe.py#L71-L74]. The paper's IC settings do not include N = 1 §3.3.
- Silent failures score zero. Any exception during a search run is swallowed and the run is scored 0.0 [code: vision_benchmark/evaluation/full_model_finetune.py#L174-L176]. A broken configuration can therefore lose the search without any error.
- Coarse search may be shorter than intended. The seven coarse starting points are picked by exact floating-point equality with a second logspace full_model_finetune.py. Equality may fail for some points, so fewer than seven may run. I did not run this.
- Cost of the search. Counting the loops, each learning rate gets about 15 weight-decay runs (7 coarse plus 8 refinement), each of 10 epochs, for about 90 runs and 900 epochs in total, plus the 50-epoch final run. This is my count from the code, not a figure from the paper.
- Schedule in the yaml is inactive. Changing the WarmupCosine block in the model yaml will not change IC training [code: vision_benchmark/evaluation/full_model_finetune.py#L396-L403].
- Head initialisation depends on normalisation and scale. With the default configuration the features are not L2-normalised and the logit scale is 1, so the initial logits are not CLIP's zero-shot logits. The argmax at initialisation matches the zero-shot choice (unit-norm weights, same features), but the scale used for the loss does not [code: vision_benchmark/config/default.py#L143-L148]. This is my reading of the code, not a run.
- Template defaults. Prompts come from a per-dataset template list. If a dataset has none, the single template "a photo of a {}" is used [code: vision_benchmark/evaluation/feature.py#L499]. Results on new datasets depend on this choice.
- Figure 5 and text disagree. The text gives UniCL's best knowledge result as 33.93 §5.4. The table in Figure 5 gives 33.95 fig. 5. Use the table.
- OD protocol unchecked. The learning-rate and early-stop rules for OD are from the paper only §4.1 app. B. The code for them is not in the repository I cloned.
- Few-shot numbers are noisy. Several few-shot standard deviations exceed 5 points, for example ±11.9 for CLIP fine-tuning with a random head at 20 shots tab. 2. Single comparisons between rows within that range are not meaningful.
Lineage
- Builds on: the CLIP-style language-augmented visual models that the paper cites as CLIP and ALIGN §1, and the UniCL, GLIP and Knowledge UniCL checkpoints it evaluates §3.2.
- Compared against: ImageNet-1K zero-shot and class-level zero-shot benchmarks (AwA, CUB, SUN, aPY, ZS-ImageNet) tab. 1 §2, VTAB for task-level transfer without language §2, and self-supervised ViT, DeiT, MAE and MoCo-v3 tab. 5.
- Superseded by: nothing in this wiki yet.
Source and license
Adapted from “ELEVATER: A Benchmark and Toolkit for Evaluating Language-Augmented Visual Models” by Chunyuan Li, Haotian Liu, Liunian Harold Li, Pengchuan Zhang, Jyoti Aneja, Jianwei Yang, Ping Jin, Houdong Hu, Zicheng Liu, Yong Jae Lee, Jianfeng Gao (arXiv:2204.08790), 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/Computer-Vision-in-the-Wild/Elevater_Toolkit_IC at commit 00d0af78559d (MIT). Any quoted code is shown under that license.