From 9c1ccc0d2d04f27e97f28375b0c1d798a4ba80c7 Mon Sep 17 00:00:00 2001 From: iperov Date: Thu, 18 Apr 2019 20:32:47 +0400 Subject: [PATCH] _ --- models/Model_AVATAR/Model.py | 574 -------------------------------- models/Model_AVATAR/__init__.py | 1 - models/archived_models.zip | Bin 137605 -> 153370 bytes 3 files changed, 575 deletions(-) delete mode 100644 models/Model_AVATAR/Model.py delete mode 100644 models/Model_AVATAR/__init__.py diff --git a/models/Model_AVATAR/Model.py b/models/Model_AVATAR/Model.py deleted file mode 100644 index f82b23f..0000000 --- a/models/Model_AVATAR/Model.py +++ /dev/null @@ -1,574 +0,0 @@ -from functools import partial - -import cv2 -import numpy as np - -from facelib import FaceType -from interact import interact as io -from mathlib import get_power_of_two -from models import ModelBase -from nnlib import nnlib -from samplelib import * - - -class AVATARModel(ModelBase): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs, - ask_sort_by_yaw=False, - ask_random_flip=False, - ask_src_scale_mod=False) - - #override - def onInitializeOptions(self, is_first_run, ask_override): - default_face_type = 'f' - if is_first_run: - self.options['resolution'] = io.input_int("Resolution ( 128,256 ?:help skip:128) : ", 128, [128,256], help_message="More resolution requires more VRAM and time to train. Value will be adjusted to multiple of 16.") - else: - self.options['resolution'] = self.options.get('resolution', 128) - - - #override - def onInitialize(self, batch_size=-1, **in_options): - - - exec(nnlib.code_import_all, locals(), globals()) - self.set_vram_batch_requirements({4:4}) - - resolution = self.options['resolution'] - bgr_shape = (resolution, resolution, 3) - mask_shape = (resolution, resolution, 1) - bgrm_shape = (resolution, resolution, 4) - - ngf = 64 - ndf = 64 - lambda_A = 100 - lambda_B = 100 - - use_batch_norm = True #created_batch_size > 1 - - self.enc = modelify(AVATARModel.DFEncFlow ())( Input(bgrm_shape) ) - - dec_Inputs = [ Input(K.int_shape(x)[1:]) for x in self.enc.outputs ] - - self.decA = modelify(AVATARModel.DFDecFlow (bgr_shape[2])) (dec_Inputs) - self.decB = modelify(AVATARModel.DFDecFlow (bgr_shape[2])) (dec_Inputs) - - #self.GA = modelify(AVATARModel.ResNet (bgr_shape[2], use_batch_norm, n_blocks=6, ngf=ngf, use_dropout=True))( Input(bgrm_shape) ) - #self.GB = modelify(AVATARModel.ResNet (bgr_shape[2], use_batch_norm, n_blocks=6, ngf=ngf, use_dropout=True))( Input(bgrm_shape) ) - - #self.GA = modelify(UNet (bgr_shape[2], use_batch_norm, num_downs=get_power_of_two(resolution)-1, ngf=ngf, use_dropout=True))(Input(bgr_shape)) - #self.GB = modelify(UNet (bgr_shape[2], use_batch_norm, num_downs=get_power_of_two(resolution)-1, ngf=ngf, use_dropout=True))(Input(bgr_shape)) - - def GA(x): - return self.decA(self.enc(x)) - self.GA = GA - - def GB(x): - return self.decB(self.enc(x)) - self.GB = GB - - #self.DA = modelify(AVATARModel.PatchDiscriminator(ndf=ndf) ) ( Input(bgrm_shape) ) - #self.DB = modelify(AVATARModel.PatchDiscriminator(ndf=ndf) ) ( Input(bgrm_shape) ) - self.DA = modelify(AVATARModel.NLayerDiscriminator(ndf=ndf) ) ( Input(bgrm_shape) ) - self.DB = modelify(AVATARModel.NLayerDiscriminator(ndf=ndf) ) ( Input(bgrm_shape) ) - - if not self.is_first_run(): - weights_to_load = [ - # (self.GA, 'GA.h5'), - # (self.GB, 'GB.h5'), - (self.enc, 'enc.h5'), - (self.decA, 'decA.h5'), - (self.decB, 'decB.h5'), - (self.DA, 'DA.h5'), - (self.DB, 'DB.h5'), - ] - self.load_weights_safe(weights_to_load) - - real_A0 = Input(bgr_shape) - real_A0m = Input(mask_shape) - real_A0m_sigm = (real_A0m + 1) / 2 - real_B0 = Input(bgr_shape) - real_B0m = Input(mask_shape) - real_B0m_sigm = (real_B0m + 1) / 2 - - real_A0_B0m = K.concatenate([real_A0, real_B0m]) - - real_B0_A0m = K.concatenate([real_B0, real_A0m]) - - DA_ones = K.ones_like ( K.shape(self.DA.outputs[0]) ) - DA_zeros = K.zeros_like ( K.shape(self.DA.outputs[0] )) - DB_ones = K.ones_like ( K.shape(self.DB.outputs[0] )) - DB_zeros = K.zeros_like ( K.shape(self.DB.outputs[0] )) - - def DLoss(labels,logits): - return K.mean(K.binary_crossentropy(labels,logits)) - - def CycleLOSS(t1,t2): - return dssim(kernel_size=int(resolution/11.6),max_value=2.0)(t1+1,t2+1 ) - #return K.mean(K.abs(t1 - t2)) - - fake_B0 = self.GA(real_A0_B0m) - fake_A0 = self.GB(real_B0_A0m) - - real_A0_d = self.DA( K.concatenate([ real_A0 * real_A0m_sigm , real_A0m]) ) - real_A0_d_ones = K.ones_like(real_A0_d) - - fake_A0_d = self.DA( K.concatenate([fake_A0, real_A0m]) ) - fake_A0_d_ones = K.ones_like(fake_A0_d) - fake_A0_d_zeros = K.zeros_like(fake_A0_d) - - real_B0_d = self.DB( K.concatenate([real_B0 * real_B0m_sigm, real_B0m]) ) - real_B0_d_ones = K.ones_like(real_B0_d) - - fake_B0_d = self.DB( K.concatenate([fake_B0 , real_B0m]) ) - fake_B0_d_ones = K.ones_like(fake_B0_d) - fake_B0_d_zeros = K.zeros_like(fake_B0_d) - - rec_A0 = self.GB ( K.concatenate([fake_B0, real_A0m]) ) - rec_B0 = self.GA ( K.concatenate([fake_A0, real_B0m]) ) - - - loss_GA = DLoss(fake_B0_d_ones, fake_B0_d ) + \ - lambda_A * (CycleLOSS(rec_B0*real_B0m_sigm, real_B0*real_B0m_sigm) ) - - weights_GA = self.enc.trainable_weights + self.decA.trainable_weights - - loss_GB = DLoss(fake_A0_d_ones, fake_A0_d ) + \ - lambda_B * (CycleLOSS(rec_A0*real_A0m_sigm, real_A0*real_A0m_sigm) ) - - weights_GB = self.enc.trainable_weights + self.decB.trainable_weights - - def opt(): - return Adam(lr=2e-5, beta_1=0.5, beta_2=0.999, tf_cpu_mode=2)#, clipnorm=1) - - self.GA_train = K.function ([real_A0, real_A0m, real_B0, real_B0m],[loss_GA], - opt().get_updates(loss_GA, weights_GA) ) - - self.GB_train = K.function ([real_A0, real_A0m, real_B0, real_B0m],[loss_GB], - opt().get_updates(loss_GB, weights_GB) ) - - - ########### - - loss_D_A = ( DLoss(real_A0_d_ones, real_A0_d ) + \ - DLoss(fake_A0_d_zeros, fake_A0_d ) ) * 0.5 - - self.DA_train = K.function ([real_A0, real_A0m, real_B0, real_B0m],[loss_D_A], - opt().get_updates(loss_D_A, self.DA.trainable_weights) ) - - ############ - - loss_D_B = ( DLoss(real_B0_d_ones, real_B0_d ) + \ - DLoss(fake_B0_d_zeros, fake_B0_d ) ) * 0.5 - - self.DB_train = K.function ([real_A0, real_A0m, real_B0, real_B0m],[loss_D_B], - opt().get_updates(loss_D_B, self.DB.trainable_weights) ) - - ############ - - - self.G_view = K.function([real_A0, real_A0m, real_B0, real_B0m],[fake_A0, rec_A0, fake_B0, rec_B0 ]) - - - - if self.is_training_mode: - f = SampleProcessor.TypeFlags - face_type = f.FACE_TYPE_FULL - - output_sample_types=[ [f.SOURCE | face_type | f.MODE_BGR, resolution], - [f.SOURCE | face_type | f.MODE_M | f.FACE_MASK_FULL, resolution], - ] - - self.set_training_data_generators ([ - SampleGeneratorFace(self.training_data_src_path, debug=self.is_debug(), batch_size=self.batch_size, - sample_process_options=SampleProcessor.Options(random_flip=self.random_flip, normalize_tanh = True), - output_sample_types=output_sample_types ), - - SampleGeneratorFace(self.training_data_dst_path, debug=self.is_debug(), batch_size=self.batch_size, - sample_process_options=SampleProcessor.Options(random_flip=self.random_flip, normalize_tanh = True), - output_sample_types=output_sample_types ) - ]) - else: - self.G_convert = K.function([real_A0, real_B0m],[fake_B0]) - - #override - def onSave(self): - self.save_weights_safe( [ - # [self.GA, 'GA.h5'], - # [self.GB, 'GB.h5'], - [self.enc, 'enc.h5'], - [self.decA, 'decA.h5'], - [self.decB, 'decB.h5'], - [self.DA, 'DA.h5'], - [self.DB, 'DB.h5'] ]) - - #override - def onTrainOneIter(self, generators_samples, generators_list): - src, srcm = generators_samples[0] - dst, dstm = generators_samples[1] - - feed = [src, srcm, dst, dstm] - - loss_GA, = self.GA_train ( feed ) - loss_GB, = self.GB_train ( feed ) - loss_DA, = self.DA_train( feed ) - loss_DB, = self.DB_train( feed ) - - return ( ('GA', loss_GA), ('GB', loss_GB), ('DA', loss_DA), ('DB', loss_DB) ) - - #override - def onGetPreview(self, sample): - test_A0 = sample[0][0][0:4] - test_A0m = sample[0][1][0:4] - - test_B0 = sample[1][0][0:4] - test_B0m = sample[1][1][0:4] - - G_view_result = self.G_view([test_A0, test_A0m, test_B0, test_B0m]) - - fake_A0, rec_A0, fake_B0, rec_B0 = [ x[0] / 2 + 0.5 for x in G_view_result] - test_A0, test_A0m, test_B0, test_B0m = [ x[0] / 2 + 0.5 for x in [test_A0, test_A0m, test_B0, test_B0m] ] - - r = np.concatenate ((np.concatenate ( (test_A0, fake_B0, rec_A0), axis=1), - np.concatenate ( (test_B0, fake_A0, rec_B0), axis=1) - ), axis=0) - - return [ ('AVATAR', r ) ] - - def predictor_func (self, avaperator_face, target_face_mask): - feed = [ avaperator_face[np.newaxis,...]*2-1, target_face_mask[np.newaxis,...]*2-1 ] - x = self.G_convert (feed)[0] - return np.clip ( x[0] / 2 + 0.5 , 0, 1) - - # #override - # def get_converter(self, **in_options): - # from models import ConverterImage - # return ConverterImage(self.predictor_func, - # predictor_input_size=self.options['resolution'], - # **in_options) - #override - def get_converter(self): - base_erode_mask_modifier = 30 - base_blur_mask_modifier = 0 - - default_erode_mask_modifier = 0 - default_blur_mask_modifier = 0 - - face_type = FaceType.FULL - - from converters import ConverterAvatar - return ConverterAvatar(self.predictor_func, - predictor_input_size=self.options['resolution']) - - @staticmethod - def ResNet(output_nc, use_batch_norm, ngf=64, n_blocks=6, use_dropout=False): - exec (nnlib.import_all(), locals(), globals()) - - if not use_batch_norm: - use_bias = True - def XNormalization(x): - return InstanceNormalization (axis=-1)(x) - else: - use_bias = False - def XNormalization(x): - return BatchNormalization (axis=-1)(x) - - XConv2D = partial(Conv2D, padding='same', use_bias=use_bias) - XConv2DTranspose = partial(Conv2DTranspose, padding='same', use_bias=use_bias) - - def func(input): - - - def ResnetBlock(dim, use_dropout=False): - def func(input): - x = input - - x = XConv2D(dim, 3, strides=1)(x) - x = XNormalization(x) - x = ReLU()(x) - - #if use_dropout: - # x = Dropout(0.5)(x) - - x = XConv2D(dim, 3, strides=1)(x) - x = XNormalization(x) - - return Add()([x,input]) - return func - - x = input - - x = XConv2D(ngf, 7, strides=1, use_bias=True)(x) - - x = ReLU()(XNormalization(XConv2D(ngf*2, 3, strides=2)(x))) - x = ReLU()(XNormalization(XConv2D(ngf*4, 3, strides=2)(x))) - - for i in range(n_blocks): - x = ResnetBlock(ngf*4, use_dropout=use_dropout)(x) - - x = ReLU()(XNormalization(XConv2DTranspose(ngf*2, 3, strides=2)(x))) - x = ReLU()(XNormalization(XConv2DTranspose(ngf , 3, strides=2)(x))) - - x = XConv2D(output_nc, 7, strides=1, activation='tanh', use_bias=True)(x) - - return x - - return func - - @staticmethod - def UNet(output_nc, use_batch_norm, ngf=64, use_dropout=False): - exec (nnlib.import_all(), locals(), globals()) - - if not use_batch_norm: - use_bias = True - def XNormalizationL(): - return InstanceNormalization (axis=-1) - else: - use_bias = False - def XNormalizationL(): - return BatchNormalization (axis=-1) - - def XNormalization(x): - return XNormalizationL()(x) - - XConv2D = partial(Conv2D, padding='same', use_bias=use_bias) - XConv2DTranspose = partial(Conv2DTranspose, padding='same', use_bias=use_bias) - - def func(input): - - b,h,w,c = K.int_shape(input) - - n_downs = get_power_of_two(w) - 4 - - Norm = XNormalizationL() - Norm2 = XNormalizationL() - Norm4 = XNormalizationL() - Norm8 = XNormalizationL() - - x = input - - x = e1 = XConv2D( ngf, 4, strides=2, use_bias=True ) (x) - - x = e2 = Norm2( XConv2D( ngf*2, 4, strides=2 )( LeakyReLU(0.2)(x) ) ) - x = e3 = Norm4( XConv2D( ngf*4, 4, strides=2 )( LeakyReLU(0.2)(x) ) ) - - l = [] - for i in range(n_downs): - x = Norm8( XConv2D( ngf*8, 4, strides=2 )( LeakyReLU(0.2)(x) ) ) - l += [x] - - x = XConv2D( ngf*8, 4, strides=2, use_bias=True )( LeakyReLU(0.2)(x) ) - - for i in range(n_downs): - x = Norm8( XConv2DTranspose( ngf*8, 4, strides=2 )( ReLU()(x) ) ) - if i <= n_downs-2: - x = Dropout(0.5)(x) - x = Concatenate(axis=-1)([x, l[-i-1] ]) - - x = Norm4( XConv2DTranspose( ngf*4, 4, strides=2 )( ReLU()(x) ) ) - x = Concatenate(axis=-1)([x, e3]) - - x = Norm2( XConv2DTranspose( ngf*2, 4, strides=2 )( ReLU()(x) ) ) - x = Concatenate(axis=-1)([x, e2]) - - x = Norm( XConv2DTranspose( ngf, 4, strides=2 )( ReLU()(x) ) ) - x = Concatenate(axis=-1)([x, e1]) - - x = XConv2DTranspose(output_nc, 4, strides=2, activation='tanh', use_bias=True)( ReLU()(x) ) - - return x - return func - nnlib.UNet = UNet - - @staticmethod - def UNetTemporalPredictor(output_nc, use_batch_norm, ngf=64, use_dropout=False): - exec (nnlib.import_all(), locals(), globals()) - def func(inputs): - past_2_image_tensor, past_1_image_tensor = inputs - - x = Concatenate(axis=-1)([ past_2_image_tensor, past_1_image_tensor ]) - x = UNet(3, use_batch_norm, ngf=ngf, use_dropout=use_dropout) (x) - - return x - - return func - - @staticmethod - def PatchDiscriminator(ndf=64): - exec (nnlib.import_all(), locals(), globals()) - - #use_bias = True - #def XNormalization(x): - # return InstanceNormalization (axis=-1)(x) - use_bias = False - def XNormalization(x): - return BatchNormalization (axis=-1)(x) - - XConv2D = partial(Conv2D, use_bias=use_bias) - - def func(input): - b,h,w,c = K.int_shape(input) - - x = input - - x = ZeroPadding2D((1,1))(x) - x = XConv2D( ndf, 4, strides=2, padding='valid', use_bias=True)(x) - x = LeakyReLU(0.2)(x) - - x = ZeroPadding2D((1,1))(x) - x = XConv2D( ndf*2, 4, strides=2, padding='valid')(x) - x = XNormalization(x) - x = LeakyReLU(0.2)(x) - - x = ZeroPadding2D((1,1))(x) - x = XConv2D( ndf*4, 4, strides=2, padding='valid')(x) - x = XNormalization(x) - x = LeakyReLU(0.2)(x) - - x = ZeroPadding2D((1,1))(x) - x = XConv2D( ndf*8, 4, strides=2, padding='valid')(x) - x = XNormalization(x) - x = LeakyReLU(0.2)(x) - - x = ZeroPadding2D((1,1))(x) - x = XConv2D( ndf*8, 4, strides=2, padding='valid')(x) - x = XNormalization(x) - x = LeakyReLU(0.2)(x) - - x = ZeroPadding2D((1,1))(x) - return XConv2D( 1, 4, strides=1, padding='valid', use_bias=True, activation='sigmoid')(x)# - return func - - @staticmethod - def NLayerDiscriminator(ndf=64, n_layers=3): - exec (nnlib.import_all(), locals(), globals()) - - #use_bias = True - #def XNormalization(x): - # return InstanceNormalization (axis=-1)(x) - use_bias = False - def XNormalization(x): - return BatchNormalization (axis=-1)(x) - - XConv2D = partial(Conv2D, use_bias=use_bias) - - def func(input): - b,h,w,c = K.int_shape(input) - - x = input - - f = ndf - - x = ZeroPadding2D((1,1))(x) - x = XConv2D( f, 4, strides=2, padding='valid', use_bias=True)(x) - f = min( ndf*8, f*2 ) - x = LeakyReLU(0.2)(x) - - for i in range(n_layers): - x = ZeroPadding2D((1,1))(x) - x = XConv2D( f, 4, strides=2, padding='valid')(x) - f = min( ndf*8, f*2 ) - x = XNormalization(x) - x = Dropout(0.5)(x) - x = LeakyReLU(0.2)(x) - - x = ZeroPadding2D((1,1))(x) - x = XConv2D( f, 4, strides=1, padding='valid')(x) - x = XNormalization(x) - x = LeakyReLU(0.2)(x) - - x = ZeroPadding2D((1,1))(x) - return XConv2D( 1, 4, strides=1, padding='valid', use_bias=True, activation='sigmoid')(x)# - return func - - @staticmethod - def DFEncFlow(padding='zero', **kwargs): - exec (nnlib.import_all(), locals(), globals()) - - use_bias = False - def XNormalization(x): - return BatchNormalization (axis=-1)(x) - XConv2D = partial(Conv2D, padding=padding, use_bias=use_bias) - - def Act(lrelu_alpha=0.1): - return LeakyReLU(alpha=lrelu_alpha) - - def downscale (dim, **kwargs): - def func(x): - return Act() ( XNormalization(XConv2D(dim, kernel_size=5, strides=2)(x)) ) - return func - - def upscale (dim, **kwargs): - def func(x): - return SubpixelUpscaler()(Act()( XNormalization(XConv2D(dim * 4, kernel_size=3, strides=1)(x)))) - return func - - upscale = partial(upscale) - downscale = partial(downscale) - - - def func(input): - b,h,w,c = K.int_shape(input) - lowest_dense_res = w // 16 - - x = input - - dims = 64 - x = downscale(dims)(x) - x = downscale(dims*2)(x) - x = downscale(dims*4)(x) - x = downscale(dims*8)(x) - - x = Dense(256)(Flatten()(x)) - x = Dense(lowest_dense_res * lowest_dense_res * 256)(x) - x = Reshape((lowest_dense_res, lowest_dense_res, 256))(x) - x = upscale(256)(x) - - return x - return func - - @staticmethod - def DFDecFlow(output_nc, padding='zero', **kwargs): - exec (nnlib.import_all(), locals(), globals()) - - use_bias = False - def XNormalization(x): - return BatchNormalization (axis=-1)(x) - XConv2D = partial(Conv2D, padding=padding, use_bias=use_bias) - - def Act(lrelu_alpha=0.1): - return LeakyReLU(alpha=lrelu_alpha) - - def downscale (dim, **kwargs): - def func(x): - return Act() ( XNormalization(XConv2D(dim, kernel_size=5, strides=2)(x)) ) - return func - - def upscale (dim, **kwargs): - def func(x): - return SubpixelUpscaler()(Act()( XNormalization(XConv2D(dim * 4, kernel_size=3, strides=1)(x)))) - return func - - def to_bgr (output_nc, **kwargs): - def func(x): - return XConv2D(output_nc, kernel_size=5, use_bias=True, activation='tanh')(x) - return func - - upscale = partial(upscale) - downscale = partial(downscale) - to_bgr = partial(to_bgr) - - dims = 64 - - def func(input): - x = input[0] - - x1 = upscale(dims*8)( x ) - x2 = upscale(dims*4)( x1 ) - x3 = upscale(dims*2)( x2 ) - - return to_bgr(output_nc) ( x3 ) - return func - -Model = AVATARModel diff --git a/models/Model_AVATAR/__init__.py b/models/Model_AVATAR/__init__.py deleted file mode 100644 index cdb3fe7..0000000 --- a/models/Model_AVATAR/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .Model import Model \ No newline at end of file diff --git a/models/archived_models.zip b/models/archived_models.zip index 0829194024a8889fed894186c203a11c7cb6e871..15e923e783b604683cf9a6ee1b0012c2767fe07c 100644 GIT binary patch delta 15165 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 b+r58F1!)M#e-_Z~@59am08Hb8{_XuAhUW7j delta 38 qcmbQWj