-
Notifications
You must be signed in to change notification settings - Fork 6
/
roc_howimetyourmark.py
200 lines (164 loc) · 6.62 KB
/
roc_howimetyourmark.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import time
import random
import cv2
import os
import numpy as np
from matplotlib import pyplot as plt
from scipy.ndimage.filters import gaussian_filter
from scipy.signal import medfilt
import embedding_howimetyourmark, detection_howimetyourmark
def similarity(X, X_star):
# Computes the similarity measure between the original and the new watermarks.
s = np.sum(np.multiply(X, X_star)) / np.sqrt(np.sum(np.multiply(X_star, X_star)))
return s
def jpeg_compression(img, QF):
cv2.imwrite('tmp.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), QF])
attacked = cv2.imread('tmp.jpg', 0)
os.remove('tmp.jpg')
return attacked
def blur(img, sigma):
attacked = gaussian_filter(img, sigma)
return attacked
def awgn(img, std, seed):
mean = 0.0
# np.random.seed(seed)
attacked = img + np.random.normal(mean, std, img.shape)
attacked = np.clip(attacked, 0, 255)
return attacked
def sharpening(img, sigma, alpha):
filter_blurred_f = gaussian_filter(img, sigma)
attacked = img + alpha * (img - filter_blurred_f)
return attacked
def median(img, kernel_size):
attacked = medfilt(img, kernel_size)
return attacked
def resizing(img, scale):
from skimage.transform import rescale
x, y = img.shape
attacked = rescale(img, scale)
attacked = rescale(attacked, 1/scale)
attacked = attacked[:x, :y]
return attacked
def random_attack(img):
i = random.randint(1,6)
if i==1:
attacked = awgn(img, 5.0, 123)
elif i==2:
attacked = blur(img, [3, 2])
elif i==3:
attacked = sharpening(img, 1, 1)
elif i==4:
attacked = median(img, [3, 5])
elif i==5:
attacked = resizing(img, 0.5)
elif i==6:
attacked = jpeg_compression(img, 75)
return attacked
def compute_roc():
# start time
start = time.time()
from sklearn.metrics import roc_curve, auc
sample_images = []
# loop for importing images from sample_images folder
for filename in os.listdir('sample_images'):
if filename.endswith(".bmp"):
path_tmp = os.path.join('sample_images', filename)
sample_images.append(path_tmp)
sample_images.sort()
# generate your watermark (if it is necessary)
watermark_size = 1024
watermark_path = "utilities/howimetyourmark.npy"
watermark = np.load(watermark_path)
# scores and labels are two lists we will use to append the values of similarity and their labels
# In scores we will append the similarity between our watermarked image and the attacked one,
# or between the attacked watermark and a random watermark
# In labels we will append the 1 if the scores was computed between the watermarked image and the attacked one,
# and 0 otherwise
scores = []
labels = []
for i in range(0, len(sample_images)):
original_image = sample_images[i]
watermarked_image = embedding_howimetyourmark.embedding(original_image, watermark_path)
original_image = cv2.imread(original_image, 0)
print(sample_images[i])
#plot original and watermarked image
plt.subplot(1, 2, 1)
plt.imshow(original_image, cmap='gray')
plt.title('Original image')
plt.subplot(1, 2, 2)
plt.imshow(watermarked_image, cmap='gray')
plt.title('Watermarked image')
plt.show()
sample = 0
while sample <= 9:
# fakemark is the watermark for H0
fakemark = np.random.uniform(0.0, 1.0, watermark_size)
fakemark = np.uint8(np.rint(fakemark))
# random attack to watermarked image (you can modify it)
attacked_image = random_attack(watermarked_image)
# extract attacked watermark
w_ex_atk = detection_howimetyourmark.extraction(original_image, watermarked_image, attacked_image)
# compute similarity H1
scores.append(similarity(watermark, w_ex_atk))
labels.append(1)
# compute similarity H0
scores.append(similarity(fakemark, w_ex_atk))
labels.append(0)
sample += 1
# print the scores and labels
print('Scores:', scores)
print('Labels:', labels)
# compute ROC
fpr, tpr, tau = roc_curve(np.asarray(labels), np.asarray(scores), drop_intermediate=False)
# compute AUC
roc_auc = auc(fpr, tpr)
plt.figure()
lw = 2
plt.plot(fpr,
tpr,
color='darkorange',
lw=lw,
label='AUC = %0.2f' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([-0.01, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
idx_tpr = np.where((fpr - 0.05) == min(i for i in (fpr - 0.05) if i > 0))
print('For a FPR approximately equals to 0.05 corresponds a TPR equals to %0.2f' % tpr[idx_tpr[0][0]])
print('For a FPR approximately equals to 0.05 corresponds a threshold equals to %0.2f' % tau[idx_tpr[0][0]])
print('Check FPR %0.2f' % fpr[idx_tpr[0][0]])
# end time
end = time.time()
print('[COMPUTE ROC] Time: %0.2f seconds' % (end - start))
compute_roc()
#13.71 con alpha = 2, 512 blocks, 0.1 spatial
#13.45 con alpha = 2.25, 512 blocks, 0.33 spatial
#14.07 alpha=4, 64 blocks, 0.33 spatial
#14.86 alpha=6, 32 blocks, 0.33 spatial, fpr 0.05 0 attacchi
#14.82 alpha=5, 32blocks, 0.33 spatial, fpr 0.05 | (rifacendo la roc, 14.67) 0 attacchi, 1 embedding sotto i 66
#14.79 alpha=4.85, 32blocks, 0.33 spatial, fpr 0.05, | 1 embedding sotto i 66
#14.74 alpha=5.15, 32blocks, 0.33 spatial, fpr 0.05, | 2 attacchi
#14.79 alpha=5.25, 32blocks, 0.33 spatial, fpr 0.05, | 2 attacchi
#14.66 alpha=4.5, 64blocks, 0.33 spatial, fpr 0.05, tanti embedding sotto i 65
#14.80 alpha=5.25, 32blocks, 0.25 spatial, fpr 0.05
#14.84 alpha=5, 32blocks, 0.2 spatial, fpr 0.05
#14.83 alpha=5, 32blocks, 0.15 spatial, fpr 0.05
#15.08 alpha=6, 16blocks, 0.33 spatial, fpr 0.05
#14.96 alpha=5.15, 32blocks, 0.20 spatial, fpr 0.05
#14.88 alpha=5.15, 32blocks, 0.15 spatial, fpr 0.05
#15.02 alpha=5.75, 32blocks, 0.15 spatial, fpr 0.05
#14.80 alpha=5.75, 32blocks, 0.33 spatial, fpr 0.05
#14.88 alpha=5.85 32blocks, 0.33 spatial, fpr 0.05
#14.57 alpha=6, 32blocks, 0.50 spatial, fpr 0.07
#14.63 alpha=6, 32blocks, 0.40 spatial, fpr 0.07
#14.66 alpha=6, 32blocks, 0.30 spatial, fpr 0.07
#14.66 alpha=6, 32blocks, 0.25 spatial, fpr 0.07
#14.77 alpha=6, 32blocks, 0.20 spatial, fpr 0.07
#14.72 alpha=6, 32blocks, 0.15 spatial, fpr 0.07
#14.70 alpha=6, 32blocks, 0.10 spatial, fpr 0.07
#14.83 alpha=6, 32blocks, 0.05 spatial, fpr 0.07
#15.20 alpha=6, 32blocks, 0.00 spatial, fpr 0.07