import gradio as gr
import torch
from transformers import AutoFeatureExtractor, AutoModelForImageClassification
from numpy import exp
import pandas as pd
from PIL import Image
import urllib.request
import uuid
uid = uuid.uuid4()
models = [
"cmckinle/sdxl-flux-detector",
"umm-maybe/AI-image-detector",
"Organika/sdxl-detector",
]
results_store = []
def softmax(vector):
e = exp(vector)
return e / e.sum()
def aiornot(image, model_index):
mod = models[model_index]
feature_extractor = AutoFeatureExtractor.from_pretrained(mod)
model = AutoModelForImageClassification.from_pretrained(mod)
input = feature_extractor(image, return_tensors="pt")
with torch.no_grad():
outputs = model(**input)
logits = outputs.logits
probability = softmax(logits)
px = pd.DataFrame(probability.numpy())
if model_index == 2: # Organika model
real_prob, ai_prob = px[0][0], px[1][0]
label = "Real" if real_prob > ai_prob else "AI"
else:
ai_prob, real_prob = px[0][0], px[1][0]
label = "AI" if ai_prob > real_prob else "Real"
html_out = f"""
This image is likely: {label}
Probabilities:
Real: {real_prob:.4f}
AI: {ai_prob:.4f}"""
results = {"Real": real_prob, "AI": ai_prob}
results_store.append(results)
return gr.HTML.update(html_out), results
def load_url(url):
try:
urllib.request.urlretrieve(f'{url}', f"{uid}tmp_im.png")
image = Image.open(f"{uid}tmp_im.png")
mes = "Image Loaded"
except Exception as e:
image = None
mes = f"Image not Found
Error: {e}"
return image, mes
def calculate_final_prob():
if not results_store:
return {"Real": "N/A", "AI": "N/A"}
fin_out = sum(result["Real"] for result in results_store) / len(results_store)
return {
"Real": f"{fin_out:.4f}",
"AI": f"{1 - fin_out:.4f}"
}
with gr.Blocks() as app:
gr.Markdown("""AI Image Detector
(Test Demo - accuracy varies by model)
""")
with gr.Column():
inp = gr.Image(type='pil')
in_url = gr.Textbox(label="Image URL")
with gr.Row():
load_btn = gr.Button("Load URL")
btn = gr.Button("Detect AI")
mes = gr.HTML()
with gr.Group():
with gr.Row():
fin = gr.Label(label="Final Probability")
with gr.Row():
for i, model in enumerate(models):
with gr.Column():
gr.HTML(f"""Testing on Model: {model}""")
output_html = gr.HTML()
output_label = gr.Label(label="Output")
btn.click(aiornot, inputs=[inp, gr.Number(value=i, visible=False)], outputs=[output_html, output_label])
if i == len(models) - 1: # After the last model, calculate final probability
btn.click(lambda: results_store.clear(), outputs=None) # Clear results before new detection
btn.click(calculate_final_prob, outputs=fin)
load_btn.click(load_url, in_url, [inp, mes])
app.launch(show_api=False, max_threads=24)