"""Modelli per il progetto CAE"""
import logging
from keras.layers import (
Conv2D,
Conv2DTranspose,
Dense,
Dropout,
Flatten,
Input,
MaxPooling2D,
UpSampling2D,
)
from keras.layers.experimental.preprocessing import Resizing
from keras.layers.merge import concatenate
from keras.models import Model
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(levelname)s:%(name)s:%(message)s")
file_handler = logging.FileHandler("Models.log")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
[docs]def make_model_rad_regulizer(
shape_tensor=(124, 124, 1), feature_dim=(3,)
): # pylint: disable=R0915
"""Modello CAE tratto da Liu et al, ma modificato con dropout, maxpooling e upsampling.
Permette inoltre la classificazione delle masse grazie a layer fc.
:type shape_tensor: tuple
:param shape_tensor: dimensione dell'immagine in ingresso
:type feature_dim: tuple
:param feature_dim: dimensione dell'array delle feature
:returns: restituisce il modello
:rtype: keras model
"""
input_tensor = Input(shape=shape_tensor, name="tensor_input")
logger.debug(f"dimensione input immagine:{shape_tensor}") # pylint: disable=W1203
input_vector = Input(shape=feature_dim)
logger.debug(f"dimensione input feature:{feature_dim}") # pylint: disable=W1203
x = Conv2D(32, (5, 5), strides=2, padding="same", activation="relu")(input_tensor)
x = Dropout(
0.2,
)(x)
x = MaxPooling2D((2, 2), strides=(2, 2), padding="same")(x)
x = Conv2D(64, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Dropout(
0.2,
)(x)
x = Conv2D(
128, (3, 3), strides=2, padding="same", activation="relu", name="last_conv"
)(x)
flat = Flatten()(x)
flat = concatenate([flat, input_vector])
den = Dense(16, activation="relu")(flat)
# den= Dropout(.1,)(den)
classification_output = Dense(
2, activation="sigmoid", name="classification_output"
)(den)
x = Conv2DTranspose(64, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Dropout(
0.2,
)(x)
x = UpSampling2D((2, 2))(x)
x = Conv2DTranspose(32, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Conv2DTranspose(32, (3, 3), strides=2, padding="same", activation="relu")(x)
decoder_out = Conv2D(
1, (5, 5), padding="valid", activation="sigmoid", name="decoder_output"
)(x)
model = Model([input_tensor, input_vector], [decoder_out, classification_output])
return model
[docs]def make_model_rad(
shape_tensor=(124, 124, 1), feature_dim=(3,)
): # pylint: disable=R0915
"""Modello CAE tratto da Liu et al.
Permette inoltre la classificazione delle masse grazie a layer fc.
:type shape_tensor: tuple
:param shape_tensor: dimensione dell'immagine in ingresso
:type feature_dim: tuple
:param feature_dim: dimensione dell'array delle feature
:returns: restituisce il modello
:rtype: keras model
"""
input_tensor = Input(shape=shape_tensor, name="tensor_input")
logger.debug(f"dimensione input immagine:{shape_tensor}") # pylint: disable=W1203
input_vector = Input(shape=feature_dim)
logger.debug(f"dimensione input feature:{feature_dim}") # pylint: disable=W1203
x = Conv2D(32, (5, 5), strides=2, padding="same", activation="relu")(input_tensor)
x = Conv2D(64, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Conv2D(
128, (3, 3), strides=2, padding="same", activation="relu", name="last_conv"
)(x)
flat = Flatten()(x)
flat = concatenate([flat, input_vector])
den = Dense(16, activation="relu")(flat)
classification_output = Dense(
2, activation="sigmoid", name="classification_output"
)(den)
x = Conv2DTranspose(64, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Conv2DTranspose(32, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Conv2DTranspose(32, (3, 3), strides=2, padding="same", activation="relu")(x)
decoder_out = Conv2D(
1, (5, 5), padding="valid", activation="sigmoid", name="decoder_output"
)(x)
model = Model([input_tensor, input_vector], [decoder_out, classification_output])
return model
[docs]def make_model_rad_unet(
shape_tensor=(124, 124, 1), feature_dim=(3,)
): # pylint: disable=R0915
"""Modello UNET modificato con layer di resize.
Permette inoltre la classificazione delle masse grazie a layer fc
:type shape_tensor: tuple
:param shape_tensor: dimensione dell'immagine in ingresso
:type feature_dim: tuple
:param feature_dim: dimensione dell'array delle feature
:returns: restituisce il modello
:rtype: keras model
"""
input_tensor = Input(shape=shape_tensor, name="tensor_input")
logger.debug(f"dimensione input immagine:{shape_tensor}") # pylint: disable=W1203
input_vector = Input(shape=feature_dim)
logger.debug(f"dimensione input feature:{feature_dim}") # pylint: disable=W1203
c1 = Conv2D(16, (3, 3), activation="relu", padding="same")(input_tensor)
c1 = Dropout(0.2)(c1)
c1 = Conv2D(16, (3, 3), activation="relu", padding="same")(c1)
p1 = MaxPooling2D((2, 2))(c1)
c2 = Conv2D(32, (3, 3), activation="relu", padding="same")(p1)
c2 = Dropout(0.1)(c2)
c2 = Conv2D(32, (3, 3), activation="relu", padding="same")(c2)
p2 = MaxPooling2D((2, 2))(c2)
p2 = Resizing(32, 32, interpolation="nearest")(p2)
c3 = Conv2D(64, (3, 3), activation="relu", padding="same")(p2)
c3 = Dropout(0.2)(c3)
c3 = Conv2D(64, (3, 3), activation="relu", padding="same")(c3)
p3 = MaxPooling2D((2, 2))(c3)
p3 = Resizing(16, 16, interpolation="nearest")(p3)
c4 = Conv2D(128, (3, 3), activation="relu", padding="same")(p3)
c4 = Dropout(0.2)(c4)
c4 = Conv2D(128, (3, 3), activation="relu", padding="same")(c4)
p4 = MaxPooling2D((2, 2))(c4)
c5 = Conv2D(256, (3, 3), activation="relu", padding="same")(p4)
c5 = Dropout(0.2)(c5)
c5 = Conv2D(
256,
(3, 3),
activation="relu",
padding="same",
name="last_conv",
)(c5)
# fc layers
flat = Flatten()(c5)
flat = concatenate([flat, input_vector])
den = Dense(16, activation="relu")(flat)
classification_output = Dense(
2, activation="sigmoid", name="classification_output"
)(den)
u6 = Conv2DTranspose(128, (2, 2), strides=(2, 2), padding="same")(c5)
u6 = concatenate([u6, c4])
c6 = Conv2D(128, (3, 3), activation="relu", padding="same")(u6)
c6 = Dropout(0.2)(c6)
c6 = Conv2D(128, (3, 3), activation="relu", padding="same")(c6)
u7 = Conv2DTranspose(64, (2, 2), strides=(2, 2), padding="same")(c6)
u7 = concatenate([u7, c3])
c7 = Conv2D(64, (3, 3), activation="relu", padding="same")(u7)
c7 = Dropout(0.2)(c7)
c7 = Conv2D(64, (3, 3), activation="relu", padding="same")(c7)
u8 = Conv2DTranspose(32, (2, 2), strides=(2, 2), padding="same")(c7)
u8 = Resizing(62, 62, interpolation="nearest")(c2)
u8 = concatenate([u8, c2])
c8 = Conv2D(32, (3, 3), activation="relu", padding="same")(u8)
c8 = Dropout(0.2)(c8)
c8 = Conv2D(32, (3, 3), activation="relu", padding="same")(c8)
u9 = Conv2DTranspose(16, (2, 2), strides=(2, 2), padding="same")(c8)
u9 = concatenate([u9, c1], axis=3)
c9 = Conv2D(16, (3, 3), activation="relu", padding="same")(u9)
c9 = Dropout(0.2)(c9)
c9 = Conv2D(16, (3, 3), activation="relu", padding="same")(c9)
decoder_out = Conv2D(1, (1, 1), activation="sigmoid", name="decoder_output")(c9)
model = Model([input_tensor, input_vector], [decoder_out, classification_output])
return model
[docs]def make_model(shape_tensor=(124, 124, 1)): # pylint: disable=R0915
"""Modello CAE tratto da Liu et al.
Permette inoltre la classificazione delle masse grazie a layer fc.
:type shape_tensor: tuple
:param shape_tensor: dimensione dell'immagine in ingresso
:returns: restituisce il modello
:rtype: keras model
"""
input_tensor = Input(shape=shape_tensor, name="tensor_input")
logger.debug(f"dimensione input immagine:{shape_tensor}") # pylint: disable=W1203
x = Conv2D(32, (5, 5), strides=2, padding="same", activation="relu")(input_tensor)
x = Conv2D(64, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Conv2D(
128, (3, 3), strides=2, padding="same", activation="relu", name="last_conv"
)(x)
flat = Flatten()(x)
den = Dense(16, activation="relu")(flat)
classification_output = Dense(
2, activation="sigmoid", name="classification_output"
)(den)
x = Conv2DTranspose(64, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Conv2DTranspose(32, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Conv2DTranspose(32, (3, 3), strides=2, padding="same", activation="relu")(x)
decoder_out = Conv2D(
1, (5, 5), padding="valid", activation="sigmoid", name="decoder_output"
)(x)
model = Model(input_tensor, [decoder_out, classification_output])
return model
[docs]def make_model_regulizer(shape_tensor=(124, 124, 1)): # pylint: disable=R0915
"""Modello CAE tratto da Liu et al, ma modificato con dropout, maxpooling e upsampling.
Permette inoltre la classificazione delle masse grazie a layer fc.
:type shape_tensor: tuple
:param shape_tensor: dimensione dell'immagine in ingresso
:returns: restituisce il modello
:rtype: keras model
"""
input_tensor = Input(shape=shape_tensor, name="tensor_input")
logger.debug(f"dimensione input immagine:{shape_tensor}") # pylint: disable=W1203
x = Conv2D(32, (5, 5), strides=2, padding="same", activation="relu")(input_tensor)
x = Dropout(
0.2,
)(x)
x = MaxPooling2D((2, 2), strides=(2, 2), padding="same")(x)
x = Conv2D(64, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Dropout(
0.2,
)(x)
x = Conv2D(
128, (3, 3), strides=2, padding="same", activation="relu", name="last_conv"
)(x)
flat = Flatten()(x)
den = Dense(16, activation="relu")(flat)
classification_output = Dense(
2, activation="sigmoid", name="classification_output"
)(den)
x = Conv2DTranspose(64, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Dropout(
0.2,
)(x)
x = UpSampling2D((2, 2))(x)
x = Conv2DTranspose(32, (3, 3), strides=2, padding="same", activation="relu")(x)
x = Conv2DTranspose(32, (3, 3), strides=2, padding="same", activation="relu")(x)
decoder_out = Conv2D(
1, (5, 5), padding="valid", activation="sigmoid", name="decoder_output"
)(x)
model = Model(input_tensor, [decoder_out, classification_output])
return model
[docs]def make_model_unet(shape_tensor=(124, 124, 1)): # pylint: disable=R0915
"""Modello Unet modificato con layer di resize.
Permette inoltre la classificazione delle masse grazie a layer fc.
:type shape_tensor: tuple
:param shape_tensor: dimensione dell'immagine in ingresso
:returns: restituisce il modello
:rtype: keras model
"""
input_tensor = Input(shape=shape_tensor, name="tensor_input")
logger.debug(f"dimensione input immagine:{shape_tensor}") # pylint: disable=W1203
c1 = Conv2D(16, (3, 3), activation="relu", padding="same")(input_tensor)
c1 = Dropout(0.2)(c1)
c1 = Conv2D(16, (3, 3), activation="relu", padding="same")(c1)
p1 = MaxPooling2D((2, 2))(c1)
c2 = Conv2D(32, (3, 3), activation="relu", padding="same")(p1)
c2 = Dropout(0.1)(c2)
c2 = Conv2D(32, (3, 3), activation="relu", padding="same")(c2)
p2 = MaxPooling2D((2, 2))(c2)
p2 = Resizing(32, 32, interpolation="nearest")(p2)
c3 = Conv2D(64, (3, 3), activation="relu", padding="same")(p2)
c3 = Dropout(0.2)(c3)
c3 = Conv2D(64, (3, 3), activation="relu", padding="same")(c3)
p3 = MaxPooling2D((2, 2))(c3)
p3 = Resizing(16, 16, interpolation="nearest")(p3)
c4 = Conv2D(128, (3, 3), activation="relu", padding="same")(p3)
c4 = Dropout(0.2)(c4)
c4 = Conv2D(128, (3, 3), activation="relu", padding="same")(c4)
p4 = MaxPooling2D((2, 2))(c4)
c5 = Conv2D(256, (3, 3), activation="relu", padding="same")(p4)
c5 = Dropout(0.2)(c5)
c5 = Conv2D(
256,
(3, 3),
activation="relu",
padding="same",
name="last_conv",
)(c5)
# fc layers
flat = Flatten()(c5)
den = Dense(16, activation="relu")(flat)
classification_output = Dense(
2, activation="sigmoid", name="classification_output"
)(den)
u6 = Conv2DTranspose(128, (2, 2), strides=(2, 2), padding="same")(c5)
u6 = concatenate([u6, c4])
c6 = Conv2D(128, (3, 3), activation="relu", padding="same")(u6)
c6 = Dropout(0.2)(c6)
c6 = Conv2D(128, (3, 3), activation="relu", padding="same")(c6)
u7 = Conv2DTranspose(64, (2, 2), strides=(2, 2), padding="same")(c6)
u7 = concatenate([u7, c3])
c7 = Conv2D(64, (3, 3), activation="relu", padding="same")(u7)
c7 = Dropout(0.2)(c7)
c7 = Conv2D(64, (3, 3), activation="relu", padding="same")(c7)
u8 = Conv2DTranspose(32, (2, 2), strides=(2, 2), padding="same")(c7)
u8 = Resizing(62, 62, interpolation="nearest")(c2)
u8 = concatenate([u8, c2])
c8 = Conv2D(32, (3, 3), activation="relu", padding="same")(u8)
c8 = Dropout(0.2)(c8)
c8 = Conv2D(32, (3, 3), activation="relu", padding="same")(c8)
u9 = Conv2DTranspose(16, (2, 2), strides=(2, 2), padding="same")(c8)
u9 = concatenate([u9, c1], axis=3)
c9 = Conv2D(16, (3, 3), activation="relu", padding="same")(u9)
c9 = Dropout(0.2)(c9)
c9 = Conv2D(16, (3, 3), activation="relu", padding="same")(c9)
decoder_out = Conv2D(1, (1, 1), activation="sigmoid", name="decoder_output")(c9)
model = Model(input_tensor, [decoder_out, classification_output])
return model
[docs]def make_model_rad_big_unet(
shape_tensor=(4096, 3072, 1), feature_dim=(3,)
): # pylint: disable=R0915
"""Modello Unet.
Permette inoltre la classificazione delle masse grazie a layer fc.
:type shape_tensor: tuple
:param shape_tensor: dimensione dell'immagine in ingresso
:type feature_dim: tuple
:param feature_dim: dimensione dell'array delle feature
:returns: restituisce il modello
:rtype: keras model
"""
input_tensor = Input(shape=shape_tensor, name="tensor_input")
logger.debug(f"dimensione input immagine:{shape_tensor}") # pylint: disable=W1203
input_vector = Input(shape=feature_dim)
logger.debug(f"dimensione input feature:{feature_dim}") # pylint: disable=W1203
c1 = Conv2D(16, (3, 3), activation="relu", padding="same")(input_tensor)
c1 = Dropout(0.2)(c1)
c1 = Conv2D(16, (3, 3), activation="relu", padding="same")(c1)
p1 = MaxPooling2D((2, 2))(c1)
c2 = Conv2D(32, (3, 3), activation="relu", padding="same")(p1)
c2 = Dropout(0.1)(c2)
c2 = Conv2D(32, (3, 3), activation="relu", padding="same")(c2)
p2 = MaxPooling2D((2, 2))(c2)
c3 = Conv2D(64, (3, 3), activation="relu", padding="same")(p2)
c3 = Dropout(0.2)(c3)
c3 = Conv2D(64, (3, 3), activation="relu", padding="same")(c3)
p3 = MaxPooling2D((2, 2))(c3)
c4 = Conv2D(128, (3, 3), activation="relu", padding="same")(p3)
c4 = Dropout(0.2)(c4)
c4 = Conv2D(128, (3, 3), activation="relu", padding="same")(c4)
p4 = MaxPooling2D((2, 2))(c4)
c5 = Conv2D(256, (3, 3), activation="relu", padding="same")(p4)
c5 = Dropout(0.2)(c5)
c5 = Conv2D(
256,
(3, 3),
activation="relu",
padding="same",
name="last_conv",
)(c5)
# fc layers
flat = Flatten()(c5)
flat = concatenate([flat, input_vector])
den = Dense(16, activation="relu")(flat)
classification_output = Dense(
2, activation="softmax", name="classification_output"
)(den)
u6 = Conv2DTranspose(128, (2, 2), strides=(2, 2), padding="same")(c5)
u6 = concatenate([u6, c4])
c6 = Conv2D(128, (3, 3), activation="relu", padding="same")(u6)
c6 = Dropout(0.2)(c6)
c6 = Conv2D(128, (3, 3), activation="relu", padding="same")(c6)
u7 = Conv2DTranspose(64, (2, 2), strides=(2, 2), padding="same")(c6)
u7 = concatenate([u7, c3])
c7 = Conv2D(64, (3, 3), activation="relu", padding="same")(u7)
c7 = Dropout(0.2)(c7)
c7 = Conv2D(64, (3, 3), activation="relu", padding="same")(c7)
u8 = Conv2DTranspose(32, (2, 2), strides=(2, 2), padding="same")(c7)
u8 = concatenate([u8, c2])
c8 = Conv2D(32, (3, 3), activation="relu", padding="same")(u8)
c8 = Dropout(0.2)(c8)
c8 = Conv2D(32, (3, 3), activation="relu", padding="same")(c8)
u9 = Conv2DTranspose(16, (2, 2), strides=(2, 2), padding="same")(c8)
u9 = concatenate([u9, c1], axis=3)
c9 = Conv2D(16, (3, 3), activation="relu", padding="same")(u9)
c9 = Dropout(0.2)(c9)
c9 = Conv2D(16, (3, 3), activation="relu", padding="same")(c9)
decoder_out = Conv2D(1, (1, 1), activation="sigmoid", name="decoder_output")(c9)
model = Model([input_tensor, input_vector], [decoder_out, classification_output])
return model