mirror of
https://github.com/iperov/DeepFaceLab.git
synced 2025-08-20 05:23:22 -07:00
global refactoring and fixes,
removed support of extracted(aligned) PNG faces. Use old builds to convert from PNG to JPG. fanseg model file in facelib/ is renamed
This commit is contained in:
parent
921b464d5b
commit
61472cdaf7
82 changed files with 3838 additions and 3812 deletions
|
@ -82,6 +82,9 @@ class SampleGeneratorFace(SampleGeneratorBase):
|
|||
return self
|
||||
|
||||
def __next__(self):
|
||||
if not self.initialized:
|
||||
return []
|
||||
|
||||
self.generator_counter += 1
|
||||
generator = self.generators[self.generator_counter % len(self.generators) ]
|
||||
return next(generator)
|
||||
|
|
|
@ -152,15 +152,15 @@ class SampleGeneratorFaceCelebAMaskHQ(SampleGeneratorBase):
|
|||
file_ids = list(mask_file_id_hash.keys())
|
||||
|
||||
shuffle_file_ids = []
|
||||
shuffle_file_ids_random_ct = []
|
||||
|
||||
resolution = 256
|
||||
random_flip = True
|
||||
rotation_range=[-15,15]
|
||||
scale_range=[-0.25, 0.75]
|
||||
scale_range=[-0.10, 0.95]
|
||||
tx_range=[-0.3, 0.3]
|
||||
ty_range=[-0.3, 0.3]
|
||||
|
||||
random_bilinear_resize = (25,75)
|
||||
motion_blur = (25, 5)
|
||||
gaussian_blur = (25, 5)
|
||||
|
||||
|
@ -174,22 +174,15 @@ class SampleGeneratorFaceCelebAMaskHQ(SampleGeneratorBase):
|
|||
if len(shuffle_file_ids) == 0:
|
||||
shuffle_file_ids = file_ids.copy()
|
||||
np.random.shuffle(shuffle_file_ids)
|
||||
if len(shuffle_file_ids_random_ct) == 0:
|
||||
shuffle_file_ids_random_ct = file_ids.copy()
|
||||
np.random.shuffle(shuffle_file_ids_random_ct)
|
||||
|
||||
file_id = shuffle_file_ids.pop()
|
||||
#file_id_random_ct = shuffle_file_ids_random_ct.pop()
|
||||
|
||||
masks = mask_file_id_hash[file_id]
|
||||
|
||||
image_path = images_path / f'{file_id}.jpg'
|
||||
#image_random_ct_path = images_path / f'{file_id_random_ct}.jpg'
|
||||
|
||||
skin_path = masks.get(MaskType.skin, None)
|
||||
hair_path = masks.get(MaskType.hair, None)
|
||||
hat_path = masks.get(MaskType.hat, None)
|
||||
neck_path = masks.get(MaskType.neck, None)
|
||||
#neck_path = masks.get(MaskType.neck, None)
|
||||
|
||||
img = cv2_imread(image_path).astype(np.float32) / 255.0
|
||||
mask = cv2_imread(masks_path / skin_path)[...,0:1].astype(np.float32) / 255.0
|
||||
|
@ -205,7 +198,13 @@ class SampleGeneratorFaceCelebAMaskHQ(SampleGeneratorBase):
|
|||
if hat_path.exists():
|
||||
hat = cv2_imread(hat_path)[...,0:1].astype(np.float32) / 255.0
|
||||
mask *= (1-hat)
|
||||
|
||||
|
||||
#if neck_path is not None:
|
||||
# neck_path = masks_path / neck_path
|
||||
# if neck_path.exists():
|
||||
# neck = cv2_imread(neck_path)[...,0:1].astype(np.float32) / 255.0
|
||||
# mask = np.clip(mask+neck, 0, 1)
|
||||
|
||||
warp_params = imagelib.gen_warp_params(resolution, random_flip, rotation_range=rotation_range, scale_range=scale_range, tx_range=tx_range, ty_range=ty_range )
|
||||
|
||||
img = cv2.resize( img, (resolution,resolution), cv2.INTER_LANCZOS4 )
|
||||
|
@ -215,9 +214,6 @@ class SampleGeneratorFaceCelebAMaskHQ(SampleGeneratorBase):
|
|||
v = np.clip ( v + np.random.random()/2-0.25, 0, 1 )
|
||||
img = np.clip( cv2.cvtColor(cv2.merge([h, s, v]), cv2.COLOR_HSV2BGR) , 0, 1 )
|
||||
|
||||
#img_random_ct = cv2.resize( cv2_imread(image_random_ct_path).astype(np.float32) / 255.0, (resolution,resolution), cv2.INTER_LANCZOS4 )
|
||||
#img = imagelib.color_transfer ('idt', img, img_random_ct )
|
||||
|
||||
if motion_blur is not None:
|
||||
chance, mb_max_size = motion_blur
|
||||
chance = np.clip(chance, 0, 100)
|
||||
|
@ -241,6 +237,15 @@ class SampleGeneratorFaceCelebAMaskHQ(SampleGeneratorBase):
|
|||
if gblur_rnd_chance < chance:
|
||||
img = cv2.GaussianBlur(img, (gblur_rnd_kernel,) *2 , 0)
|
||||
|
||||
if random_bilinear_resize is not None:
|
||||
chance, max_size_per = random_bilinear_resize
|
||||
chance = np.clip(chance, 0, 100)
|
||||
pick_chance = np.random.randint(100)
|
||||
resize_to = resolution - int( np.random.rand()* int(resolution*(max_size_per/100.0)) )
|
||||
img = cv2.resize (img, (resize_to,resize_to), cv2.INTER_LINEAR )
|
||||
img = cv2.resize (img, (resolution,resolution), cv2.INTER_LINEAR )
|
||||
|
||||
|
||||
mask = cv2.resize( mask, (resolution,resolution), cv2.INTER_LANCZOS4 )[...,None]
|
||||
mask = imagelib.warp_by_params (warp_params, mask, can_warp=True, can_transform=True, can_flip=True, border_replicate=False, cv2_inter=cv2.INTER_LANCZOS4)
|
||||
mask[mask < 0.5] = 0.0
|
||||
|
|
263
samplelib/SampleGeneratorFaceSkinSegDataset.py
Normal file
263
samplelib/SampleGeneratorFaceSkinSegDataset.py
Normal file
|
@ -0,0 +1,263 @@
|
|||
import multiprocessing
|
||||
import pickle
|
||||
import time
|
||||
import traceback
|
||||
from enum import IntEnum
|
||||
|
||||
import cv2
|
||||
import numpy as np
|
||||
|
||||
from core import imagelib, mplib, pathex
|
||||
from core.cv2ex import *
|
||||
from core.interact import interact as io
|
||||
from core.joblib import SubprocessGenerator, ThisThreadGenerator
|
||||
from facelib import LandmarksProcessor
|
||||
from samplelib import (SampleGeneratorBase, SampleLoader, SampleProcessor, SampleType)
|
||||
|
||||
class MaskType(IntEnum):
|
||||
none = 0,
|
||||
cloth = 1,
|
||||
ear_r = 2,
|
||||
eye_g = 3,
|
||||
hair = 4,
|
||||
hat = 5,
|
||||
l_brow = 6,
|
||||
l_ear = 7,
|
||||
l_eye = 8,
|
||||
l_lip = 9,
|
||||
mouth = 10,
|
||||
neck = 11,
|
||||
neck_l = 12,
|
||||
nose = 13,
|
||||
r_brow = 14,
|
||||
r_ear = 15,
|
||||
r_eye = 16,
|
||||
skin = 17,
|
||||
u_lip = 18
|
||||
|
||||
|
||||
|
||||
MaskType_to_name = {
|
||||
int(MaskType.none ) : 'none',
|
||||
int(MaskType.cloth ) : 'cloth',
|
||||
int(MaskType.ear_r ) : 'ear_r',
|
||||
int(MaskType.eye_g ) : 'eye_g',
|
||||
int(MaskType.hair ) : 'hair',
|
||||
int(MaskType.hat ) : 'hat',
|
||||
int(MaskType.l_brow) : 'l_brow',
|
||||
int(MaskType.l_ear ) : 'l_ear',
|
||||
int(MaskType.l_eye ) : 'l_eye',
|
||||
int(MaskType.l_lip ) : 'l_lip',
|
||||
int(MaskType.mouth ) : 'mouth',
|
||||
int(MaskType.neck ) : 'neck',
|
||||
int(MaskType.neck_l) : 'neck_l',
|
||||
int(MaskType.nose ) : 'nose',
|
||||
int(MaskType.r_brow) : 'r_brow',
|
||||
int(MaskType.r_ear ) : 'r_ear',
|
||||
int(MaskType.r_eye ) : 'r_eye',
|
||||
int(MaskType.skin ) : 'skin',
|
||||
int(MaskType.u_lip ) : 'u_lip',
|
||||
}
|
||||
|
||||
MaskType_from_name = { MaskType_to_name[k] : k for k in MaskType_to_name.keys() }
|
||||
|
||||
class SampleGeneratorFaceSkinSegDataset(SampleGeneratorBase):
|
||||
def __init__ (self, root_path, debug=False, batch_size=1, resolution=256, face_type=None,
|
||||
generators_count=4, data_format="NHWC",
|
||||
**kwargs):
|
||||
|
||||
super().__init__(debug, batch_size)
|
||||
self.initialized = False
|
||||
|
||||
|
||||
dataset_path = root_path / 'XSegDataset'
|
||||
if not dataset_path.exists():
|
||||
raise ValueError(f'Unable to find {dataset_path}')
|
||||
|
||||
aligned_path = dataset_path /'aligned'
|
||||
if not aligned_path.exists():
|
||||
raise ValueError(f'Unable to find {aligned_path}')
|
||||
|
||||
obstructions_path = dataset_path / 'obstructions'
|
||||
|
||||
obstructions_images_paths = pathex.get_image_paths(obstructions_path, image_extensions=['.png'], subdirs=True)
|
||||
|
||||
samples = SampleLoader.load (SampleType.FACE, aligned_path, subdirs=True)
|
||||
self.samples_len = len(samples)
|
||||
|
||||
pickled_samples = pickle.dumps(samples, 4)
|
||||
|
||||
if self.debug:
|
||||
self.generators_count = 1
|
||||
else:
|
||||
self.generators_count = max(1, generators_count)
|
||||
|
||||
if self.debug:
|
||||
self.generators = [ThisThreadGenerator ( self.batch_func, (pickled_samples, obstructions_images_paths, resolution, face_type, data_format) )]
|
||||
else:
|
||||
self.generators = [SubprocessGenerator ( self.batch_func, (pickled_samples, obstructions_images_paths, resolution, face_type, data_format), start_now=False ) \
|
||||
for i in range(self.generators_count) ]
|
||||
|
||||
SubprocessGenerator.start_in_parallel( self.generators )
|
||||
|
||||
self.generator_counter = -1
|
||||
|
||||
self.initialized = True
|
||||
|
||||
#overridable
|
||||
def is_initialized(self):
|
||||
return self.initialized
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
def __next__(self):
|
||||
self.generator_counter += 1
|
||||
generator = self.generators[self.generator_counter % len(self.generators) ]
|
||||
return next(generator)
|
||||
|
||||
def batch_func(self, param ):
|
||||
pickled_samples, obstructions_images_paths, resolution, face_type, data_format = param
|
||||
|
||||
samples = pickle.loads(pickled_samples)
|
||||
|
||||
shuffle_o_idxs = []
|
||||
o_idxs = [*range(len(obstructions_images_paths))]
|
||||
|
||||
shuffle_idxs = []
|
||||
idxs = [*range(len(samples))]
|
||||
|
||||
random_flip = True
|
||||
rotation_range=[-10,10]
|
||||
scale_range=[-0.05, 0.05]
|
||||
tx_range=[-0.05, 0.05]
|
||||
ty_range=[-0.05, 0.05]
|
||||
|
||||
o_random_flip = True
|
||||
o_rotation_range=[-180,180]
|
||||
o_scale_range=[-0.5, 0.05]
|
||||
o_tx_range=[-0.5, 0.5]
|
||||
o_ty_range=[-0.5, 0.5]
|
||||
|
||||
random_bilinear_resize_chance, random_bilinear_resize_max_size_per = 25,75
|
||||
motion_blur_chance, motion_blur_mb_max_size = 25, 5
|
||||
gaussian_blur_chance, gaussian_blur_kernel_max_size = 25, 5
|
||||
|
||||
bs = self.batch_size
|
||||
while True:
|
||||
batches = [ [], [] ]
|
||||
|
||||
n_batch = 0
|
||||
while n_batch < bs:
|
||||
try:
|
||||
if len(shuffle_idxs) == 0:
|
||||
shuffle_idxs = idxs.copy()
|
||||
np.random.shuffle(shuffle_idxs)
|
||||
|
||||
idx = shuffle_idxs.pop()
|
||||
|
||||
sample = samples[idx]
|
||||
|
||||
img = sample.load_bgr()
|
||||
h,w,c = img.shape
|
||||
|
||||
mask = np.zeros ((h,w,1), dtype=np.float32)
|
||||
sample.ie_polys.overlay_mask(mask)
|
||||
|
||||
warp_params = imagelib.gen_warp_params(resolution, random_flip, rotation_range=rotation_range, scale_range=scale_range, tx_range=tx_range, ty_range=ty_range )
|
||||
|
||||
if face_type == sample.face_type:
|
||||
if w != resolution:
|
||||
img = cv2.resize( img, (resolution, resolution), cv2.INTER_LANCZOS4 )
|
||||
mask = cv2.resize( mask, (resolution, resolution), cv2.INTER_LANCZOS4 )
|
||||
else:
|
||||
mat = LandmarksProcessor.get_transform_mat (sample.landmarks, resolution, face_type)
|
||||
img = cv2.warpAffine( img, mat, (resolution,resolution), borderMode=cv2.BORDER_CONSTANT, flags=cv2.INTER_LANCZOS4 )
|
||||
mask = cv2.warpAffine( mask, mat, (resolution,resolution), borderMode=cv2.BORDER_CONSTANT, flags=cv2.INTER_LANCZOS4 )
|
||||
|
||||
if len(mask.shape) == 2:
|
||||
mask = mask[...,None]
|
||||
|
||||
# apply obstruction
|
||||
if len(shuffle_o_idxs) == 0:
|
||||
shuffle_o_idxs = o_idxs.copy()
|
||||
np.random.shuffle(shuffle_o_idxs)
|
||||
o_idx = shuffle_o_idxs.pop()
|
||||
o_img = cv2_imread (obstructions_images_paths[o_idx]).astype(np.float32) / 255.0
|
||||
oh,ow,oc = o_img.shape
|
||||
if oc == 4:
|
||||
ohw = max(oh,ow)
|
||||
scale = resolution / ohw
|
||||
|
||||
#o_img = cv2.resize (o_img, ( int(ow*rate), int(oh*rate), ), cv2.INTER_CUBIC)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
mat = cv2.getRotationMatrix2D( (ow/2,oh/2),
|
||||
np.random.uniform( o_rotation_range[0], o_rotation_range[1] ),
|
||||
1.0 )
|
||||
|
||||
mat += np.float32( [[0,0, -ow/2 ],
|
||||
[0,0, -oh/2 ]])
|
||||
mat *= scale * np.random.uniform(1 +o_scale_range[0], 1 +o_scale_range[1])
|
||||
mat += np.float32( [[0, 0, resolution/2 + resolution*np.random.uniform( o_tx_range[0], o_tx_range[1] ) ],
|
||||
[0, 0, resolution/2 + resolution*np.random.uniform( o_ty_range[0], o_ty_range[1] ) ] ])
|
||||
|
||||
|
||||
o_img = cv2.warpAffine( o_img, mat, (resolution,resolution), borderMode=cv2.BORDER_CONSTANT, flags=cv2.INTER_LANCZOS4 )
|
||||
|
||||
if o_random_flip and np.random.randint(10) < 4:
|
||||
o_img = o_img[:,::-1,...]
|
||||
|
||||
o_mask = o_img[...,3:4]
|
||||
o_mask[o_mask>0] = 1.0
|
||||
|
||||
|
||||
o_mask = cv2.erode (o_mask, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)), iterations = 1 )
|
||||
o_mask = cv2.GaussianBlur(o_mask, (5, 5) , 0)[...,None]
|
||||
|
||||
img = img*(1-o_mask) + o_img[...,0:3]*o_mask
|
||||
|
||||
o_mask[o_mask<0.5] = 0.0
|
||||
|
||||
|
||||
#import code
|
||||
#code.interact(local=dict(globals(), **locals()))
|
||||
mask *= (1-o_mask)
|
||||
|
||||
|
||||
#cv2.imshow ("", np.clip(o_img*255, 0,255).astype(np.uint8) )
|
||||
#cv2.waitKey(0)
|
||||
|
||||
|
||||
img = imagelib.warp_by_params (warp_params, img, can_warp=True, can_transform=True, can_flip=True, border_replicate=False)
|
||||
mask = imagelib.warp_by_params (warp_params, mask, can_warp=True, can_transform=True, can_flip=True, border_replicate=False)
|
||||
|
||||
|
||||
img = np.clip(img.astype(np.float32), 0, 1)
|
||||
mask[mask < 0.5] = 0.0
|
||||
mask[mask >= 0.5] = 1.0
|
||||
mask = np.clip(mask, 0, 1)
|
||||
|
||||
img = imagelib.apply_random_hsv_shift(img)
|
||||
|
||||
#todo random mask for blur
|
||||
|
||||
img = imagelib.apply_random_motion_blur( img, motion_blur_chance, motion_blur_mb_max_size )
|
||||
img = imagelib.apply_random_gaussian_blur( img, gaussian_blur_chance, gaussian_blur_kernel_max_size )
|
||||
img = imagelib.apply_random_bilinear_resize( img, random_bilinear_resize_chance, random_bilinear_resize_max_size_per )
|
||||
|
||||
if data_format == "NCHW":
|
||||
img = np.transpose(img, (2,0,1) )
|
||||
mask = np.transpose(mask, (2,0,1) )
|
||||
|
||||
batches[0].append ( img )
|
||||
batches[1].append ( mask )
|
||||
|
||||
n_batch += 1
|
||||
except:
|
||||
io.log_err ( traceback.format_exc() )
|
||||
|
||||
yield [ np.array(batch) for batch in batches]
|
|
@ -32,7 +32,7 @@ class SampleLoader:
|
|||
return len(list(persons_name_idxs.keys()))
|
||||
|
||||
@staticmethod
|
||||
def load(sample_type, samples_path):
|
||||
def load(sample_type, samples_path, subdirs=False):
|
||||
samples_cache = SampleLoader.samples_cache
|
||||
|
||||
if str(samples_path) not in samples_cache.keys():
|
||||
|
@ -42,7 +42,7 @@ class SampleLoader:
|
|||
|
||||
if sample_type == SampleType.IMAGE:
|
||||
if samples[sample_type] is None:
|
||||
samples[sample_type] = [ Sample(filename=filename) for filename in io.progress_bar_generator( pathex.get_image_paths(samples_path), "Loading") ]
|
||||
samples[sample_type] = [ Sample(filename=filename) for filename in io.progress_bar_generator( pathex.get_image_paths(samples_path, subdirs=subdirs), "Loading") ]
|
||||
|
||||
elif sample_type == SampleType.FACE:
|
||||
if samples[sample_type] is None:
|
||||
|
@ -55,7 +55,7 @@ class SampleLoader:
|
|||
io.log_info (f"Loaded {len(result)} packed faces from {samples_path}")
|
||||
|
||||
if result is None:
|
||||
result = SampleLoader.load_face_samples( pathex.get_image_paths(samples_path) )
|
||||
result = SampleLoader.load_face_samples( pathex.get_image_paths(samples_path, subdirs=subdirs) )
|
||||
samples[sample_type] = result
|
||||
|
||||
elif sample_type == SampleType.FACE_TEMPORAL_SORTED:
|
||||
|
|
|
@ -73,12 +73,19 @@ class SampleProcessor(object):
|
|||
if debug and is_face_sample:
|
||||
LandmarksProcessor.draw_landmarks (sample_bgr, sample_landmarks, (0, 1, 0))
|
||||
|
||||
if sample_face_type == FaceType.MARK_ONLY:
|
||||
warp_resolution = np.max( [ opts.get('resolution', 0) for opts in output_sample_types ] )
|
||||
else:
|
||||
warp_resolution = w
|
||||
|
||||
params = imagelib.gen_warp_params(warp_resolution, sample_process_options.random_flip, rotation_range=sample_process_options.rotation_range, scale_range=sample_process_options.scale_range, tx_range=sample_process_options.tx_range, ty_range=sample_process_options.ty_range )
|
||||
params_per_resolution = {}
|
||||
warp_rnd_state = np.random.RandomState (sample_rnd_seed-1)
|
||||
for opts in output_sample_types:
|
||||
resolution = opts.get('resolution', None)
|
||||
if resolution is None:
|
||||
continue
|
||||
params_per_resolution[resolution] = imagelib.gen_warp_params(resolution,
|
||||
sample_process_options.random_flip,
|
||||
rotation_range=sample_process_options.rotation_range,
|
||||
scale_range=sample_process_options.scale_range,
|
||||
tx_range=sample_process_options.tx_range,
|
||||
ty_range=sample_process_options.ty_range,
|
||||
rnd_state=warp_rnd_state)
|
||||
|
||||
outputs_sample = []
|
||||
for opts in output_sample_types:
|
||||
|
@ -89,6 +96,7 @@ class SampleProcessor(object):
|
|||
transform = opts.get('transform', False)
|
||||
motion_blur = opts.get('motion_blur', None)
|
||||
gaussian_blur = opts.get('gaussian_blur', None)
|
||||
random_bilinear_resize = opts.get('random_bilinear_resize', None)
|
||||
normalize_tanh = opts.get('normalize_tanh', False)
|
||||
ct_mode = opts.get('ct_mode', None)
|
||||
data_format = opts.get('data_format', 'NHWC')
|
||||
|
@ -137,31 +145,38 @@ class SampleProcessor(object):
|
|||
mat = LandmarksProcessor.get_transform_mat (sample_landmarks, warp_resolution, face_type)
|
||||
img = cv2.warpAffine( img, mat, (warp_resolution, warp_resolution), flags=cv2.INTER_LINEAR )
|
||||
|
||||
img = imagelib.warp_by_params (params, img, warp, transform, can_flip=True, border_replicate=border_replicate, cv2_inter=cv2.INTER_LINEAR)
|
||||
img = cv2.resize( img, (resolution,resolution), cv2.INTER_LINEAR )[...,None]
|
||||
img = imagelib.warp_by_params (params_per_resolution[resolution], img, warp, transform, can_flip=True, border_replicate=border_replicate, cv2_inter=cv2.INTER_LINEAR)
|
||||
img = cv2.resize( img, (resolution,resolution), cv2.INTER_LINEAR )
|
||||
else:
|
||||
img = imagelib.warp_by_params (params, img, warp, transform, can_flip=True, border_replicate=border_replicate, cv2_inter=cv2.INTER_LINEAR)
|
||||
mat = LandmarksProcessor.get_transform_mat (sample_landmarks, resolution, face_type)
|
||||
img = cv2.warpAffine( img, mat, (resolution,resolution), borderMode=borderMode, flags=cv2.INTER_LINEAR )[...,None]
|
||||
|
||||
if face_type != sample_face_type:
|
||||
mat = LandmarksProcessor.get_transform_mat (sample_landmarks, resolution, face_type)
|
||||
img = cv2.warpAffine( img, mat, (resolution,resolution), borderMode=borderMode, flags=cv2.INTER_LINEAR )
|
||||
else:
|
||||
if w != resolution:
|
||||
img = cv2.resize( img, (resolution, resolution), cv2.INTER_CUBIC )
|
||||
|
||||
img = imagelib.warp_by_params (params_per_resolution[resolution], img, warp, transform, can_flip=True, border_replicate=border_replicate, cv2_inter=cv2.INTER_LINEAR)
|
||||
|
||||
if len(img.shape) == 2:
|
||||
img = img[...,None]
|
||||
|
||||
if channel_type == SPCT.G:
|
||||
out_sample = img.astype(np.float32)
|
||||
else:
|
||||
raise ValueError("only channel_type.G supported for the mask")
|
||||
|
||||
elif sample_type == SPST.FACE_IMAGE:
|
||||
img = sample_bgr
|
||||
img = sample_bgr
|
||||
|
||||
if sample_face_type == FaceType.MARK_ONLY:
|
||||
mat = LandmarksProcessor.get_transform_mat (sample_landmarks, warp_resolution, face_type)
|
||||
img = cv2.warpAffine( img, mat, (warp_resolution,warp_resolution), flags=cv2.INTER_CUBIC )
|
||||
img = imagelib.warp_by_params (params, img, warp, transform, can_flip=True, border_replicate=border_replicate)
|
||||
img = cv2.resize( img, (resolution,resolution), cv2.INTER_CUBIC )
|
||||
else:
|
||||
img = imagelib.warp_by_params (params, img, warp, transform, can_flip=True, border_replicate=border_replicate)
|
||||
|
||||
if face_type != sample_face_type:
|
||||
mat = LandmarksProcessor.get_transform_mat (sample_landmarks, resolution, face_type)
|
||||
img = cv2.warpAffine( img, mat, (resolution,resolution), borderMode=borderMode, flags=cv2.INTER_CUBIC )
|
||||
|
||||
img = cv2.warpAffine( img, mat, (resolution,resolution), borderMode=borderMode, flags=cv2.INTER_CUBIC )
|
||||
else:
|
||||
if w != resolution:
|
||||
img = cv2.resize( img, (resolution, resolution), cv2.INTER_CUBIC )
|
||||
img = imagelib.warp_by_params (params_per_resolution[resolution], img, warp, transform, can_flip=True, border_replicate=border_replicate)
|
||||
|
||||
img = np.clip(img.astype(np.float32), 0, 1)
|
||||
|
||||
|
||||
|
@ -195,6 +210,16 @@ class SampleProcessor(object):
|
|||
if gblur_rnd_chance < chance:
|
||||
img = cv2.GaussianBlur(img, (gblur_rnd_kernel,) *2 , 0)
|
||||
|
||||
if random_bilinear_resize is not None:
|
||||
l_rnd_state = np.random.RandomState (sample_rnd_seed+2)
|
||||
|
||||
chance, max_size_per = random_bilinear_resize
|
||||
chance = np.clip(chance, 0, 100)
|
||||
pick_chance = l_rnd_state.randint(100)
|
||||
resize_to = resolution - int( l_rnd_state.rand()* int(resolution*(max_size_per/100.0)) )
|
||||
img = cv2.resize (img, (resize_to,resize_to), cv2.INTER_LINEAR )
|
||||
img = cv2.resize (img, (resolution,resolution), cv2.INTER_LINEAR )
|
||||
|
||||
# Transform from BGR to desired channel_type
|
||||
if channel_type == SPCT.BGR:
|
||||
out_sample = img
|
||||
|
@ -207,7 +232,7 @@ class SampleProcessor(object):
|
|||
h, s, v = cv2.split(hsv)
|
||||
h = (h + l_rnd_state.randint(360) ) % 360
|
||||
s = np.clip ( s + l_rnd_state.random()-0.5, 0, 1 )
|
||||
v = np.clip ( v + l_rnd_state.random()-0.5, 0, 1 )
|
||||
v = np.clip ( v + l_rnd_state.random()/2-0.25, 0, 1 )
|
||||
hsv = cv2.merge([h, s, v])
|
||||
out_sample = np.clip( cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) , 0, 1 )
|
||||
elif channel_type == SPCT.BGR_RANDOM_RGB_LEVELS:
|
||||
|
@ -234,7 +259,7 @@ class SampleProcessor(object):
|
|||
out_sample = np.transpose(out_sample, (2,0,1) )
|
||||
elif sample_type == SPST.IMAGE:
|
||||
img = sample_bgr
|
||||
img = imagelib.warp_by_params (params, img, warp, transform, can_flip=True, border_replicate=True)
|
||||
img = imagelib.warp_by_params (params_per_resolution[resolution], img, warp, transform, can_flip=True, border_replicate=True)
|
||||
img = cv2.resize( img, (resolution, resolution), cv2.INTER_CUBIC )
|
||||
out_sample = img
|
||||
|
||||
|
|
|
@ -9,4 +9,5 @@ from .SampleGeneratorFaceTemporal import SampleGeneratorFaceTemporal
|
|||
from .SampleGeneratorImage import SampleGeneratorImage
|
||||
from .SampleGeneratorImageTemporal import SampleGeneratorImageTemporal
|
||||
from .SampleGeneratorFaceCelebAMaskHQ import SampleGeneratorFaceCelebAMaskHQ
|
||||
from .SampleGeneratorFaceSkinSegDataset import SampleGeneratorFaceSkinSegDataset
|
||||
from .PackedFaceset import PackedFaceset
|
Loading…
Add table
Add a link
Reference in a new issue