• Stars
    star
    273
  • Rank 150,780 (Top 3 %)
  • Language
    Python
  • Created over 4 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

CSI: Novelty Detection via Contrastive Learning on Distributionally Shifted Instances (NeurIPS 2020)

CSI: Novelty Detection via Contrastive Learning on Distributionally Shifted Instances

Official PyTorch implementation of "CSI: Novelty Detection via Contrastive Learning on Distributionally Shifted Instances" (NeurIPS 2020) by Jihoon Tack*, Sangwoo Mo*, Jongheon Jeong, and Jinwoo Shin.

1. Requirements

Environments

Currently, requires following packages

Datasets

For CIFAR, please download the following datasets to ~/data.

For ImageNet-30, please download the following datasets to ~/data.

For Food-101, remove hotdog class to avoid overlap.

2. Training

Currently, all code examples are assuming distributed launch with 4 multi GPUs. To run the code with single GPU, remove -m torch.distributed.launch --nproc_per_node=4.

Unlabeled one-class & multi-class

To train unlabeled one-class & multi-class models in the paper, run this command:

CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 train.py --dataset <DATASET> --model <NETWORK> --mode simclr_CSI --shift_trans_type rotation --batch_size 32 --one_class_idx <One-Class-Index>

Option --one_class_idx denotes the in-distribution of one-class training. For multi-class training, set --one_class_idx as None. To run SimCLR simply change --mode to simclr. Total batch size should be 512 = 4 (GPU) * 32 (--batch_size option) * 4 (cardinality of shifted transformation set).

Labeled multi-class

To train labeled multi-class model (confidence calibrated classifier) in the paper, run this command:

# Representation train
CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 train.py --dataset <DATASET> --model <NETWORK> --mode sup_simclr_CSI --shift_trans_type rotation --batch_size 32 --epoch 700
# Linear layer train
python train.py --mode sup_CSI_linear --dataset <DATASET> --model <NETWORK> --batch_size 32 --epoch 100 --shift_trans_type rotation --load_path <MODEL_PATH>

To run SupCLR simply change --mode to sup_simclr, sup_linear for representation training and linear layer training respectively. Total batch size should be same as above. Currently only supports rotation for shifted transformation.

3. Evaluation

We provide the checkpoint of the CSI pre-trained model. Download the checkpoint from the following link:

Unlabeled one-class & multi-class

To evaluate my model on unlabeled one-class & multi-class out-of-distribution (OOD) detection setting, run this command:

python eval.py --mode ood_pre --dataset <DATASET> --model <NETWORK> --ood_score CSI --shift_trans_type rotation --print_score --ood_samples 10 --resize_factor 0.54 --resize_fix --one_class_idx <One-Class-Index> --load_path <MODEL_PATH>

Option --one_class_idx denotes the in-distribution of one-class evaluation. For multi-class evaluation, set --one_class_idx as None. The resize_factor & resize fix option fix the cropping size of RandomResizedCrop(). For SimCLR evaluation, change --ood_score to simclr.

Labeled multi-class

To evaluate my model on labeled multi-class accuracy, ECE, OOD detection setting, run this command:

# OOD AUROC
python eval.py --mode ood --ood_score baseline_marginalized --print_score --dataset <DATASET> --model <NETWORK> --shift_trans_type rotation --load_path <MODEL_PATH>
# Accuray & ECE
python eval.py --mode test_marginalized_acc --dataset <DATASET> --model <NETWORK> --shift_trans_type rotation --load_path <MODEL_PATH>

This option is for marginalized inference. For single inference (also used for SupCLR) change --ood_score baseline in first command, and --mode test_acc in second command.

4. Results

Our model achieves the following performance on:

One-Class Out-of-Distribution Detection

Method Dataset AUROC (Mean)
SimCLR CIFAR-10-OC 87.9%
Rot+Trans CIFAR-10-OC 90.0%
CSI (ours) CIFAR-10-OC 94.3%

We only show CIFAR-10 one-class result in this repo. For other setting, please see our paper.

Unlabeled Multi-Class Out-of-Distribution Detection

Method Dataset OOD Dataset AUROC (Mean)
Rot+Trans CIFAR-10 CIFAR-100 82.5%
CSI (ours) CIFAR-10 CIFAR-100 89.3%

