from all_models_tools.all_model_tools import attention_block
from keras.activations import softmax, sigmoid
from keras.applications import VGG16,VGG19, ResNet50, ResNet50V2, ResNet101, ResNet101V2, ResNet152, ResNet152V2, InceptionV3, InceptionResNetV2, MobileNet, MobileNetV2, DenseNet121, NASNetLarge, Xception 
from keras.layers import GlobalAveragePooling2D, Dense, Flatten
from keras import regularizers
from keras.layers import Add
from application.Xception_indepentment import Xception_indepentment   

def Original_VGG19_Model():
    vgg19 = VGG19(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(vgg19.output)
    dense = Dense(units = 4096, activation = "relu")(GAP)
    dense = Dense(units = 4096, activation = "relu")(dense)
    output = Dense(units = 2, activation = "softmax")(dense)

    return vgg19.input, output

def Original_ResNet50_model():
    xception = ResNet50(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(xception.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return xception.input, dense

def Original_NASNetLarge_model():
    nasnetlarge = NASNetLarge(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(nasnetlarge.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return nasnetlarge.input, dense

def Original_DenseNet121_model():
    Densenet201 = DenseNet121(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(Densenet201.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return Densenet201.input, dense

def Original_Xception_model():
    xception = Xception(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(xception.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return xception.input, dense

def Original_VGG16_Model():
    vgg16 = VGG16(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    flatten = Flatten()(vgg16.output)
    dense = Dense(units = 4096, activation = "relu")(flatten)
    dense = Dense(units = 4096, activation = "relu")(dense)
    output = Dense(units = 2, activation = "softmax")(dense)

    return vgg16.input, output

def Original_ResNet50v2_model():
    resnet50v2 = ResNet50V2(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(resnet50v2.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return resnet50v2.input, dense

def Original_ResNet101_model():
    resnet101 = ResNet101(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(resnet101.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return resnet101.input, dense

def Original_ResNet101V2_model():
    resnet101v2 = ResNet101V2(include_top = False, weights = "imagenet", input_shape = (512, 512, 3))
    GAP = GlobalAveragePooling2D()(resnet101v2.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return resnet101v2.input, dense

def Original_ResNet152_model():
    resnet152 = ResNet152(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(resnet152.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return resnet152.input, dense

def Original_ResNet152V2_model():
    resnet152v2 = ResNet152V2(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(resnet152v2.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return resnet152v2.input, dense

def Original_InceptionV3_model():
    inceptionv3 = InceptionV3(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(inceptionv3.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return inceptionv3.input, dense

def Original_InceptionResNetV2_model():
    inceptionResnetv2 = InceptionResNetV2(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(inceptionResnetv2.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return inceptionResnetv2.input, dense

def Original_MobileNet_model():
    mobilenet = MobileNet(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(mobilenet.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return mobilenet.input, dense

def Original_MobileNetV2_model():
    mobilenetv2 = MobileNetV2(include_top = False, weights = "imagenet", input_shape = (200, 200, 3))
    GAP = GlobalAveragePooling2D()(mobilenetv2.output)
    dense = Dense(units = 2, activation = "softmax")(GAP)

    return mobilenetv2.input, dense