mirror of
https://github.com/iperov/DeepFaceLab.git
synced 2025-07-07 13:32:09 -07:00
SAE/SAEHD:
removed option 'apply random ct' added option Color transfer mode apply to src faceset. ( none/rct/lct/mkl/idt, ?:help skip: none ) Change color distribution of src samples close to dst samples. Try all modes to find the best. before was lct mode, but sometime it does not work properly for some facesets.
This commit is contained in:
parent
5a2eefaa5b
commit
73511a072a
3 changed files with 29 additions and 22 deletions
|
@ -82,9 +82,9 @@ class SAEModel(ModelBase):
|
||||||
self.options['bg_style_power'] = np.clip ( io.input_number("Background style power ( 0.0 .. 100.0 ?:help skip:%.2f) : " % (default_bg_style_power), default_bg_style_power,
|
self.options['bg_style_power'] = np.clip ( io.input_number("Background style power ( 0.0 .. 100.0 ?:help skip:%.2f) : " % (default_bg_style_power), default_bg_style_power,
|
||||||
help_message="Learn to transfer image around face. This can make face more like dst. Enabling this option increases the chance of model collapse."), 0.0, 100.0 )
|
help_message="Learn to transfer image around face. This can make face more like dst. Enabling this option increases the chance of model collapse."), 0.0, 100.0 )
|
||||||
|
|
||||||
default_apply_random_ct = False if is_first_run else self.options.get('apply_random_ct', False)
|
default_ct_mode = False if is_first_run else self.options.get('ct_mode', 'none')
|
||||||
self.options['apply_random_ct'] = io.input_bool (f"Apply random color transfer to src faceset? (y/n, ?:help skip:{yn_str[default_apply_random_ct]}) : ", default_apply_random_ct, help_message="Increase variativity of src samples by apply LCT color transfer from random dst samples. It is like 'face_style' learning, but more precise color transfer and without risk of model collapse, also it does not require additional GPU resources, but the training time may be longer, due to the src faceset is becoming more diverse.")
|
self.options['ct_mode'] = io.input_str (f"Color transfer mode apply to src faceset. ( none/rct/lct/mkl/idt, ?:help skip:{default_ct_mode}) : ", default_ct_mode, ['none','rct','lct','mkl','idt'], help_message="Change color distribution of src samples close to dst samples. Try all modes to find the best.")
|
||||||
|
|
||||||
if nnlib.device.backend != 'plaidML': # todo https://github.com/plaidml/plaidml/issues/301
|
if nnlib.device.backend != 'plaidML': # todo https://github.com/plaidml/plaidml/issues/301
|
||||||
default_clipgrad = False if is_first_run else self.options.get('clipgrad', False)
|
default_clipgrad = False if is_first_run else self.options.get('clipgrad', False)
|
||||||
self.options['clipgrad'] = io.input_bool (f"Enable gradient clipping? (y/n, ?:help skip:{yn_str[default_clipgrad]}) : ", default_clipgrad, help_message="Gradient clipping reduces chance of model collapse, sacrificing speed of training.")
|
self.options['clipgrad'] = io.input_bool (f"Enable gradient clipping? (y/n, ?:help skip:{yn_str[default_clipgrad]}) : ", default_clipgrad, help_message="Gradient clipping reduces chance of model collapse, sacrificing speed of training.")
|
||||||
|
@ -95,7 +95,7 @@ class SAEModel(ModelBase):
|
||||||
self.options['pixel_loss'] = self.options.get('pixel_loss', False)
|
self.options['pixel_loss'] = self.options.get('pixel_loss', False)
|
||||||
self.options['face_style_power'] = self.options.get('face_style_power', default_face_style_power)
|
self.options['face_style_power'] = self.options.get('face_style_power', default_face_style_power)
|
||||||
self.options['bg_style_power'] = self.options.get('bg_style_power', default_bg_style_power)
|
self.options['bg_style_power'] = self.options.get('bg_style_power', default_bg_style_power)
|
||||||
self.options['apply_random_ct'] = self.options.get('apply_random_ct', False)
|
self.options['ct_mode'] = self.options.get('ct_mode', 'none')
|
||||||
self.options['clipgrad'] = self.options.get('clipgrad', False)
|
self.options['clipgrad'] = self.options.get('clipgrad', False)
|
||||||
|
|
||||||
if is_first_run:
|
if is_first_run:
|
||||||
|
@ -121,7 +121,6 @@ class SAEModel(ModelBase):
|
||||||
bgr_shape = (resolution, resolution, 3)
|
bgr_shape = (resolution, resolution, 3)
|
||||||
mask_shape = (resolution, resolution, 1)
|
mask_shape = (resolution, resolution, 1)
|
||||||
|
|
||||||
apply_random_ct = self.options.get('apply_random_ct', False)
|
|
||||||
masked_training = True
|
masked_training = True
|
||||||
|
|
||||||
class SAEDFModel(object):
|
class SAEDFModel(object):
|
||||||
|
@ -476,11 +475,11 @@ class SAEModel(ModelBase):
|
||||||
|
|
||||||
self.set_training_data_generators ([
|
self.set_training_data_generators ([
|
||||||
SampleGeneratorFace(training_data_src_path, sort_by_yaw_target_samples_path=training_data_dst_path if sort_by_yaw else None,
|
SampleGeneratorFace(training_data_src_path, sort_by_yaw_target_samples_path=training_data_dst_path if sort_by_yaw else None,
|
||||||
random_ct_samples_path=training_data_dst_path if apply_random_ct else None,
|
random_ct_samples_path=training_data_dst_path if self.options['ct_mode'] != 'none' else None,
|
||||||
debug=self.is_debug(), batch_size=self.batch_size,
|
debug=self.is_debug(), batch_size=self.batch_size,
|
||||||
sample_process_options=SampleProcessor.Options(random_flip=self.random_flip, scale_range=np.array([-0.05, 0.05])+self.src_scale_mod / 100.0 ),
|
sample_process_options=SampleProcessor.Options(random_flip=self.random_flip, scale_range=np.array([-0.05, 0.05])+self.src_scale_mod / 100.0 ),
|
||||||
output_sample_types = [ {'types' : (t.IMG_WARPED_TRANSFORMED, face_type, t_mode_bgr), 'resolution':resolution, 'apply_ct': apply_random_ct},
|
output_sample_types = [ {'types' : (t.IMG_WARPED_TRANSFORMED, face_type, t_mode_bgr), 'resolution':resolution, 'ct_mode': self.options['ct_mode'] },
|
||||||
{'types' : (t.IMG_TRANSFORMED, face_type, t_mode_bgr), 'resolution': resolution, 'apply_ct': apply_random_ct },
|
{'types' : (t.IMG_TRANSFORMED, face_type, t_mode_bgr), 'resolution': resolution, 'ct_mode': self.options['ct_mode'] },
|
||||||
{'types' : (t.IMG_TRANSFORMED, face_type, t.MODE_M), 'resolution': resolution } ]
|
{'types' : (t.IMG_TRANSFORMED, face_type, t.MODE_M), 'resolution': resolution } ]
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -565,7 +564,7 @@ class SAEModel(ModelBase):
|
||||||
|
|
||||||
import converters
|
import converters
|
||||||
return self.predictor_func, (self.options['resolution'], self.options['resolution'], 3), converters.ConverterConfigMasked(face_type=face_type,
|
return self.predictor_func, (self.options['resolution'], self.options['resolution'], 3), converters.ConverterConfigMasked(face_type=face_type,
|
||||||
default_mode = 1 if self.options['apply_random_ct'] or self.options['face_style_power'] or self.options['bg_style_power'] else 4,
|
default_mode = 1 if self.options['ct_mode'] != 'none' or self.options['face_style_power'] or self.options['bg_style_power'] else 4,
|
||||||
clip_hborder_mask_per=0.0625 if (self.options['face_type'] == 'f') else 0,
|
clip_hborder_mask_per=0.0625 if (self.options['face_type'] == 'f') else 0,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -76,8 +76,8 @@ class SAEHDModel(ModelBase):
|
||||||
self.options['bg_style_power'] = np.clip ( io.input_number("Background style power ( 0.0 .. 100.0 ?:help skip:%.2f) : " % (default_bg_style_power), default_bg_style_power,
|
self.options['bg_style_power'] = np.clip ( io.input_number("Background style power ( 0.0 .. 100.0 ?:help skip:%.2f) : " % (default_bg_style_power), default_bg_style_power,
|
||||||
help_message="Learn to transfer image around face. This can make face more like dst. Enabling this option increases the chance of model collapse."), 0.0, 100.0 )
|
help_message="Learn to transfer image around face. This can make face more like dst. Enabling this option increases the chance of model collapse."), 0.0, 100.0 )
|
||||||
|
|
||||||
default_apply_random_ct = False if is_first_run else self.options.get('apply_random_ct', False)
|
default_ct_mode = False if is_first_run else self.options.get('ct_mode', 'none')
|
||||||
self.options['apply_random_ct'] = io.input_bool (f"Apply random color transfer to src faceset? (y/n, ?:help skip:{yn_str[default_apply_random_ct]}) : ", default_apply_random_ct, help_message="Increase variativity of src samples by apply LCT color transfer from random dst samples. It is like 'face_style' learning, but more precise color transfer and without risk of model collapse, also it does not require additional GPU resources, but the training time may be longer, due to the src faceset is becoming more diverse.")
|
self.options['ct_mode'] = io.input_str (f"Color transfer mode apply to src faceset. ( none/rct/lct/mkl/idt, ?:help skip:{default_ct_mode}) : ", default_ct_mode, ['none','rct','lct','mkl','idt'], help_message="Change color distribution of src samples close to dst samples. Try all modes to find the best.")
|
||||||
|
|
||||||
if nnlib.device.backend != 'plaidML': # todo https://github.com/plaidml/plaidml/issues/301
|
if nnlib.device.backend != 'plaidML': # todo https://github.com/plaidml/plaidml/issues/301
|
||||||
default_clipgrad = False if is_first_run else self.options.get('clipgrad', False)
|
default_clipgrad = False if is_first_run else self.options.get('clipgrad', False)
|
||||||
|
@ -90,7 +90,7 @@ class SAEHDModel(ModelBase):
|
||||||
self.options['true_face_training'] = self.options.get('true_face_training', default_true_face_training)
|
self.options['true_face_training'] = self.options.get('true_face_training', default_true_face_training)
|
||||||
self.options['face_style_power'] = self.options.get('face_style_power', default_face_style_power)
|
self.options['face_style_power'] = self.options.get('face_style_power', default_face_style_power)
|
||||||
self.options['bg_style_power'] = self.options.get('bg_style_power', default_bg_style_power)
|
self.options['bg_style_power'] = self.options.get('bg_style_power', default_bg_style_power)
|
||||||
self.options['apply_random_ct'] = self.options.get('apply_random_ct', False)
|
self.options['ct_mode'] = self.options.get('ct_mode', 'none')
|
||||||
self.options['clipgrad'] = self.options.get('clipgrad', False)
|
self.options['clipgrad'] = self.options.get('clipgrad', False)
|
||||||
|
|
||||||
if is_first_run:
|
if is_first_run:
|
||||||
|
@ -115,7 +115,6 @@ class SAEHDModel(ModelBase):
|
||||||
bgr_shape = (resolution, resolution, 3)
|
bgr_shape = (resolution, resolution, 3)
|
||||||
mask_shape = (resolution, resolution, 1)
|
mask_shape = (resolution, resolution, 1)
|
||||||
|
|
||||||
apply_random_ct = self.options.get('apply_random_ct', False)
|
|
||||||
self.true_face_training = self.options.get('true_face_training', False)
|
self.true_face_training = self.options.get('true_face_training', False)
|
||||||
masked_training = True
|
masked_training = True
|
||||||
|
|
||||||
|
@ -537,11 +536,11 @@ class SAEHDModel(ModelBase):
|
||||||
|
|
||||||
self.set_training_data_generators ([
|
self.set_training_data_generators ([
|
||||||
SampleGeneratorFace(training_data_src_path, sort_by_yaw_target_samples_path=training_data_dst_path if sort_by_yaw else None,
|
SampleGeneratorFace(training_data_src_path, sort_by_yaw_target_samples_path=training_data_dst_path if sort_by_yaw else None,
|
||||||
random_ct_samples_path=training_data_dst_path if apply_random_ct else None,
|
random_ct_samples_path=training_data_dst_path if self.options['ct_mode'] != 'none' else None,
|
||||||
debug=self.is_debug(), batch_size=self.batch_size,
|
debug=self.is_debug(), batch_size=self.batch_size,
|
||||||
sample_process_options=SampleProcessor.Options(random_flip=self.random_flip, scale_range=np.array([-0.05, 0.05])+self.src_scale_mod / 100.0 ),
|
sample_process_options=SampleProcessor.Options(random_flip=self.random_flip, scale_range=np.array([-0.05, 0.05])+self.src_scale_mod / 100.0 ),
|
||||||
output_sample_types = [ {'types' : (t_img_warped, face_type, t_mode_bgr), 'resolution':resolution, 'apply_ct': apply_random_ct},
|
output_sample_types = [ {'types' : (t_img_warped, face_type, t_mode_bgr), 'resolution':resolution, 'ct_mode': self.options['ct_mode'] },
|
||||||
{'types' : (t.IMG_TRANSFORMED, face_type, t_mode_bgr), 'resolution': resolution, 'apply_ct': apply_random_ct },
|
{'types' : (t.IMG_TRANSFORMED, face_type, t_mode_bgr), 'resolution': resolution, 'ct_mode': self.options['ct_mode'] },
|
||||||
{'types' : (t.IMG_TRANSFORMED, face_type, t.MODE_M), 'resolution': resolution } ]
|
{'types' : (t.IMG_TRANSFORMED, face_type, t.MODE_M), 'resolution': resolution } ]
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -640,7 +639,7 @@ class SAEHDModel(ModelBase):
|
||||||
|
|
||||||
import converters
|
import converters
|
||||||
return self.predictor_func, (self.options['resolution'], self.options['resolution'], 3), converters.ConverterConfigMasked(face_type=face_type,
|
return self.predictor_func, (self.options['resolution'], self.options['resolution'], 3), converters.ConverterConfigMasked(face_type=face_type,
|
||||||
default_mode = 1 if self.options['apply_random_ct'] or self.options['face_style_power'] or self.options['bg_style_power'] else 4,
|
default_mode = 1 if self.options['ct_mode'] != 'none' or self.options['face_style_power'] or self.options['bg_style_power'] else 4,
|
||||||
clip_hborder_mask_per=0.0625 if (face_type != FaceType.HALF) else 0,
|
clip_hborder_mask_per=0.0625 if (face_type != FaceType.HALF) else 0,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ opts:
|
||||||
|
|
||||||
'resolution' : N
|
'resolution' : N
|
||||||
'motion_blur' : (chance_int, range) - chance 0..100 to apply to face (not mask), and max_size of motion blur
|
'motion_blur' : (chance_int, range) - chance 0..100 to apply to face (not mask), and max_size of motion blur
|
||||||
'apply_ct' : bool
|
'ct_mode' :
|
||||||
'normalize_tanh' : bool
|
'normalize_tanh' : bool
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -125,7 +125,7 @@ class SampleProcessor(object):
|
||||||
gaussian_blur = opts.get('gaussian_blur', None)
|
gaussian_blur = opts.get('gaussian_blur', None)
|
||||||
|
|
||||||
random_hsv_shift = opts.get('random_hsv_shift', None)
|
random_hsv_shift = opts.get('random_hsv_shift', None)
|
||||||
apply_ct = opts.get('apply_ct', False)
|
ct_mode = opts.get('ct_mode', 'None')
|
||||||
normalize_tanh = opts.get('normalize_tanh', False)
|
normalize_tanh = opts.get('normalize_tanh', False)
|
||||||
|
|
||||||
img_type = SPTF.NONE
|
img_type = SPTF.NONE
|
||||||
|
@ -244,14 +244,23 @@ class SampleProcessor(object):
|
||||||
img_bgr = img[...,0:3]
|
img_bgr = img[...,0:3]
|
||||||
img_mask = img[...,3:4]
|
img_mask = img[...,3:4]
|
||||||
|
|
||||||
if apply_ct and ct_sample is not None:
|
if ct_mode is not None and ct_sample is not None:
|
||||||
if ct_sample_bgr is None:
|
if ct_sample_bgr is None:
|
||||||
ct_sample_bgr = ct_sample.load_bgr()
|
ct_sample_bgr = ct_sample.load_bgr()
|
||||||
|
|
||||||
ct_sample_bgr_resized = cv2.resize( ct_sample_bgr, (resolution,resolution), cv2.INTER_LINEAR )
|
ct_sample_bgr_resized = cv2.resize( ct_sample_bgr, (resolution,resolution), cv2.INTER_LINEAR )
|
||||||
|
|
||||||
img_bgr = imagelib.linear_color_transfer (img_bgr, ct_sample_bgr_resized)
|
if ct_mode == 'lct':
|
||||||
img_bgr = np.clip( img_bgr, 0.0, 1.0)
|
img_bgr = imagelib.linear_color_transfer (img_bgr, ct_sample_bgr_resized)
|
||||||
|
img_bgr = np.clip( img_bgr, 0.0, 1.0)
|
||||||
|
elif ct_mode == 'rct':
|
||||||
|
img_bgr = imagelib.reinhard_color_transfer ( np.clip( (img_bgr*255).astype(np.uint8), 0, 255),
|
||||||
|
np.clip( (ct_sample_bgr_resized*255).astype(np.uint8), 0, 255) )
|
||||||
|
img_bgr = np.clip( img_bgr.astype(np.float32) / 255.0, 0.0, 1.0)
|
||||||
|
elif ct_mode == 'mkl':
|
||||||
|
img_bgr = imagelib.color_transfer_mkl (img_bgr, ct_sample_bgr_resized)
|
||||||
|
elif ct_mode == 'idt':
|
||||||
|
img_bgr = imagelib.color_transfer_idt (img_bgr, ct_sample_bgr_resized)
|
||||||
|
|
||||||
if random_hsv_shift:
|
if random_hsv_shift:
|
||||||
rnd_state = np.random.RandomState (sample_rnd_seed)
|
rnd_state = np.random.RandomState (sample_rnd_seed)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue