|
from configuration import DatasetName, DatasetType, \ |
|
D300wConf, InputDataSize, LearningConfig |
|
|
|
import tensorflow as tf |
|
|
|
|
|
from tensorflow import keras |
|
from skimage.transform import resize |
|
from keras.regularizers import l2 |
|
|
|
|
|
from tensorflow.keras.models import Model |
|
from tensorflow.keras.applications import mobilenet_v2, mobilenet, resnet50, densenet |
|
|
|
from tensorflow.keras.layers import Dense, MaxPooling2D, Conv2D, Flatten, \ |
|
BatchNormalization, Activation, GlobalAveragePooling2D, DepthwiseConv2D, Dropout, ReLU, Concatenate, Input, Conv2DTranspose |
|
|
|
from keras.callbacks import ModelCheckpoint |
|
from keras import backend as K |
|
|
|
from keras.optimizers import Adam |
|
import numpy as np |
|
import matplotlib.pyplot as plt |
|
import math |
|
from keras.callbacks import CSVLogger |
|
from datetime import datetime |
|
|
|
import cv2 |
|
import os.path |
|
from keras.utils.vis_utils import plot_model |
|
from scipy.spatial import distance |
|
import scipy.io as sio |
|
|
|
import efficientnet.tfkeras as efn |
|
|
|
|
|
class CNNModel: |
|
def get_model(self, arch, input_tensor, output_len, |
|
inp_shape=[InputDataSize.image_input_size, InputDataSize.image_input_size, 3], |
|
weight_path=None): |
|
if arch == 'efficientNet': |
|
model = self.create_efficientNet(inp_shape=inp_shape, input_tensor=input_tensor, output_len=output_len) |
|
elif arch == 'mobileNetV2': |
|
model = self.create_MobileNet(inp_shape=inp_shape, inp_tensor=input_tensor) |
|
return model |
|
|
|
def create_MobileNet(self, inp_shape, inp_tensor): |
|
|
|
mobilenet_model = mobilenet_v2.MobileNetV2(input_shape=inp_shape, |
|
alpha=1.0, |
|
include_top=True, |
|
weights=None, |
|
input_tensor=inp_tensor, |
|
pooling=None) |
|
|
|
inp = mobilenet_model.input |
|
out_landmarks = mobilenet_model.get_layer('O_L').output |
|
revised_model = Model(inp, [out_landmarks]) |
|
model_json = revised_model.to_json() |
|
with open("mobileNet_v2_stu.json", "w") as json_file: |
|
json_file.write(model_json) |
|
return revised_model |
|
|
|
def create_efficientNet(self, inp_shape, input_tensor, output_len, is_teacher=True): |
|
if is_teacher: |
|
eff_net = efn.EfficientNetB3(include_top=True, |
|
weights=None, |
|
input_tensor=None, |
|
input_shape=[InputDataSize.image_input_size, InputDataSize.image_input_size, |
|
3], |
|
pooling=None, |
|
classes=output_len) |
|
else: |
|
eff_net = efn.EfficientNetB0(include_top=True, |
|
weights=None, |
|
input_tensor=None, |
|
input_shape=inp_shape, |
|
pooling=None, |
|
classes=output_len) |
|
|
|
eff_net.layers.pop() |
|
inp = eff_net.input |
|
|
|
x = eff_net.get_layer('top_activation').output |
|
x = GlobalAveragePooling2D()(x) |
|
x = keras.layers.Dropout(rate=0.5)(x) |
|
output = Dense(output_len, activation='linear', name='out')(x) |
|
|
|
eff_net = Model(inp, output) |
|
|
|
eff_net.summary() |
|
|
|
return eff_net |
|
|
|
|