-
Notifications
You must be signed in to change notification settings - Fork 2
/
mesonet.py
94 lines (72 loc) · 3.1 KB
/
mesonet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import cv2
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.layers import Input, Dense, Flatten, Conv2D, MaxPooling2D, BatchNormalization, Dropout, LeakyReLU
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Model
image_dimensions = {'height': 256, 'width': 256, 'channels': 3}
# Creating a classifier for mesoNet
class Classifier:
def __init__(self):
self.model = 0
def predict(self, x):
return self.model.predict(x)
def fit(self, x, y):
return self.model.train_on_batch(x, y)
def get_accuracy(self, x, y):
return self.model.test_on_batch(x, y)
def load(self, path):
self.model.load_weights(path)
class Meso4(Classifier):
def __init__(self, learning_rate = 0.001):
self.model = self.init_model()
optimizer = Adam(learning_rate = learning_rate)
self.model.compile(optimizer = optimizer,
loss = 'mean_squared_error',
metrics = ['accuracy'])
self.load('Model_weights/Meso4_DF.h5')
def init_model(self):
x = Input(shape = (image_dimensions['height'],
image_dimensions['width'],
image_dimensions['channels']))
x1 = Conv2D(8, (3, 3), padding='same', activation = 'relu')(x)
x1 = BatchNormalization()(x1)
x1 = MaxPooling2D(pool_size=(2, 2), padding='same')(x1)
x2 = Conv2D(8, (5, 5), padding='same', activation = 'relu')(x1)
x2 = BatchNormalization()(x2)
x2 = MaxPooling2D(pool_size=(2, 2), padding='same')(x2)
x3 = Conv2D(16, (5, 5), padding='same', activation = 'relu')(x2)
x3 = BatchNormalization()(x3)
x3 = MaxPooling2D(pool_size=(2, 2), padding='same')(x3)
x4 = Conv2D(16, (5, 5), padding='same', activation = 'relu')(x3)
x4 = BatchNormalization()(x4)
x4 = MaxPooling2D(pool_size=(4, 4), padding='same')(x4)
y = Flatten()(x4)
y = Dropout(0.5)(y)
y = Dense(16)(y)
y = LeakyReLU(alpha=0.1)(y)
y = Dropout(0.5)(y)
y = Dense(1, activation = 'sigmoid')(y)
return Model(inputs = x, outputs = y)
def preprocess_image(self, image_path):
# Read the image
img = cv2.imread(image_path)
# Resize the image to match the input dimensions of the model
img = cv2.resize(img, (image_dimensions['width'], image_dimensions['height']))
# Convert image to float32 and normalize it
img = img.astype('float32') / 255.0
# Expand dimensions to match the input shape of the model
img = np.expand_dims(img, axis=0)
return img
def predict_on_image(self, model, image_path):
# Preprocess the image
threshold = 0.5
img = self.preprocess_image(image_path)
# Make prediction using the model
prediction = model.predict(img)
if prediction[0][0] > threshold:
return 0
else: return 1
# meso = Meso4()
# image_path = 'test_data/Fake_frames/3fake_0.jpg'
# print(meso.predict_on_image(meso.model, image_path))