| 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 |