haakohu commited on
Commit
11528d1
1 Parent(s): f053222

minor fixes

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zst filter=lfs diff=lfs merge=lfs -text
34
  *tfevents* filter=lfs diff=lfs merge=lfs -text
35
  erling.jpg filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zst filter=lfs diff=lfs merge=lfs -text
34
  *tfevents* filter=lfs diff=lfs merge=lfs -text
35
  erling.jpg filter=lfs diff=lfs merge=lfs -text
36
+ *.jpg filter=lfs diff=lfs merge=lfs -text
app.py CHANGED
@@ -4,124 +4,14 @@ os.system("pip install ftfy regex tqdm")
4
  os.system("pip install git+https://github.com/openai/CLIP.git")
5
  os.system("pip install git+https://github.com/facebookresearch/detectron2@96c752ce821a3340e27edd51c28a00665dd32a30#subdirectory=projects/DensePose")
6
  os.system("pip install git+https://github.com/hukkelas/DSFD-Pytorch-Inference")
7
- from collections import defaultdict
8
  import gradio
9
  import numpy as np
10
  import torch
11
- import cv2
12
  from PIL import Image
13
  from dp2 import utils
14
  from tops.config import instantiate
15
  import tops
16
  import gradio.inputs
17
- from stylemc import get_and_cache_direction, get_styles
18
-
19
-
20
- class GuidedDemo:
21
- def __init__(self, face_anonymizer, cfg_face) -> None:
22
- self.anonymizer = face_anonymizer
23
- assert sum([x is not None for x in list(face_anonymizer.generators.values())]) == 1
24
- self.generator = [x for x in list(face_anonymizer.generators.values()) if x is not None][0]
25
- face_G_cfg = utils.load_config(cfg_face.anonymizer.face_G_cfg)
26
- face_G_cfg.train.batch_size = 1
27
- self.dl = instantiate(face_G_cfg.data.val.loader)
28
- self.cache_dir = face_G_cfg.output_dir
29
- self.precompute_edits()
30
-
31
- def precompute_edits(self):
32
- self.precomputed_edits = set()
33
- for edit in self.precomputed_edits:
34
- get_and_cache_direction(self.cache_dir, self.dl, self.generator, edit)
35
- if self.cache_dir.joinpath("stylemc_cache").is_dir():
36
- for path in self.cache_dir.joinpath("stylemc_cache").iterdir():
37
- text_prompt = path.stem.replace("_", " ")
38
- self.precomputed_edits.add(text_prompt)
39
- print(text_prompt)
40
- self.edits = defaultdict(defaultdict)
41
-
42
- def anonymize(self, img, show_boxes: bool, current_box_idx: int, current_styles, current_boxes, update_identity, edits, cache_id=None):
43
- if not isinstance(img, torch.Tensor):
44
- img, cache_id = pil2torch(img)
45
- img = tops.to_cuda(img)
46
-
47
- current_box_idx = current_box_idx % len(current_boxes)
48
- edited_styles = [s.clone() for s in current_styles]
49
- for face_idx, face_edits in edits.items():
50
- for prompt, strength in face_edits.items():
51
- direction = get_and_cache_direction(self.cache_dir, self.dl, self.generator, prompt)
52
- edited_styles[int(face_idx)] += direction * strength
53
- update_identity[int(face_idx)] = True
54
- assert img.dtype == torch.uint8
55
- img = self.anonymizer(
56
- img, truncation_value=0,
57
- multi_modal_truncation=True, amp=True,
58
- cache_id=cache_id,
59
- all_styles=edited_styles,
60
- update_identity=update_identity)
61
- update_identity = [True for i in range(len(update_identity))]
62
- img = utils.im2numpy(img)
63
- if show_boxes:
64
- x0, y0, x1, y1 = [int(_) for _ in current_boxes[int(current_box_idx)]]
65
- img = cv2.rectangle(img, (x0, y0), (x1, y1), (255, 0, 0), 1)
66
- return img, update_identity
67
-
68
- def update_image(self, img, show_boxes):
69
- img, cache_id = pil2torch(img)
70
- img = tops.to_cuda(img)
71
- det = self.anonymizer.detector.forward_and_cache(img, cache_id, load_cache=True)[0]
72
- current_styles = []
73
- for i in range(len(det)):
74
- s = get_styles(
75
- np.random.randint(0, 999999),self.generator,
76
- None, truncation_value=0)
77
- current_styles.append(s)
78
- update_identity = [True for i in range(len(det))]
79
- current_boxes = np.array(det.boxes)
80
- edits = defaultdict(defaultdict)
81
- cur_face_idx = -1 % len(current_boxes)
82
- img, update_identity = self.anonymize(img, show_boxes, cur_face_idx, current_styles, current_boxes, update_identity, edits, cache_id=cache_id)
83
- return img, current_styles, current_boxes, update_identity, edits, cur_face_idx
84
-
85
- def change_face(self, change, cur_face_idx, current_boxes, input_image, show_boxes, current_styles, update_identity, edits):
86
- cur_face_idx = (cur_face_idx+change) % len(current_boxes)
87
- img, update_identity = self.anonymize(input_image, show_boxes, cur_face_idx, current_styles, current_boxes, update_identity, edits)
88
- return img, update_identity, cur_face_idx
89
-
90
- def add_style(self, face_idx: int, prompt: str, strength: float, input_image, show_boxes, current_styles, current_boxes, update_identity, edits):
91
- face_idx = face_idx % len(current_boxes)
92
- edits[face_idx][prompt] = strength
93
- img, update_identity = self.anonymize(input_image, show_boxes, face_idx, current_styles, current_boxes, update_identity, edits)
94
- return img, update_identity, edits
95
-
96
- def setup_interface(self):
97
- current_styles = gradio.State()
98
- current_boxes = gradio.State(None)
99
- update_identity = gradio.State([])
100
- edits = gradio.State([])
101
- with gradio.Row():
102
- input_image = gradio.Image(
103
- type="pil", label="Upload your image or try the example below!",source="webcam")
104
- output_image = gradio.Image(type="numpy", label="Output")
105
- with gradio.Row():
106
- update_btn = gradio.Button("Update Anonymization").style(full_width=True)
107
- with gradio.Row():
108
- show_boxes = gradio.Checkbox(value=True, label="Show Selected")
109
- cur_face_idx = gradio.Number(value=-1,label="Current", interactive=False)
110
- previous = gradio.Button("Previous Person")
111
- next_ = gradio.Button("Next Person")
112
- with gradio.Row():
113
- text_prompt = gradio.Textbox(
114
- placeholder=" | ".join(list(self.precomputed_edits)),
115
- label="Text Prompt for Edit")
116
- edit_strength = gradio.Slider(0, 5, step=.01)
117
- add_btn = gradio.Button("Add Edit")
118
- add_btn.click(self.add_style, inputs=[cur_face_idx, text_prompt, edit_strength, input_image, show_boxes, current_styles, current_boxes, update_identity, edits], outputs=[output_image, update_identity, edits])
119
- update_btn.click(self.update_image, inputs=[input_image, show_boxes], outputs=[output_image, current_styles, current_boxes, update_identity, edits, cur_face_idx])
120
- input_image.change(self.update_image, inputs=[input_image, show_boxes], outputs=[output_image, current_styles, current_boxes, update_identity, edits, cur_face_idx])
121
- previous.click(self.change_face, inputs=[gradio.State(-1), cur_face_idx, current_boxes, input_image, show_boxes, current_styles, update_identity, edits], outputs=[output_image, update_identity, cur_face_idx])
122
- next_.click(self.change_face, inputs=[gradio.State(1), cur_face_idx, current_boxes, input_image, show_boxes, current_styles, update_identity, edits], outputs=[output_image, update_identity, cur_face_idx])
123
-
124
- show_boxes.change(self.anonymize, inputs=[input_image, show_boxes, cur_face_idx, current_styles, current_boxes, update_identity, edits], outputs=[output_image, update_identity])
125
 
