Awesome
Official code for the CVPR 2022 (oral) paper "Parameter-free Online Test-time Adaptation", by Malik Boudiaf, Romain Mueller, Ismail Ben Ayed and Luca Bertinetto.
To make reproduction as easy as possible, all necessary recipes to reproduce experiments are gathered in the Makefile. Below we detail all the steps to set-up your the environment, download data, models and reproduce all the results in the paper.
Set up
Requirements
This project was developed in Python 3.8, with cuda 11.3. First, we encourage you to create a new environment for this project:
virtualenv lame
source lame/bin/activate
Then, install detectron2 following instructions given in https://detectron2.readthedocs.io/en/latest/tutorials/install.html, and torch following https://pytorch.org/. The remaining requirements for this project should be easily installed through pip:
pip install -r requirements.txt
Download data / Create splits
First, please set your environment variable DATASET_DIR where all the datasets will be stored:
export DATASET_DIR=/path/to/your/data/folder
ImageNet validation
Please download the imagenet validation set, available at https://academictorrents.com/details/5d6d0df7ed81efd49ca99ea4737e0ae5e3a5f2e5 and place it under $DATASET_DIR/ilsvrc12/. Then execute the following commands:
mkdir -p ${DATASET_DIR}/ilsvrc12/val
tar -xv -f ${DATASET_DIR}/ILSVRC2012_img_val.tar -C ${DATASET_DIR}/ilsvrc12/val
cd ${DATASET_DIR}/ilsvrc12/val
wget https://raw.githubusercontent.com/jkjung-avt/jkjung-avt.github.io/master/assets/2017-12-01-ilsvrc2012-in-digits/valprep.sh
bash ./valprep.sh
At the end, you should obtain the following structure:
.
├── ilsvrc12
│ └── val [1000 entries exceeds filelimit, not opening dir]
where val contains 1 folder for each of the 1000 classes.
ImageNet-Vid
Please execute the following command:
make data/imagenet_vid
You should get the following structure:
ILSVRC2015/
├── Annotations
│ └── VID
│ ├── train
│ └── val
├── Data
│ └── VID
│ ├── snippets
│ ├── test
│ ├── train
│ └── val
└── ImageSets
└── VID
ImageNet-V2
Please execute the following command and follow the instructions to download:
make data/imagenet_v2
You should get the following structure:
imagenet_v2/
├── imagenetv2-matched-frequency-format-val
├── imagenetv2-threshold0.7-format-val
└── imagenetv2-top-images-format-val
ImageNet-C
Please execute the following command twice, once to download the data and the second to create the splits :
make data/imagenet_c
You should get the following structure:
imagenet_c/
├── test
│ ├── glass_blur
│ ├── impulse_noise
│ ├── jpeg_compression
│ ├── motion_blur
│ ├── pixelate
│ ├── saturate
│ ├── shot_noise
│ ├── snow
│ ├── spatter
│ └── speckle_noise
└── val
├── brightness
├── contrast
├── defocus_blur
├── elastic_transform
├── fog
├── frost
├── gaussian_blur
├── gaussian_noise
└── zoom_blur
Tao
Please execute the following command twice, once to download the data and the second to create the splits :
make data/tao
You should get a structure like
TAO/
├── annotations
│ ├── checksums
│ └── video-lists
└── frames
├── train
│ ├── ArgoVerse
│ ├── BDD
│ ├── Charades
│ ├── LaSOT
│ └── YFCC100M
└── val
├── ArgoVerse
├── BDD
├── Charades
├── LaSOT
└── YFCC100M
Download / convert models
All experiments you will run should automatically download and convert the models they require, but in case you'd still like to download them manually, every model used in this work has its own recipe in the Makefile that you can inspect.
Reproduce results
Please note that by default, all commands explicited in the remaining of this section will perform experiments by looping over all methods and using all gpus available on the current machine/server/cluster. If you only want to produce results for certain methods and using only a subset of GPUS, please use the options:
make METHODS=method_1 method_2 GPUS=0,1,2 command
will, for instance, execute the command looping over method_1 and method_2, and using gpus 0, 1, 2 on the cluster (ids as shown with nvidia-smi).
Validation
<p align="center"> <img src="figures/LaplacianShot_cross_cases-1.png" width="400" height="400"/> <img src="figures/Tent_cross_cases-1.png" width="400" height="400"/> </p>To reproduce Fig.2 of the paper, first execute
make validation
Once validation is over, please run:
make save_best_config # prints and save the best overall config to /output/validatopn/best_configs
make validation_heatmap # Reproduce Fig. 2
Test results
Figure 3: box plot of test results
<p align="center"> <img src="figures/box_niid_50-1.png" width="500" height="400"/> </p>To reproduce Fig.3:
make test
followed by:
make plot_box
Figure 4 (top): Robustness w.r.t training
<p align="center"> <img src="figures/spider_different_r50_training-1.png" width="600" height="400"/> </p>make robustness_training
followed by:
make plot_spider_training
Figure 4 (bottom): Robustness w.r.t architecture
<p align="center"> <img src="figures/spider_different_arch-1.png" width="600" height="400"/> </p>make robustness_arch
followed by:
make plot_spider_arch
Figure 5: Influence of batch size on the methods
<p align="center"> <img src="figures/batch_50-1.png" width="400" height="400"/> </p> ``` make study_batch_size ``` followed by: ``` make plot_batch ```Figure 6: Runtimes of methods
<p align="center"> <img src="figures/times-1.png" width="400" height="300"/> </p>make runtimes
followed by
plot_time
Archiving / restoring results
By default, current results are stored in ./output/, and all plotting scripts will exclusively use results stored in ./output. In order to properly archive some set of results on your current machine, please use:
make MODE=[benchmark or validation] store
and follows the instructions to give a name to this set of experiments. If you want to restore any experiment down the road, you can easily do so by executing:
make MODE=[benchmark or validation] restore
and follow the instructions.
Acknowledgments
We wish to thank the authors and contributors to https://github.com/facebookresearch/Detectron2, from which this code was largely inspired, for publicly releasing their code and making it easily customizable. We'd also like to thank the authors and contributors to https://github.com/google-research/simclr and https://github.com/lukemelas/PyTorch-Pretrained-ViT for kindly providing pre-trained models.