deepsaif / models /mesoinception.py
22GC22's picture
Upload 12 files
d7f12b9 verified
from classifiers import Meso4, MesoInception4
import numpy as np
from PIL import Image
# 1 - Load the model and its pretrained weights
def load_mesonetInception(weight_path="models/weights/MesoInception_DF.h5"):
"""
Builds the MesoNet architecture and loads pre-trained weights.
"""
model = MesoInception4()
model.load(weight_path)
# Load weights by name
return model
def preprocess_image(image):
"""
Preprocesses an input image for prediction.
Args:
image (PIL.Image): The input image.
Returns:
np.array: The preprocessed image ready for prediction.
"""
image = image.resize((256, 256)) # Resize to model input size
image = np.array(image) / 255.0 # Normalize the image
image = np.expand_dims(image, axis=0) # Add batch dimension
return image
def predict_mesonetInception(model, image):
"""
Predicts DeepFake probability using MesoNet (TensorFlow/Keras).
"""
"""
Predicts the DeepFake probability using the MesoNet model.
Args:
model: The MesoNet model (Meso4 or MesoInception4).
image (PIL.Image): The input image to predict.
Returns:
float: The predicted probability of the image being a DeepFake.
"""
# Preprocess the image
preprocessed_image = preprocess_image(image)
# Perform prediction
predictions = model.predict(preprocessed_image)
fake_prob = predictions[0][0]
# print('Predicted :', model.predict(X), '\nReal class :', y)
return fake_prob*100
# from tensorflow.keras.models import Model
# from tensorflow.keras.layers import Input, Conv2D, BatchNormalization, ReLU, Flatten, Dense, MaxPooling2D, Dropout
# import numpy as np
# def build_mesonet():
# """
# Builds the MesoNet architecture to match the weight file.
# """
# input_layer = Input(shape=(256, 256, 3), name="input_2")
# # Block 1
# x = Conv2D(8, (3, 3), padding="same", name="conv2d_5")(input_layer)
# x = BatchNormalization(name="batch_normalization_5")(x)
# x = ReLU()(x)
# x = MaxPooling2D(pool_size=(2, 2), padding="same", name="max_pooling2d_5")(x)
# # Block 2
# x = Conv2D(8, (5, 5), padding="same", name="conv2d_6")(x)
# x = BatchNormalization(name="batch_normalization_6")(x)
# x = ReLU()(x)
# x = MaxPooling2D(pool_size=(2, 2), padding="same", name="max_pooling2d_6")(x)
# # Block 3
# x = Conv2D(16, (5, 5), padding="same", name="conv2d_7")(x)
# x = BatchNormalization(name="batch_normalization_7")(x)
# x = ReLU()(x)
# x = MaxPooling2D(pool_size=(2, 2), padding="same", name="max_pooling2d_7")(x)
# # Block 4
# x = Conv2D(16, (5, 5), padding="same", name="conv2d_8")(x)
# x = BatchNormalization(name="batch_normalization_8")(x)
# x = ReLU()(x)
# x = MaxPooling2D(pool_size=(4, 4), padding="same", name="max_pooling2d_8")(x)
# # Fully connected layers
# x = Flatten(name="flatten_2")(x) # Output should now match 1024
# x = Dense(16, activation="relu", name="dense_3")(x)
# x = Dropout(0.5, name="dropout_3")(x)
# x = Dense(1, activation="sigmoid", name="dense_4")(x) # Single output for binary classification
# model = Model(inputs=input_layer, outputs=x)
# return model
# # def load_mesonet(weight_path="models/weights/Meso4_DF.h5"):
# """
# Builds the MesoNet architecture and loads pre-trained weights.
# """
# model = build_mesonet()
# model.load_weights(weight_path, by_name=True) # Load weights by name
# return model