126
 
127
  cfg_body = utils.load_config("configs/anonymizers/FB_cse.py")
@@ -131,32 +21,11 @@ cfg_face = utils.load_config("configs/anonymizers/face.py")
131
  anonymizer_face = instantiate(cfg_face.anonymizer, load_cache=False)
132
  anonymizer_face.initialize_tracker(fps=1)
133
 
134
- class WebcamDemo:
135
 
136
- def __init__(self, anonymizer) -> None:
137
- self.anonymizer = anonymizer
138
- with gradio.Row():
139
- input_image = gradio.Image(type="pil", source="webcam", streaming=True)
140
- output_image = gradio.Image(type="numpy", label="Output")
141
- visualize_det = gradio.Checkbox(value=False, label="Show Detections")
142
- input_image.stream(self.anonymize, [input_image, visualize_det], [output_image])
143
- self.track = True
144
-
145
- def anonymize(self, img: Image, visualize_detection: bool):
146
- img, cache_id = pil2torch(img)
147
- img = tops.to_cuda(img)
148
- if visualize_detection:
149
- img = self.anonymizer.visualize_detection(img, cache_id=cache_id)
150
- else:
151
- img = self.anonymizer(
152
- img, truncation_value=0, multi_modal_truncation=True, amp=True,
153
- cache_id=cache_id, track=self.track)
154
- img = utils.im2numpy(img)
155
- return img
156
 
