|
from configuration import DatasetName, DatasetType, W300Conf, InputDataSize, LearningConfig |
|
import tensorflow as tf |
|
from tensorflow import keras |
|
from keras.regularizers import l2, l1 |
|
|
|
from keras.models import Model |
|
from keras.applications import mobilenet_v2 |
|
from keras.layers import Dense, MaxPooling2D, Conv2D, Flatten, \ |
|
BatchNormalization, GlobalAveragePooling2D, Dropout |
|
|
|
|
|
class CNNModel: |
|
def get_model(self, arch, output_len): |
|
|
|
if arch == 'ASMNet': |
|
model = self.create_ASMNet(inp_shape=[224, 224, 3], output_len=output_len) |
|
|
|
elif arch == 'mobileNetV2': |
|
model = self.create_mobileNet(inp_shape=[224, 224, 3], output_len=output_len) |
|
|
|
return model |
|
|
|
def create_mobileNet(self, output_len, inp_shape): |
|
mobilenet_model = mobilenet_v2.MobileNetV2(input_shape=inp_shape, |
|
alpha=1.0, |
|
include_top=True, |
|
weights=None, |
|
pooling=None) |
|
mobilenet_model.layers.pop() |
|
|
|
x = mobilenet_model.get_layer('global_average_pooling2d_1').output |
|
out_landmarks = Dense(output_len, name='O_L')(x) |
|
out_poses = Dense(LearningConfig.pose_len, name='O_P')(x) |
|
|
|
inp = mobilenet_model.input |
|
revised_model = Model(inp, [out_landmarks, out_poses]) |
|
revised_model.summary() |
|
return revised_model |
|
|
|
def create_ASMNet(self, output_len, inp_tensor=None, inp_shape=None): |
|
mobilenet_model = mobilenet_v2.MobileNetV2(input_shape=inp_shape, |
|
alpha=1.0, |
|
include_top=True, |
|
weights=None, |
|
input_tensor=inp_tensor, |
|
pooling=None) |
|
mobilenet_model.layers.pop() |
|
inp = mobilenet_model.input |
|
|
|
'''heatmap can not be generated from activation layers, so we use out_relu''' |
|
block_1_project_BN = mobilenet_model.get_layer('block_1_project_BN').output |
|
block_1_project_BN_mpool = GlobalAveragePooling2D()(block_1_project_BN) |
|
|
|
block_3_project_BN = mobilenet_model.get_layer('block_3_project_BN').output |
|
block_3_project_BN_mpool = GlobalAveragePooling2D()(block_3_project_BN) |
|
|
|
block_6_project_BN = mobilenet_model.get_layer('block_6_project_BN').output |
|
block_6_project_BN_mpool = GlobalAveragePooling2D()(block_6_project_BN) |
|
|
|
block_10_project_BN = mobilenet_model.get_layer('block_10_project_BN').output |
|
block_10_project_BN_mpool = GlobalAveragePooling2D()(block_10_project_BN) |
|
|
|
block_13_project_BN = mobilenet_model.get_layer('block_13_project_BN').output |
|
block_13_project_BN_mpool = GlobalAveragePooling2D()(block_13_project_BN) |
|
|
|
block_15_add = mobilenet_model.get_layer('block_15_add').output |
|
block_15_add_mpool = GlobalAveragePooling2D()(block_15_add) |
|
|
|
x = keras.layers.Concatenate()([block_1_project_BN_mpool, block_3_project_BN_mpool, block_6_project_BN_mpool, |
|
block_10_project_BN_mpool, block_13_project_BN_mpool, block_15_add_mpool]) |
|
x = keras.layers.Dropout(rate=0.3)(x) |
|
'''''' |
|
out_landmarks = Dense(output_len, |
|
kernel_regularizer=l2(0.01), |
|
bias_regularizer=l2(0.01), |
|
name='O_L')(x) |
|
out_poses = Dense(LearningConfig.pose_len, |
|
kernel_regularizer=l2(0.01), |
|
bias_regularizer=l2(0.01), |
|
name='O_P')(x) |
|
|
|
revised_model = Model(inp, [out_landmarks, out_poses]) |
|
|
|
revised_model.summary() |
|
model_json = revised_model.to_json() |
|
|
|
with open("ASMNet.json", "w") as json_file: |
|
json_file.write(model_json) |
|
|
|
return revised_model |