Spaces:
Sleeping
Sleeping
import pandas as pd | |
import numpy as np | |
import matplotlib.pyplot as plt | |
import matplotlib.image as mpimg | |
import seaborn as sns | |
#%matplotlib inline | |
np.random.seed(2) | |
from sklearn.model_selection import train_test_split | |
from sklearn.metrics import confusion_matrix | |
import itertools | |
from tensorflow.keras.utils import to_categorical | |
from keras.models import Sequential | |
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D | |
from keras.optimizers import RMSprop | |
from tensorflow.keras.preprocessing.image import ImageDataGenerator | |
from keras.callbacks import ReduceLROnPlateau, EarlyStopping | |
sns.set(style='white', context='notebook', palette='deep') | |
from PIL import Image | |
import os | |
from pylab import * | |
import re | |
from PIL import Image, ImageChops, ImageEnhance | |
def get_imlist(path): | |
return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg') or f.endswith('.png')] | |
def convert_to_ela_image(path, quality): | |
filename = path | |
resaved_filename = filename.split('.')[0] + '.resaved.jpg' | |
ELA_filename = filename.split('.')[0] + '.ela.png' | |
im = Image.open(filename).convert('RGB') | |
im.save(resaved_filename, 'JPEG', quality=quality) | |
resaved_im = Image.open(resaved_filename) | |
ela_im = ImageChops.difference(im, resaved_im) | |
extrema = ela_im.getextrema() | |
max_diff = max([ex[1] for ex in extrema]) | |
if max_diff == 0: | |
max_diff = 1 | |
scale = 255.0 / max_diff | |
ela_im = ImageEnhance.Brightness(ela_im).enhance(scale) | |
return ela_im | |
Image.open('Images for Deep Fake/real_images/6401_0.jpg') | |
convert_to_ela_image('Images for Deep Fake/real_images/6401_0.jpg', 90) | |
Image.open('Images for Deep Fake/fake_images/1601_0.jpg') | |
convert_to_ela_image('Images for Deep Fake/fake_images/1601_0.jpg', 90) | |
import os | |
import csv | |
from PIL import Image # Use PIL for image processing | |
def create_image_dataset_csv(fake_folder, real_folder, output_csv): | |
# Initialize an empty list to store image information | |
image_data = [] | |
# Process fake images | |
fake_files = os.listdir(fake_folder) | |
for filename in fake_files: | |
if filename.endswith('.jpg') or filename.endswith('.png'): # Adjust based on your image formats | |
file_path = os.path.join(fake_folder, filename) | |
label = 0 # Assign label 0 for fake | |
image_data.append((file_path, label)) | |
# Process real images | |
real_files = os.listdir(real_folder) | |
for filename in real_files: | |
if filename.endswith('.jpg') or filename.endswith('.png'): # Adjust based on your image formats | |
file_path = os.path.join(real_folder, filename) | |
label = 1 # Assign label 1 for real | |
image_data.append((file_path, label)) | |
# Write image data to CSV file | |
with open(output_csv, 'w', newline='') as csvfile: | |
csv_writer = csv.writer(csvfile) | |
csv_writer.writerow(['file_path', 'label']) # Header row | |
csv_writer.writerows(image_data) | |
print(f"CSV file '{output_csv}' has been created successfully with {len(image_data)} entries.") | |
# Example usage: | |
fake_images_folder = 'Images for Deep Fake/fake_images' | |
real_images_folder = 'Images for Deep Fake/real_images' | |
output_csv_file = 'image_dataset.csv' | |
create_image_dataset_csv(fake_images_folder, real_images_folder, output_csv_file) | |
import pandas as pd | |
# dataset = pd.read_csv('datasets/dataset.csv') | |
dataset = pd.read_csv('image_dataset.csv') | |
dataset.head() | |
X = [] | |
Y = [] | |
X | |
for index, row in dataset.iterrows(): | |
X.append(array(convert_to_ela_image(row[0], 90).resize((128, 128))).flatten() / 255.0) | |
Y.append(row[1]) | |
X = np.array(X) | |
Y = to_categorical(Y, 2) | |
X = X.reshape(-1, 128, 128, 3) | |
X_train, X_val, Y_train, Y_val = train_test_split(X, Y, test_size = 0.2, random_state=5) | |
model = Sequential() | |
model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'valid', | |
activation ='relu', input_shape = (128,128,3))) | |
print("Input: ", model.input_shape) | |
print("Output: ", model.output_shape) | |
model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'valid', | |
activation ='relu')) | |
print("Input: ", model.input_shape) | |
print("Output: ", model.output_shape) | |
model.add(MaxPool2D(pool_size=(2,2))) | |
model.add(Dropout(0.25)) | |
print("Input: ", model.input_shape) | |
print("Output: ", model.output_shape) | |
model.add(Flatten()) | |
model.add(Dense(256, activation = "relu")) | |
model.add(Dropout(0.5)) | |
model.add(Dense(2, activation = "softmax")) | |
model.summary() | |
optimizer = RMSprop(learning_rate=0.0005, rho=0.9, epsilon=1e-08, decay=0.0) | |
model.compile(optimizer = optimizer , loss = "categorical_crossentropy", metrics=["accuracy"]) | |
early_stopping = EarlyStopping(monitor='val_acc', | |
min_delta=0, | |
patience=2, | |
verbose=0, mode='max') | |
epochs = 10 | |
batch_size = 100 | |
history = model.fit(X_train, Y_train, batch_size = batch_size, epochs = epochs, | |
validation_data = (X_val, Y_val), verbose = 2, callbacks=[early_stopping]) | |
# Plot the loss and accuracy curves for training and validation | |
fig, ax = plt.subplots(2,1) | |
ax[0].plot(history.history['loss'], color='b', label="Training loss") | |
ax[0].plot(history.history['val_loss'], color='r', label="validation loss") | |
legend = ax[0].legend(loc='best', shadow=True) | |
ax[1].plot(history.history['accuracy'], color='b', label="Training accuracy") | |
ax[1].plot(history.history['val_accuracy'], color='r',label="Validation accuracy") | |
legend = ax[1].legend(loc='best', shadow=True) | |
from sklearn.metrics import confusion_matrix | |
def plot_confusion_matrix(cm, classes, | |
normalize=False, | |
title='Confusion matrix', | |
cmap=plt.cm.Blues): | |
""" | |
This function prints and plots the confusion matrix. | |
Normalization can be applied by setting `normalize=True`. | |
""" | |
plt.imshow(cm, interpolation='nearest', cmap=cmap) | |
plt.title(title) | |
plt.colorbar() | |
tick_marks = np.arange(len(classes)) | |
plt.xticks(tick_marks, classes, rotation=45) | |
plt.yticks(tick_marks, classes) | |
if normalize: | |
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] | |
thresh = cm.max() / 2. | |
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): | |
plt.text(j, i, cm[i, j], | |
horizontalalignment="center", | |
color="white" if cm[i, j] > thresh else "black") | |
plt.tight_layout() | |
plt.ylabel('True label') | |
plt.xlabel('Predicted label') | |
# Predict the values from the validation dataset | |
Y_pred = model.predict(X_val) | |
# Convert predictions classes to one hot vectors | |
Y_pred_classes = np.argmax(Y_pred,axis = 1) | |
# Convert validation observations to one hot vectors | |
Y_true = np.argmax(Y_val,axis = 1) | |
# compute the confusion matrix | |
confusion_mtx = confusion_matrix(Y_true, Y_pred_classes) | |
plt.xlabel('Predicted') | |
plt.ylabel('True') | |
plt.title('Confusion Matrix') | |
sns.heatmap(confusion_mtx/np.sum(confusion_mtx), annot=True, | |
fmt='.2%', cmap='Blues') | |
from sklearn.metrics import classification_report | |
print(classification_report(Y_true, Y_pred_classes)) | |
#saving the trained cnn model | |
model.save("fake-image-detection.h5") | |
import gradio as gr | |
import numpy as np | |
from PIL import Image, ImageChops, ImageEnhance | |
from keras.models import load_model | |
import tensorflow as tf | |
# Load the trained model | |
model = load_model("fake-image-detection.h5") | |
# Function to convert an image to its ELA form | |
def convert_to_ela_image(image, quality=90): | |
resaved_image = image.convert('RGB') | |
resaved_image.save("resaved_image.jpg", 'JPEG', quality=quality) | |
resaved_image = Image.open("resaved_image.jpg") | |
ela_image = ImageChops.difference(image, resaved_image) | |
extrema = ela_image.getextrema() | |
max_diff = max([ex[1] for ex in extrema]) | |
if max_diff == 0: | |
max_diff = 1 | |
scale = 255.0 / max_diff | |
ela_image = ImageEnhance.Brightness(ela_image).enhance(scale) | |
return ela_image | |
# Prediction function | |
def predict(image): | |
# Convert the input image to an ELA image | |
ela_image = convert_to_ela_image(image) | |
ela_image = ela_image.resize((128, 128)) # Resize to match the input size of the model | |
ela_array = np.array(ela_image).astype('float32') / 255.0 | |
ela_array = ela_array.reshape(1, 128, 128, 3) # Reshape for model input | |
# Make a prediction | |
prediction = model.predict(ela_array) | |
class_idx = np.argmax(prediction, axis=1)[0] | |
# Map the prediction to labels | |
labels = {0: "Fake", 1: "Real"} | |
return labels[class_idx] | |
# Gradio interface | |
interface = gr.Interface( | |
fn=predict, # Prediction function | |
inputs=gr.Image(type="pil"), # Image input (PIL format) | |
outputs="label", # Output a label | |
title="Deep Fake Detector", | |
description="Upload an image to detect if it's a real or fake image using ELA and a trained CNN model." | |
) | |
# Launch the interface | |
interface.launch() |