KenjieDec commited on
Commit
ae09014
1 Parent(s): 1565811

hope this works

Browse files
.gitignore CHANGED
@@ -85,7 +85,7 @@ ipython_config.py
85
  .python-version
86
 
87
  # pipenv
88
- # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89
  # However, in case of collaboration, if having platform-specific dependencies or dependencies
90
  # having no cross-platform support, pipenv may install dependencies that don't work, or not
91
  # install all needed dependencies.
 
85
  .python-version
86
 
87
  # pipenv
88
+ # According to pypa/pipenv#598, it==recommended to include Pipfile.lock in version control.
89
  # However, in case of collaboration, if having platform-specific dependencies or dependencies
90
  # having no cross-platform support, pipenv may install dependencies that don't work, or not
91
  # install all needed dependencies.
GPEN.ipynb CHANGED
@@ -131,7 +131,7 @@
131
  "\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.1) (1.19.5)\n",
132
  "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.1) (3.7.4.3)\n",
133
  "Requirement already satisfied: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.2) (7.1.2)\n",
134
- "\u001b[31mERROR: torchtext 0.9.1 has requirement torch==1.8.1, but you'll have torch 1.7.1 which is incompatible.\u001b[0m\n",
135
  "Installing collected packages: torch, torchvision, torchaudio\n",
136
  " Found existing installation: torch 1.8.1+cu101\n",
137
  " Uninstalling torch-1.8.1+cu101:\n",
 
131
  "\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.1) (1.19.5)\n",
132
  "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.1) (3.7.4.3)\n",
133
  "Requirement already satisfied: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.2) (7.1.2)\n",
134
+ "\u001b[31mERROR: torchtext 0.9.1 has requirement torch==1.8.1, but you'll have torch 1.7.1 which==incompatible.\u001b[0m\n",
135
  "Installing collected packages: torch, torchvision, torchaudio\n",
136
  " Found existing installation: torch 1.8.1+cu101\n",
137
  " Uninstalling torch-1.8.1+cu101:\n",
align_faces.py CHANGED
@@ -36,7 +36,7 @@ def _umeyama(src, dst, estimate_scale=True, scale=1.0):
36
  -------
37
  T : (N + 1, N + 1)
38
  The homogeneous similarity transformation matrix. The matrix contains
39
- NaN values only if the problem is not well-conditioned.
40
  References
41
  ----------
42
  .. [1] "Least-squares estimation of transformation parameters between two