157
- class ExampleDemo(WebcamDemo):
158
-
159
- def __init__(self, anonymizer) -> None:
160
  self.anonymizer = anonymizer
161
  with gradio.Row():
162
  input_image = gradio.Image(type="pil", label="Upload your image or try the example below!")
@@ -166,12 +35,24 @@ class ExampleDemo(WebcamDemo):
166
  visualize_det = gradio.Checkbox(value=False, label="Show Detections")
167
  visualize_det.change(self.anonymize, inputs=[input_image, visualize_det], outputs=[output_image])
168
  gradio.Examples(
169
- ["erling.jpg", "coco_val2017_000000001000.jpg"], inputs=[input_image]
170
  )
171
  update_btn.click(self.anonymize, inputs=[input_image, visualize_det], outputs=[output_image])
172
  input_image.change(self.anonymize, inputs=[input_image, visualize_det], outputs=[output_image])
173
  self.track = False
174
 
 
 
 
 
 
 
 
 
 
 
 
 
175
 
176
  def pil2torch(img: Image.Image):
177
  img = img.convert("RGB")
@@ -184,9 +65,9 @@ with gradio.Blocks() as demo:
184
  gradio.Markdown("# <center> DeepPrivacy2 - Realistic Image Anonymization </center>")
185
  gradio.Markdown("### <center> Håkon Hukkelås, Rudolf Mester, Frank Lindseth </center>")
186
  with gradio.Tab("Full-Body Anonymization"):
187
- ExampleDemo(anonymizer_body)
188
  with gradio.Tab("Face Anonymization"):
189
- ExampleDemo(anonymizer_face)
190
 
191
 
192
  demo.launch()
 
4
  os.system("pip install git+https://github.com/openai/CLIP.git")
5
  os.system("pip install git+https://github.com/facebookresearch/detectron2@96c752ce821a3340e27edd51c28a00665dd32a30#subdirectory=projects/DensePose")
6
  os.system("pip install git+https://github.com/hukkelas/DSFD-Pytorch-Inference")
 
7
  import gradio
8
  import numpy as np
9
  import torch
 
10
  from PIL import Image
11
  from dp2 import utils
12
  from tops.config import instantiate
13
  import tops
14
  import gradio.inputs
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
 
