-
Notifications
You must be signed in to change notification settings - Fork 0
/
model.py
61 lines (49 loc) · 2.38 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
from keras.layers import Input, Conv2D, MaxPooling2D, Add, Dense, Lambda, Activation, SeparableConv2D, \
ReLU, GlobalAveragePooling2D
from keras.models import Model
from keras.layers import add
import tensorflow as tf
def create_embedding_model(input_shape):
input_img = Input(shape=input_shape)
x = Conv2D(32, (3, 3), strides=(2, 2), activation='relu')(input_img)
x = Conv2D(64, (3, 3), activation='relu')(x)
residual = Conv2D(128, (1, 1), strides=(2, 2))(x)
x = SeparableConv2D(128, (3, 3), activation='relu', padding='same')(x)
x = SeparableConv2D(128, (3, 3), padding='same')(x)
x = MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x)
x = add([x, residual])
residual = Conv2D(256, (1, 1), strides=(2, 2))(x)
x = ReLU()(x)
x = SeparableConv2D(256, (3, 3), activation='relu', padding='same')(x)
x = SeparableConv2D(256, (3, 3), padding='same')(x)
x = MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x)
x = add([x, residual])
residual = Conv2D(728, (1, 1), strides=(2, 2))(x)
x = ReLU()(x)
x = SeparableConv2D(728, (3, 3), activation='relu', padding='same')(x)
x = SeparableConv2D(728, (3, 3), padding='same')(x)
x = MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x)
x = add([x, residual])
# Middle Flow
for _ in range(8):
residual = x
x = ReLU()(x)
x = SeparableConv2D(728, (3, 3), activation='relu', padding='same')(x)
x = SeparableConv2D(728, (3, 3), activation='relu', padding='same')(x)
x = SeparableConv2D(728, (3, 3), padding='same')(x)
x = add([x, residual])
# Exit Flow
residual = Conv2D(1024, (1, 1), strides=(2, 2))(x)
x = ReLU()(x)
x = SeparableConv2D(728, (3, 3), activation='relu', padding='same')(x)
x = SeparableConv2D(1024, (3, 3), padding='same')(x)
x = MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x)
x = add([x, residual])
x = SeparableConv2D(1536, (3, 3), activation='relu', padding='same')(x)
x = SeparableConv2D(2048, (3, 3), activation='relu', padding='same')(x)
x = GlobalAveragePooling2D()(x)
template_output = Dense(128, activation='relu', name='template_output')(x)
# L2 Normalization
normalized_template = Lambda(lambda x: tf.math.l2_normalize(x, axis=-1), name='normalized_template')(
template_output)
return Model(inputs=input_img, outputs=normalized_template)