-
Notifications
You must be signed in to change notification settings - Fork 182
/
model.py
143 lines (122 loc) · 4.77 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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
"""This module provides the function to build the network."""
import tensorflow as tf
from tensorflow import keras
def build_landmark_model(input_shape, output_size):
"""Build the convolutional network model with Keras Functional API.
Args:
input_shape: the shape of the input image, without batch size.
output_size: the number of output node, usually equals to the number of
marks times 2 (in 2d space).
Returns:
a Keras model, not compiled.
"""
# The model is composed of multiple layers.
# Preprocessing layers.
preprocess = keras.layers.experimental.preprocessing.Normalization()
# Convolutional layers.
conv_1 = keras.layers.Conv2D(filters=32,
kernel_size=(3, 3),
activation='relu')
conv_2 = keras.layers.Conv2D(filters=64,
kernel_size=(3, 3),
strides=(1, 1),
padding='valid',
activation='relu')
conv_3 = keras.layers.Conv2D(filters=64,
kernel_size=(3, 3),
strides=(1, 1),
padding='valid',
activation='relu')
conv_4 = keras.layers.Conv2D(filters=64,
kernel_size=(3, 3),
strides=(1, 1),
padding='valid',
activation='relu')
conv_5 = keras.layers.Conv2D(filters=64,
kernel_size=[3, 3],
strides=(1, 1),
padding='valid',
activation='relu')
conv_6 = keras.layers.Conv2D(filters=128,
kernel_size=(3, 3),
strides=(1, 1),
padding='valid',
activation='relu')
conv_7 = keras.layers.Conv2D(filters=128,
kernel_size=[3, 3],
strides=(1, 1),
padding='valid',
activation='relu')
conv_8 = keras.layers.Conv2D(filters=256,
kernel_size=[3, 3],
strides=(1, 1),
padding='valid',
activation='relu')
# Pooling layers.
pool_1 = keras.layers.MaxPool2D(pool_size=(2, 2),
strides=(2, 2),
padding='valid')
pool_2 = keras.layers.MaxPool2D(pool_size=(2, 2),
strides=(2, 2),
padding='valid')
pool_3 = keras.layers.MaxPool2D(pool_size=(2, 2),
strides=(2, 2),
padding='valid')
pool_4 = keras.layers.MaxPool2D(pool_size=[2, 2],
strides=(1, 1),
padding='valid')
# Dense layers.
dense_1 = keras.layers.Dense(units=1024,
activation='relu',
use_bias=True)
dense_2 = keras.layers.Dense(units=output_size,
activation=None,
use_bias=True)
# Batch norm layers
bn_1 = keras.layers.BatchNormalization()
bn_2 = keras.layers.BatchNormalization()
bn_3 = keras.layers.BatchNormalization()
bn_4 = keras.layers.BatchNormalization()
bn_5 = keras.layers.BatchNormalization()
bn_6 = keras.layers.BatchNormalization()
bn_7 = keras.layers.BatchNormalization()
bn_8 = keras.layers.BatchNormalization()
bn_9 = keras.layers.BatchNormalization()
# Flatten layers.
flatten_1 = keras.layers.Flatten()
# All layers got. Define the forward propgation.
inputs = keras.Input(shape=input_shape, name="image_input")
# Preprocess the inputs.
x = preprocess(inputs)
# |== Layer 1 ==|
x = conv_1(x)
x = bn_1(x)
x = pool_1(x)
# |== Layer 2 ==|
x = conv_2(x)
x = bn_2(x)
x = conv_3(x)
x = bn_3(x)
x = pool_2(x)
# |== Layer 3 ==|
x = conv_4(x)
x = bn_4(x)
x = conv_5(x)
x = bn_5(x)
x = pool_3(x)
# |== Layer 4 ==|
x = conv_6(x)
x = bn_6(x)
x = conv_7(x)
x = bn_7(x)
x = pool_4(x)
# |== Layer 5 ==|
x = conv_8(x)
x = bn_8(x)
# |== Layer 6 ==|
x = flatten_1(x)
x = dense_1(x)
x = bn_9(x)
outputs = dense_2(x)
# Return the model
return keras.Model(inputs=inputs, outputs=outputs, name="landmark")