OpenOOD - ImageNet

Reproduces the OpenOOD benchmark for OOD detection, using a pre-trained ResNet 50.

Warning

This is currently incomplete, see ImageNet-OpenOOD.

11 import pandas as pd  # additional dependency, used here for convenience
12 import torch
13 from torchvision.models import resnet50
14 from torchvision.models.resnet import ResNet50_Weights
15
16 from pytorch_ood.benchmark import ImageNet_OpenOOD
17 from pytorch_ood.detector import MaxSoftmax
18 from pytorch_ood.utils import fix_random_seed
19
20 fix_random_seed(123)
21
22 device = "cuda:0"
23 loader_kwargs = {"batch_size": 16, "num_workers": 12}
26 model = resnet50(ResNet50_Weights.IMAGENET1K_V1).eval().to(device)
27 trans = ResNet50_Weights.IMAGENET1K_V1.transforms()
28
29 print(trans)

If you want to test more detectors, you can just add them here

33 detectors = {
34     "MSP": MaxSoftmax(model),
35 }

The ImageNet root should contain at least the validation tar, the dev kit tar, and the meta.bin that is generated by the torchvision ImageNet implementation.

40 results = []
41 benchmark = ImageNet_OpenOOD(root="data", image_net_root="data/imagenet-2012/", transform=trans)
42
43
44 with torch.no_grad():
45     for detector_name, detector in detectors.items():
46         print(f"> Evaluating {detector_name}")
47         res = benchmark.evaluate(detector, loader_kwargs=loader_kwargs, device=device)
48         for r in res:
49             r.update({"Detector": detector_name})
50         results += res
51
52 df = pd.DataFrame(results)
53 print((df.set_index(["Dataset", "Detector"]) * 100).to_csv(float_format="%.2f"))

This should produce a table with the following output:

Dataset

Detector

AUROC

AUPR-IN

AUPR-OUT

FPR95TPR

ImageNetO

MSP

28.64

2.52

94.85

91.20

OpenImagesO

MSP

84.98

62.61

94.67

49.95

Textures

MSP

80.46

37.50

96.80

67.75

SVHN

MSP

97.62

95.56

98.77

11.58

MNIST

MSP

90.04

90.45

89.88

39.03

Gallery generated by Sphinx-Gallery