from classifiers import Meso4, MesoInception4 | |
import numpy as np | |
from PIL import Image | |
# 1 - Load the model and its pretrained weights | |
def load_mesonet(weight_path="models/weights/Meso4_DF.h5"): | |
""" | |
Builds the MesoNet architecture and loads pre-trained weights. | |
""" | |
model = Meso4() | |
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_mesonet(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 | |