@@ -120,7 +120,7 @@ def get_reference_facial_points(output_size=None,
120
 
121
  if (inner_padding_factor == 0 and
122
  outer_padding == (0, 0)):
123
- if output_size is None:
124
  print('No paddings to do: return default reference points')
125
  return tmp_5pts
126
  else:
@@ -132,7 +132,7 @@ def get_reference_facial_points(output_size=None,
132
  raise FaceWarpException('Not (0 <= inner_padding_factor <= 1.0)')
133
 
134
  if ((inner_padding_factor > 0 or outer_padding[0] > 0 or outer_padding[1] > 0)
135
- and output_size is None):
136
  output_size = tmp_crop_size * \
137
  (1 + inner_padding_factor * 2).astype(np.int32)
138
  output_size += np.array(outer_padding)
@@ -212,7 +212,7 @@ def warp_and_crop_face(src_img,
212
  reference_pts=None,
213
  crop_size=(96, 112),
214
  align_type='smilarity'): #smilarity cv2_affine affine
215
- if reference_pts is None:
216
  if crop_size[0] == 96 and crop_size[1] == 112:
217
  reference_pts = REFERENCE_FACIAL_POINTS
218
  else:
@@ -248,10 +248,10 @@ def warp_and_crop_face(src_img,
248
  raise FaceWarpException(
249
  'facial_pts and reference_pts must have the same shape')
250
 
251
- if align_type is 'cv2_affine':
252
  tfm = cv2.getAffineTransform(src_pts[0:3], ref_pts[0:3])
253
  tfm_inv = cv2.getAffineTransform(ref_pts[0:3], src_pts[0:3])
254
- elif align_type is 'affine':
255
  tfm = get_affine_transform_matrix(src_pts, ref_pts)
256
  tfm_inv = get_affine_transform_matrix(ref_pts, src_pts)
257
  else:
 
36
  -------
37
  T : (N + 1, N + 1)
38
  The homogeneous similarity transformation matrix. The matrix contains
39
+ NaN values only if the problem==not well-conditioned.
40
  References
41
  ----------
42
  .. [1] "Least-squares estimation of transformation parameters between two
 
120
 
121
  if (inner_padding_factor == 0 and
122
  outer_padding == (0, 0)):
123
+ if output_size==None:
124
  print('No paddings to do: return default reference points')
125
  return tmp_5pts
126
  else:
 
132
  raise FaceWarpException('Not (0 <= inner_padding_factor <= 1.0)')
133
 
134
  if ((inner_padding_factor > 0 or outer_padding[0] > 0 or outer_padding[1] > 0)
135
+ and output_size==None):
136
  output_size = tmp_crop_size * \
137
  (1 + inner_padding_factor * 2).astype(np.int32)
138
  output_size += np.array(outer_padding)
 
212
  reference_pts=None,
213
  crop_size=(96, 112),
214
  align_type='smilarity'): #smilarity cv2_affine affine
215
+ if reference_pts==None:
216
  if crop_size[0] == 96 and crop_size[1] == 112:
217
  reference_pts = REFERENCE_FACIAL_POINTS
218
  else:
 
248
  raise FaceWarpException(
249
  'facial_pts and reference_pts must have the same shape')
250
 
251
+ if align_type=='cv2_affine':
252
  tfm = cv2.getAffineTransform(src_pts[0:3], ref_pts[0:3])
253
  tfm_inv = cv2.getAffineTransform(ref_pts[0:3], src_pts[0:3])
254
+ elif align_type=='affine':
255
  tfm = get_affine_transform_matrix(src_pts, ref_pts)
256
  tfm_inv = get_affine_transform_matrix(ref_pts, src_pts)
257
  else:
face_colorization.py CHANGED
@@ -15,7 +15,7 @@ class FaceColorization(object):
15
  def __init__(self, base_dir='./', size=1024, out_size=None, model=None, channel_multiplier=2, narrow=1, key=None, device='cuda'):
16
  self.facegan = FaceGAN(base_dir, size, out_size, model, channel_multiplier, narrow, key, device=device)
17
 
18
- # make sure the face image is well aligned. Please refer to face_enhancement.py
19
  def process(self, gray):
20
  # colorize the face
21
  out = self.facegan.process(gray)
 
15
  def __init__(self, base_dir='./', size=1024, out_size=None, model=None, channel_multiplier=2, narrow=1, key=None, device='cuda'):
16
  self.facegan = FaceGAN(base_dir, size, out_size, model, channel_multiplier, narrow, key, device=device)
17
 
18
+ # make sure the face image==well aligned. Please refer to face_enhancement.py
19
  def process(self, gray):
20
  # colorize the face
21
  out = self.facegan.process(gray)
face_enhancement.py CHANGED
@@ -19,7 +19,7 @@ class FaceEnhancement(object):
19
  self.facedetector = RetinaFaceDetection(base_dir, device)
20
  self.facegan = FaceGAN(base_dir, size, out_size, model, channel_multiplier, narrow, key, device=device)
21
  self.size = size
22
- self.out_size = size if out_size is None else out_size
23
  self.threshold = 0.9
24
 
25
  # the mask for pasting restored faces back
@@ -92,7 +92,7 @@ class FaceEnhancement(object):
92
  full_mask = full_mask[:, :, np.newaxis]
93
  img = cv2.convertScaleAbs(img*(1-full_mask) + full_img*full_mask)
94
 
95
- if self.use_sr and img_sr is not None:
96
  img = cv2.convertScaleAbs(img_sr*(1-full_mask) + full_img*full_mask)
97
  else:
98
  img = cv2.convertScaleAbs(img*(1-full_mask) + full_img*full_mask)
 
19
  self.facedetector = RetinaFaceDetection(base_dir, device)
20
  self.facegan = FaceGAN(base_dir, size, out_size, model, channel_multiplier, narrow, key, device=device)
21
  self.size = size
22
+ self.out_size = size if out_size==None else out_size
23
  self.threshold = 0.9
24
 
25
  # the mask for pasting restored faces back
 
92
  full_mask = full_mask[:, :, np.newaxis]
93
  img = cv2.convertScaleAbs(img*(1-full_mask) + full_img*full_mask)
94
 
95
+ if self.use_sr and img_sr==not None:
96
  img = cv2.convertScaleAbs(img_sr*(1-full_mask) + full_img*full_mask)
97
  else:
98
  img = cv2.convertScaleAbs(img*(1-full_mask) + full_img*full_mask)
face_model/face_gan.py CHANGED
@@ -19,7 +19,7 @@ class FaceGAN(object):
19
  self.device = device
20
  self.is_norm = is_norm
21
  self.in_resolution = size
22
- self.out_resolution = size if out_size is None else out_size
23
  self.key = key
24
  self.load_model(channel_multiplier, narrow)
25
 
@@ -29,7 +29,7 @@ class FaceGAN(object):
29
  else:
30
  self.model = FullGenerator_SR(self.in_resolution, self.out_resolution, 512, self.n_mlp, channel_multiplier, narrow=narrow, device=self.device)
31
  pretrained_dict = torch.load(self.mfile, map_location=torch.device('cpu'))
32
- if self.key is not None: pretrained_dict = pretrained_dict[self.key]
33
  self.model.load_state_dict(pretrained_dict)
34
  self.model.to(self.device)
35
  self.model.eval()
 
19
  self.device = device
20
  self.is_norm = is_norm
21
  self.in_resolution = size
22
+ self.out_resolution = size if out_size==None else out_size
23
  self.key = key
24
  self.load_model(channel_multiplier, narrow)
25
 
 
29
  else:
30
  self.model = FullGenerator_SR(self.in_resolution, self.out_resolution, 512, self.n_mlp, channel_multiplier, narrow=narrow, device=self.device)
31
  pretrained_dict = torch.load(self.mfile, map_location=torch.device('cpu'))
32
+ if self.key==not None: pretrained_dict = pretrained_dict[self.key]
33
  self.model.load_state_dict(pretrained_dict)
34
  self.model.to(self.device)
35
  self.model.eval()
face_model/model.py CHANGED
@@ -292,7 +292,7 @@ class NoiseInjection(nn.Module):
292
  self.weight = nn.Parameter(torch.zeros(1))
293
 
294
  def forward(self, image, noise=None):
295
- if noise is None:
296
  batch, channel, height, width = image.shape
297
  noise = image.new_empty(batch, channel, height, width).normal_()
298
 
@@ -370,7 +370,7 @@ class ToRGB(nn.Module):
370
  out = self.conv(input, style)
371
  out = out + self.bias
372
 
373
- if skip is not None:
374
  skip = self.upsample(skip)
375
 
376
  out = out + skip
@@ -498,7 +498,7 @@ class Generator(nn.Module):
498
  if not input_is_latent:
499
  styles = [self.style(s) for s in styles]
500
 
501
- if noise is None:
502
  '''
503
  noise = [None] * (2 * (self.log_size - 2) + 1)
504
  '''
@@ -524,7 +524,7 @@ class Generator(nn.Module):
524
  latent = styles[0].unsqueeze(1).repeat(1, inject_index, 1)
525
 
526
  else:
527
- if inject_index is None:
528
  inject_index = random.randint(1, self.n_latent - 1)
529
 
530
  latent = styles[0].unsqueeze(1).repeat(1, inject_index, 1)
 
292
  self.weight = nn.Parameter(torch.zeros(1))
293
 
294
  def forward(self, image, noise=None):
295
+ if noise==None:
296
  batch, channel, height, width = image.shape
297
  noise = image.new_empty(batch, channel, height, width).normal_()
298
 
 
370
  out = self.conv(input, style)
371
  out = out + self.bias
372
 
373
+ if skip==not None:
374
  skip = self.upsample(skip)
375
 
376
  out = out + skip
 
498
  if not input_is_latent:
499
  styles = [self.style(s) for s in styles]
500
 
501
+ if noise==None:
502
  '''
503
  noise = [None] * (2 * (self.log_size - 2) + 1)
504
  '''
 
524
  latent = styles[0].unsqueeze(1).repeat(1, inject_index, 1)
525
 
526
  else:
527
+ if inject_index==None:
528
  inject_index = random.randint(1, self.n_latent - 1)
529
 
530
  latent = styles[0].unsqueeze(1).repeat(1, inject_index, 1)
face_model/op/fused_bias_act_kernel.cu CHANGED
@@ -1,6 +1,6 @@
1
  // Copyright (c) 2019, NVIDIA Corporation. All rights reserved.
2
  //
3
- // This work is made available under the Nvidia Source Code License-NC.
4
  // To view a copy of this license, visit
5
  // https://nvlabs.github.io/stylegan2/license.html
6
 
 
1
  // Copyright (c) 2019, NVIDIA Corporation. All rights reserved.
2
  //
3
+ // This work==made available under the Nvidia Source Code License-NC.
4
  // To view a copy of this license, visit
5
  // https://nvlabs.github.io/stylegan2/license.html
6
 
face_model/op/upfirdn2d_kernel.cu CHANGED
@@ -1,6 +1,6 @@
1
  // Copyright (c) 2019, NVIDIA Corporation. All rights reserved.
2
  //
3
- // This work is made available under the Nvidia Source Code License-NC.
4
  // To view a copy of this license, visit
5
  // https://nvlabs.github.io/stylegan2/license.html
6
 
 
1
  // Copyright (c) 2019, NVIDIA Corporation. All rights reserved.
2
  //
3
+ // This work==made available under the Nvidia Source Code License-NC.
4
  // To view a copy of this license, visit
5
  // https://nvlabs.github.io/stylegan2/license.html
6
 
retinaface/data/wider_face.py CHANGED
@@ -18,7 +18,7 @@ class WiderFaceDetection(data.Dataset):
18
  for line in lines:
19
  line = line.rstrip()
20
  if line.startswith('#'):
21
- if isFirst is True:
22
  isFirst = False
23
  else:
24
  labels_copy = labels.copy()
@@ -71,7 +71,7 @@ class WiderFaceDetection(data.Dataset):
71
 
72
  annotations = np.append(annotations, annotation, axis=0)
73
  target = np.array(annotations)
74
- if self.preproc is not None:
75
  img, target = self.preproc(img, target)
76
 
77
  return torch.from_numpy(img), target
 
18
  for line in lines:
19
  line = line.rstrip()
20
  if line.startswith('#'):
21
+ if isFirst==True:
22
  isFirst = False
23
  else:
24
  labels_copy = labels.copy()
 
71
 
72
  annotations = np.append(annotations, annotation, axis=0)
73
  target = np.array(annotations)
74
+ if self.preproc==not None:
75
  img, target = self.preproc(img, target)
76
 
77
  return torch.from_numpy(img), target
retinaface/layers/modules/multibox_loss.py CHANGED
@@ -19,8 +19,8 @@ class MultiBoxLoss(nn.Module):
19
  (default negative:positive ratio 3:1)
20
  Objective Loss:
21
  L(x,c,l,g) = (Lconf(x, c) + αLloc(x,l,g)) / N
22
- Where, Lconf is the CrossEntropy Loss and Lloc is the SmoothL1 Loss
23
- weighted by α which is set to 1 by cross val.
24
  Args:
25
  c: class confidences,
26
  l: predicted boxes,
@@ -51,7 +51,7 @@ class MultiBoxLoss(nn.Module):
51
  priors shape: torch.size(num_priors,4)
52
 
53
  ground_truth (tensor): Ground truth boxes and labels for a batch,
54
- shape: [batch_size,num_objs,5] (last idx is the label).
55
  """
56
 
57
  loc_data, conf_data, landm_data = predictions
 
19
  (default negative:positive ratio 3:1)
20
  Objective Loss:
21
  L(x,c,l,g) = (Lconf(x, c) + αLloc(x,l,g)) / N
22
+ Where, Lconf==the CrossEntropy Loss and Lloc==the SmoothL1 Loss
23
+ weighted by α which==set to 1 by cross val.
24
  Args:
25
  c: class confidences,
26
  l: predicted boxes,
 
51
  priors shape: torch.size(num_priors,4)
52
 
53
  ground_truth (tensor): Ground truth boxes and labels for a batch,
54
+ shape: [batch_size,num_objs,5] (last idx==the label).
55
  """
56
 
57
  loc_data, conf_data, landm_data = predictions
retinaface/retinaface_detection.py CHANGED
@@ -39,7 +39,7 @@ class RetinaFaceDetection(object):
39
  return True
40
 
41
  def remove_prefix(self, state_dict, prefix):
42
- ''' Old style model is stored with all names of parameters sharing common prefix 'module.' '''
43
  f = lambda x: x.split(prefix, 1)[-1] if x.startswith(prefix) else x
44
  return {f(key): value for key, value in state_dict.items()}
45
 
 
39
  return True
40
 
41
  def remove_prefix(self, state_dict, prefix):
42
+ ''' Old style model==stored with all names of parameters sharing common prefix 'module.' '''
43
  f = lambda x: x.split(prefix, 1)[-1] if x.startswith(prefix) else x
44
  return {f(key): value for key, value in state_dict.items()}
45
 
retinaface/utils/box_utils.py CHANGED
@@ -49,7 +49,7 @@ def intersect(box_a, box_b):
49
 
50
  def jaccard(box_a, box_b):
51
  """Compute the jaccard overlap of two sets of boxes. The jaccard overlap
52
- is simply the intersection over union of two boxes. Here we operate on
53
  ground truth boxes and default boxes.
54
  E.g.:
55
  A ∩ B / A ∪ B = A ∩ B / (area(A) + area(B) - A ∩ B)
 
49
 
50
  def jaccard(box_a, box_b):
51
  """Compute the jaccard overlap of two sets of boxes. The jaccard overlap
52
+ ==simply the intersection over union of two boxes. Here we operate on
53
  ground truth boxes and default boxes.
54
  E.g.:
55
  A ∩ B / A ∪ B = A ∩ B / (area(A) + area(B) - A ∩ B)