Spaces:
Build error
Build error
=
commited on
Commit
·
b39c220
1
Parent(s):
d57c931
adding correct smooth attention
Browse files
fake_face_detection/metrics/make_predictions.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
|
| 2 |
from fake_face_detection.data.fake_face_dataset import FakeFaceDetectionDataset
|
| 3 |
from fake_face_detection.metrics.compute_metrics import compute_metrics
|
| 4 |
-
from fake_face_detection.smoothest_attention import smooth_attention
|
| 5 |
from torch.utils.tensorboard import SummaryWriter
|
| 6 |
from PIL.JpegImagePlugin import JpegImageFile
|
| 7 |
from torch.utils.data import DataLoader
|
|
|
|
| 1 |
|
| 2 |
from fake_face_detection.data.fake_face_dataset import FakeFaceDetectionDataset
|
| 3 |
from fake_face_detection.metrics.compute_metrics import compute_metrics
|
| 4 |
+
from fake_face_detection.utils.smoothest_attention import smooth_attention
|
| 5 |
from torch.utils.tensorboard import SummaryWriter
|
| 6 |
from PIL.JpegImagePlugin import JpegImageFile
|
| 7 |
from torch.utils.data import DataLoader
|
fake_face_detection/utils/smoothest_attention.py
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
import copy
|
| 3 |
+
|
| 4 |
+
# we want to take 0.2 of the pixel and 0.7 of the mean of the pixels around it 100 times
|
| 5 |
+
# we will take a size between the current pixel and the pixels around it
|
| 6 |
+
def smooth_attention(attention: torch.Tensor, iters: int = 1000, threshold: float = 0.1, scale: float = 0.2, size: int = 3):
|
| 7 |
+
|
| 8 |
+
# squeeze the attention
|
| 9 |
+
attention = copy.deepcopy(attention.squeeze())
|
| 10 |
+
|
| 11 |
+
# make 100 iterations
|
| 12 |
+
for _ in range(iters):
|
| 13 |
+
|
| 14 |
+
# initialize the difference
|
| 15 |
+
difference = torch.full(attention.shape, torch.inf)
|
| 16 |
+
|
| 17 |
+
# iterate over the pixels of the attention
|
| 18 |
+
for i in range(attention.shape[0]):
|
| 19 |
+
|
| 20 |
+
for j in range(attention.shape[1]):
|
| 21 |
+
|
| 22 |
+
# recuperate the pixel
|
| 23 |
+
pixel = attention[i, j]
|
| 24 |
+
|
| 25 |
+
# recuperate the mean of the pixels around it
|
| 26 |
+
mean = attention[max(0, i - size): min(attention.shape[0], i + size), max(0, j - size): min(attention.shape[1], j + size)].mean()
|
| 27 |
+
|
| 28 |
+
# update the attention
|
| 29 |
+
attention[i, j] = (1 - scale) * pixel + scale * mean
|
| 30 |
+
|
| 31 |
+
# recuperate the difference
|
| 32 |
+
difference[i, j] = abs(pixel - mean)
|
| 33 |
+
|
| 34 |
+
# compare each difference with the threshold
|
| 35 |
+
if (difference < threshold).all(): break
|
| 36 |
+
|
| 37 |
+
# unsqueeze the attention
|
| 38 |
+
attention = attention.unsqueeze(-1)
|
| 39 |
+
|
| 40 |
+
# return the attention
|
| 41 |
+
return attention
|
| 42 |
+
|