This repository has been archived by the owner on Dec 21, 2023. It is now read-only.
forked from DerWaldi/youtube-video-face-swap
-
Notifications
You must be signed in to change notification settings - Fork 0
/
model.py
70 lines (56 loc) · 1.94 KB
/
model.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# obtained from here https://github.com/deepfakes/faceswap
from keras.models import Model
from keras.layers import Input, Dense, Flatten, Reshape
from keras.layers.advanced_activations import LeakyReLU
from keras.layers.convolutional import Conv2D
from keras.optimizers import Adam
from keras.utils import multi_gpu_model
import tensorflow as tf
from pixel_shuffler import PixelShuffler
optimizer = Adam( lr=5e-5, beta_1=0.5, beta_2=0.999 )
IMAGE_SHAPE = (64,64,3)
ENCODER_DIM = 1024
def conv( filters ):
def block(x):
x = Conv2D( filters, kernel_size=5, strides=2, padding='same' )(x)
x = LeakyReLU(0.1)(x)
return x
return block
def upscale( filters ):
def block(x):
x = Conv2D( filters*4, kernel_size=3, padding='same' )(x)
x = LeakyReLU(0.1)(x)
x = PixelShuffler()(x)
return x
return block
def Encoder():
input_ = Input( shape=IMAGE_SHAPE )
x = input_
x = conv( 128)(x)
x = conv( 256)(x)
x = conv( 512)(x)
x = conv(1024)(x)
x = Dense( ENCODER_DIM )( Flatten()(x) )
x = Dense(4*4*1024)(x)
x = Reshape((4,4,1024))(x)
x = upscale(512)(x)
return Model( input_, x )
def Decoder():
input_ = Input( shape=(8,8,512) )
x = input_
x = upscale(256)(x)
x = upscale(128)(x)
x = upscale( 64)(x)
x = Conv2D( 3, kernel_size=5, padding='same', activation='sigmoid' )(x)
return Model( input_, x )
encoder = Encoder()
decoder_A = Decoder()
decoder_B = Decoder()
x = Input( shape=IMAGE_SHAPE )
autoencoder_A = Model( x, decoder_A( encoder(x) ) )
autoencoder_B = Model( x, decoder_B( encoder(x) ) )
# Optional multi-GPU support
autoencoder_A = multi_gpu_model( autoencoder_A ,3)
autoencoder_B = multi_gpu_model( autoencoder_B ,3)
autoencoder_A.compile( optimizer=optimizer, loss='mean_absolute_error' )
autoencoder_B.compile( optimizer=optimizer, loss='mean_absolute_error' )