Spaces:
Running
Running
import gradio as gr | |
import torch | |
import torch.nn.functional as F | |
from facenet_pytorch import MTCNN, InceptionResnetV1 | |
import os | |
import numpy as np | |
from PIL import Image | |
import zipfile | |
import cv2 | |
from pytorch_grad_cam import GradCAM | |
from pytorch_grad_cam.utils.model_targets import ClassifierOutputTarget | |
from pytorch_grad_cam.utils.image import show_cam_on_image | |
#ai-pict-detect | |
from transformers import pipeline | |
#from typing import Iterable | |
#from gradio.themes.base import Base | |
#from gradio.themes.utils import colors, fonts, sizes | |
#import time | |
''' | |
class Seafoam(Base): | |
def __init__( | |
self, | |
*, | |
primary_hue: colors.Color | str = colors.emerald, | |
secondary_hue: colors.Color | str = colors.blue, | |
neutral_hue: colors.Color | str = colors.blue, | |
spacing_size: sizes.Size | str = sizes.spacing_md, | |
radius_size: sizes.Size | str = sizes.radius_md, | |
text_size: sizes.Size | str = sizes.text_lg, | |
font: fonts.Font | |
| str | |
| Iterable[fonts.Font | str] = ( | |
fonts.GoogleFont("Quicksand"), | |
"ui-sans-serif", | |
"sans-serif", | |
), | |
font_mono: fonts.Font | |
| str | |
| Iterable[fonts.Font | str] = ( | |
fonts.GoogleFont("IBM Plex Mono"), | |
"ui-monospace", | |
"monospace", | |
), | |
): | |
super().__init__( | |
primary_hue=primary_hue, | |
secondary_hue=secondary_hue, | |
neutral_hue=neutral_hue, | |
spacing_size=spacing_size, | |
radius_size=radius_size, | |
text_size=text_size, | |
font=font, | |
font_mono=font_mono, | |
) | |
super().set( | |
body_background_fill="repeating-linear-gradient(45deg, *primary_200, *primary_200 10px, *primary_50 10px, *primary_50 20px)", | |
body_background_fill_dark="repeating-linear-gradient(45deg, *primary_800, *primary_800 10px, *primary_900 10px, *primary_900 20px)", | |
button_primary_background_fill="linear-gradient(90deg, *primary_300, *secondary_400)", | |
button_primary_background_fill_hover="linear-gradient(90deg, *primary_200, *secondary_300)", | |
button_primary_text_color="white", | |
button_primary_background_fill_dark="linear-gradient(90deg, *primary_600, *secondary_800)", | |
slider_color="*secondary_300", | |
slider_color_dark="*secondary_600", | |
block_title_text_weight="600", | |
block_border_width="3px", | |
block_shadow="*shadow_drop_lg", | |
button_shadow="*shadow_drop_lg", | |
button_large_padding="32px", | |
) | |
my_theme = Seafoam() | |
''' | |
#my_theme = gr.Theme.from_hub("gradio/seafoam") | |
my_theme = gr.themes.Monochrome() | |
#my_theme = gr.themes.Glass() | |
#my_theme = gr.themes.Default(primary_hue="red", secondary_hue="pink") | |
pipe = pipeline("image-classification", "nightfury/AI-picture-detector") | |
def image_classifier(image): | |
outputs = pipe(image) | |
results = {} | |
for result in outputs: | |
results[result['label']] = result['score'] | |
return results | |
#ai-pict-detect | |
with zipfile.ZipFile("examples.zip","r") as zip_ref: | |
zip_ref.extractall(".") | |
DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu' | |
'''cuda:0''' | |
mtcnn = MTCNN( | |
select_largest=False, | |
post_process=False, | |
device=DEVICE | |
).to(DEVICE).eval() | |
model = InceptionResnetV1( | |
pretrained="vggface2", | |
classify=True, | |
num_classes=1, | |
device=DEVICE | |
) | |
checkpoint = torch.load("resnetinceptionv1_epoch_32.pth", map_location=torch.device('cpu')) | |
model.load_state_dict(checkpoint['model_state_dict']) | |
model.to(DEVICE) | |
model.eval() | |
EXAMPLES_FOLDER = 'examples' | |
examples_names = os.listdir(EXAMPLES_FOLDER) | |
examples = [] | |
for example_name in examples_names: | |
example_path = os.path.join(EXAMPLES_FOLDER, example_name) | |
label = example_name.split('_')[0] | |
example = { | |
'path': example_path, | |
'label': label | |
} | |
examples.append(example) | |
np.random.shuffle(examples) # shuffle | |
def predict(input_image:Image.Image, true_label:str): | |
"""Predict the label of the input_image""" | |
face = mtcnn(input_image) | |
if face is None: | |
raise Exception('No face detected') | |
return "No Photoreal face detected" | |
face = face.unsqueeze(0) # add the batch dimension | |
face = F.interpolate(face, size=(256, 256), mode='bilinear', align_corners=False) | |
# convert the face into a numpy array to be able to plot it | |
prev_face = face.squeeze(0).permute(1, 2, 0).cpu().detach().int().numpy() | |
prev_face = prev_face.astype('uint8') | |
face = face.to(DEVICE) | |
face = face.to(torch.float32) | |
face = face / 255.0 | |
face_image_to_plot = face.squeeze(0).permute(1, 2, 0).cpu().detach().int().numpy() | |
target_layers=[model.block8.branch1[-1]] | |
use_cuda = True if torch.cuda.is_available() else False | |
#print ("Cuda :: ", use_cuda) | |
cam = GradCAM(model=model, target_layers=target_layers) | |
#, use_cuda=use_cuda) | |
targets = [ClassifierOutputTarget(0)] | |
grayscale_cam = cam(input_tensor=face, targets=targets, eigen_smooth=True) | |
grayscale_cam = grayscale_cam[0, :] | |
visualization = show_cam_on_image(face_image_to_plot, grayscale_cam, use_rgb=True) | |
face_with_mask = cv2.addWeighted(prev_face, 1, visualization, 0.5, 0) | |
with torch.no_grad(): | |
output = torch.sigmoid(model(face).squeeze(0)) | |
prediction = "real" if output.item() < 0.5 else "fake" | |
real_prediction = 1 - output.item() | |
fake_prediction = output.item() | |
confidences = { | |
'real': real_prediction, | |
'fake': fake_prediction | |
} | |
return confidences, true_label, face_with_mask | |
title1 = "Deepfake Image Detection" | |
description1 = "~ AI - ML implementation for fake and real image detection..." | |
article1 = "<p style='text-align: center'>...</p>" | |
#interface1 = gr.Interface(fn=predict, inputs=gr.Image(type="pil"), outputs="label", theme = my_theme, title=title1, description=description1, article = article1) | |
interface1 = gr.Interface( | |
fn=predict, | |
inputs=[ | |
gr.inputs.Image(label="Input Image", type="pil"), | |
"text" | |
], | |
outputs=[ | |
gr.outputs.Label(label="Prediction Model - % of Fake or Real image detection"), | |
"text", | |
gr.outputs.Image(label="Face with Explainability", type="pil") | |
#ValueError: Invalid value for parameter `type`: auto. Please choose from one of: ['numpy', 'pil', 'filepath'] | |
], | |
theme = my_theme, #gr.themes.Soft(), | |
title = title1, | |
description = description1, | |
article = article1 | |
#examples=[[examples[i]["path"], examples[i]["label"]] for i in range(10)] | |
) | |
title2 = "AI Generated Image Detection" | |
description2 = "~ AI - ML implementation for AI image detection using older models such as VQGAN+CLIP." | |
article2 = """ | |
NOTE: | |
- To detect pictures generated using older models such as VQGAN+CLIP, please use the updated version of this detector instead. | |
- In this model i'm using a ViT model to predict whether an artistic image was generated using AI or not. | |
- The training dataset didn't include any samples generated from Midjourney 5, SDXL, or DALLE-3. But was trained on outputs of their predecessors. | |
- Scope of this tool is 'artistic images'; that is to say, it is not a deepfake photo detector, and general computer imagery (webcams, screenshots, etc.) may throw it off. | |
- The potential indicator for this tool is to serve to detect whether an image was AI-generated or not. | |
- Images scoring as very probably artificial (e.g. 90% or higher) could be referred to a human expert for further investigation, if needed. | |
""" | |
interface2 = gr.Interface(fn=image_classifier, inputs=gr.Image(type="pil"), outputs="label", theme = my_theme, title=title2, description=description2, article = article2) | |
#demo.launch(show_api=False) | |
''' | |
interface2 = gr.Interface( | |
fn=image_classifier, | |
inputs=[ | |
gr.inputs.Image(label="Input Image", type="pil"), | |
"text" | |
], | |
outputs=[ | |
gr.outputs.Label(label="Is it Artificial or Human"), | |
"text", | |
#ValueError: Invalid value for parameter `type`: auto. Please choose from one of: ['numpy', 'pil', 'filepath'] | |
], | |
theme = gr.themes.Soft(), | |
title = title1, | |
description = description1, | |
article = article1 | |
) | |
''' | |
gr.TabbedInterface( | |
[interface1, interface2], ["Deepfake Image Detection", "AI Image Detection"] | |
).launch() #share=True) | |