We only show CIFAR-10 to CIFAR-100 OOD detection result in this repo. For other OOD dataset results, see our paper.

Labeled Multi-Class Result

Method Dataset OOD Dataset Acc ECE AUROC (Mean)
SupCLR CIFAR-10 CIFAR-100 93.9% 5.54% 88.3%
CSI (ours) CIFAR-10 CIFAR-100 94.8% 4.24% 90.6%
CSI-ensem (ours) CIFAR-10 CIFAR-100 96.0% 3.64% 92.3%

We only show CIFAR-10 with CIFAR-100 as OOD in this repo. For other dataset results, please see our paper.

5. New OOD dataset

We find that current benchmark datasets for OOD detection, are visually far from in-distribution datasets (e.g. CIFAR).

To address this issue, we provide new datasets for OOD detection evaluation: LSUN_fix, ImageNet_fix. See the above figure for the visualization of current benchmark and our dataset.

To generate OOD datasets, run the following codes inside the ./datasets folder:

# ImageNet FIX generation code
python imagenet_fix_preprocess.py 
# LSUN FIX generation code
python lsun_fix_preprocess.py

Citation

@inproceedings{tack2020csi,
  title={CSI: Novelty Detection via Contrastive Learning on Distributionally Shifted Instances},
  author={Jihoon Tack and Sangwoo Mo and Jongheon Jeong and Jinwoo Shin},
  booktitle={Advances in Neural Information Processing Systems},
  year={2020}
}

More Repositories

1

L2T-ww

Learning What and Where to Transfer (ICML 2019)
Python
251
star
2

Confident_classifier

Training Confidence-Calibrated Classifier for Detecting Out-of-Distribution Samples / ICLR 2018
Python
178
star
3

cs-kd

Regularizing Class-wise Predictions via Self-knowledge Distillation (CVPR 2020)
Python
107
star
4

M2m

Code for the paper "M2m: Imbalanced Classification via Major-to-minor Translation" (CVPR 2020)
Python
92
star
5

LfF

Learning from Failure: Training Debiased Classifier from Biased Classifier (NeurIPS 2020)
Python
89
star
6

ifseg

IFSeg: Image-free Semantic Segmentation via Vision-Language Model (CVPR 2023)
Python
80
star
7

SelfPatch

Python
57
star
8

consistency-adversarial

Consistency Regularization for Adversarial Robustness (AAAI 2022)
Python
52
star
9

PsCo

Unsupervised Meta-Learning via Few-shot Pseudo-supervised Contrastive Learning (ICLR 2023)
Python
52
star
10

MASKER

MASKER: Masked Keyword Regularization for Reliable Text Classification (AAAI 2021)
Python
51
star
11

object-aware-contrastive

Object-aware Contrastive Learning for Debiased Scene Representation (NeurIPS 2021)
Python
45
star
12

s-clip

S-CLIP: Semi-supervised Vision-Language Pre-training using Few Specialist Captions
Python
43
star
13

lookahead_pruning

Lookahead: A Far-sighted Alternative of Magnitude-based Pruning (ICLR 2020)
Python
33
star
14

temporal-selfsupervision

Python
31
star
15

BAR

The repository for the official Biased Action Recognition (BAR) dataset for the paper Learning from Failure: Training Debiased Classifier from Biased Classifier (NeurIPS 2020) by Junhyun Nam et al.
30
star
16

HOMER

Official implementation of Hierarchical Context Merging: Better Long Context Understanding for Pre-trained LLMs (ICLR 2024).
Python
27
star
17

oreo

Python
23
star
18

b2t

Bias-to-Text: Debiasing Unknown Visual Biases through Language Interpretation
Python
23
star
19

OpenCoS

Python
15
star
20

MetaMAE

Modality-Agnostic Self-Supervised Learning with Meta-Learned Masked Auto-Encoder (NeurIPS 2023)
Python
10
star
21

SURF

Python
8
star
22

lime-cam-pytorch

Pytorch implemenation of LIME-CAM
Python
7
star
23

OAMixer

OAMixer: Object-aware Mixing Layer for Vision Transformers (CVPRW 2022)
Python
6
star
24

smoothing-catrs

Code for the paper "Confidence-aware Training of Smoothed Classifiers for Certified Robustness" (AAAI 2023)
Python
6
star
25

ml-papers-classification

Python
1
star