-
Notifications
You must be signed in to change notification settings - Fork 0
/
experiment2.py
87 lines (77 loc) · 2.97 KB
/
experiment2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"""
Experiment 3:
- Get an image (mid-slice of a brain)
- Create anomaly with sink-/source-deformation or pixel shuffle
- Add increasing blur to the 'reconstructed' (original) image
- Subtract the reconstructed image from the anomaly (simulates imperfect reconstruction of the Autoencoder)
"""
import argparse
import random
from tqdm import tqdm
import numpy as np
from artificial_anomalies import (
sample_position,
pixel_shuffle_anomaly,
sink_deformation_anomaly,
source_deformation_anomaly
)
from utils import (
average_precision,
blur_img,
load_mood_test_data,
plot_curve,
show,
)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--anomaly', type=str,
choices=['pixel_shuffle', 'sink_deformation', 'source_deformation'],
default='pixel_shuffle')
args = parser.parse_args()
anomaly = args.anomaly
# Place random seeds
seed = 0
random.seed(seed)
np.random.seed(seed)
# Load image
imgs = load_mood_test_data()
# Select ball size
radius = 20
ap_results = [] # Gather ap results here
rec_results = [] # Gather reconstruction error results here
blurrings = np.linspace(0., 5., num=100) # First dimension
# Perform experiment
for blur in tqdm(blurrings):
aps = []
rec_errs = []
# Reset the random seed so for every intensity and blurring we get the same positions
random.seed(seed)
np.random.seed(seed)
for img in imgs:
# Blur the normal image (simulates imperfect reconstruction)
img_blur = blur_img(img, blur)
# Create an anomaly at a random position
position = sample_position(img)
if anomaly == 'source_deformation':
img_anomal, label = source_deformation_anomaly(img, position, radius)
elif anomaly == 'sink_deformation':
img_anomal, label = sink_deformation_anomaly(img, position, radius)
elif anomaly == 'pixel_shuffle':
img_anomal, label = pixel_shuffle_anomaly(img, position, radius)
else:
raise ValueError(f'Unknown anomaly type {anomaly}')
# Compute the reconstruction error
pred = np.abs(img_blur - img_anomal)
# Compute the average precision
ap = average_precision(label, pred)
aps.append(ap)
rec_errs.append(pred.mean())
ap_results.append(np.mean(aps))
rec_results.append(np.mean(rec_errs))
ap_results = np.array(ap_results)
rec_results = np.array(rec_results)
np.save(f"./results/experiment3/experiment3_full_{anomaly}_aps.npy", ap_results)
np.save(f"./results/experiment3/experiment3_full_{anomaly}_rec_errs.npy", rec_results)
plot_curve(blurrings, ap_results, ("blur", "ap"),
f"./results/experiment3/experiment3_full_{anomaly}.png")
plot_curve(blurrings, ap_results, ("blur", "ap"))