17
  cfg_body = utils.load_config("configs/anonymizers/FB_cse.py")
 
21
  anonymizer_face = instantiate(cfg_face.anonymizer, load_cache=False)
22
  anonymizer_face.initialize_tracker(fps=1)
23
 
 
24
 
25
+ class ExampleDemo:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
+ def __init__(self, anonymizer, multi_modal_truncation=False) -> None:
28
+ self.multi_modal_truncation = multi_modal_truncation
 
29
  self.anonymizer = anonymizer
30
  with gradio.Row():
31
  input_image = gradio.Image(type="pil", label="Upload your image or try the example below!")
 
35
  visualize_det = gradio.Checkbox(value=False, label="Show Detections")
36
  visualize_det.change(self.anonymize, inputs=[input_image, visualize_det], outputs=[output_image])
37
  gradio.Examples(
38
+ ["erling.jpg", "g7-summit-leaders-distraction.jpg"], inputs=[input_image]
39
  )
40
  update_btn.click(self.anonymize, inputs=[input_image, visualize_det], outputs=[output_image])
41
  input_image.change(self.anonymize, inputs=[input_image, visualize_det], outputs=[output_image])
42
  self.track = False
43
 
44
+ def anonymize(self, img: Image, visualize_detection: bool):
45
+ img, cache_id = pil2torch(img)
46
+ img = tops.to_cuda(img)
47
+ if visualize_detection:
48
+ img = self.anonymizer.visualize_detection(img, cache_id=cache_id)
49
+ else:
50
+ img = self.anonymizer(
51
+ img, truncation_value=0 if self.multi_modal_truncation else 1, multi_modal_truncation=self.multi_modal_truncation, amp=True,
52
+ cache_id=cache_id, track=self.track)
53
+ img = utils.im2numpy(img)
54
+ return img
55
+
56
 
57
  def pil2torch(img: Image.Image):
58
  img = img.convert("RGB")
 
65
  gradio.Markdown("# <center> DeepPrivacy2 - Realistic Image Anonymization </center>")
66
  gradio.Markdown("### <center> Håkon Hukkelås, Rudolf Mester, Frank Lindseth </center>")
67
  with gradio.Tab("Full-Body Anonymization"):
68
+ ExampleDemo(anonymizer_body, multi_modal_truncation=True)
69
  with gradio.Tab("Face Anonymization"):
70
+ ExampleDemo(anonymizer_face, multi_modal_truncation=False)
71
 
72
 
73
  demo.launch()
dp2/detection/structures.py CHANGED
@@ -84,7 +84,8 @@ class FaceDetection:
84
  def get_crop(self, idx: int, im):
85
  assert idx < len(self)
86
  box = self.boxes[idx].numpy()
87
- expanded_boxes = expand_bbox_fdf(box, im.shape[-2:], True)
 
88
  im = cut_pad_resize(im, expanded_boxes, self.target_imsize, fdf_resize=True)
89
  area = (self.boxes[:, 2] - self.boxes[:, 0]) * (self.boxes[:, 3] - self.boxes[:, 1]).view(-1)
90
 
 
84
  def get_crop(self, idx: int, im):
85
  assert idx < len(self)
86
  box = self.boxes[idx].numpy()
87
+ simple_expand = False if self.fdf128_expand else True
88
+ expanded_boxes = expand_bbox_fdf(box, im.shape[-2:], simple_expand=simple_expand)
89
  im = cut_pad_resize(im, expanded_boxes, self.target_imsize, fdf_resize=True)
90
  area = (self.boxes[:, 2] - self.boxes[:, 0]) * (self.boxes[:, 3] - self.boxes[:, 1]).view(-1)
91
 
g7-summit-leaders-distraction.jpg ADDED

Git LFS Details

  • SHA256: 376f28e6efa6a6250f021e58f226927b98e5d1a1aa0fae94b9db62b808a76534
  • Pointer size: 132 Bytes
  • Size of remote file: 3.3 MB