import gradio as gr import torch from transformers import AutoFeatureExtractor, AutoModelForImageClassification, pipeline import os import zipfile import shutil import matplotlib.pyplot as plt from sklearn.metrics import accuracy_score, roc_auc_score, confusion_matrix, classification_report, roc_curve, auc from tqdm import tqdm from PIL import Image import uuid import tempfile import pandas as pd from numpy import exp import numpy as np from sklearn.metrics import ConfusionMatrixDisplay import urllib.request # Define models models = [ "umm-maybe/AI-image-detector", "Organika/sdxl-detector", "cmckinle/sdxl-flux-detector", ] pipe0 = pipeline("image-classification", f"{models[0]}") pipe1 = pipeline("image-classification", f"{models[1]}") pipe2 = pipeline("image-classification", f"{models[2]}") fin_sum = [] uid = uuid.uuid4() # Softmax function def softmax(vector): e = exp(vector - vector.max()) # for numerical stability return e / e.sum() # Function to extract images from zip def extract_zip(zip_file): temp_dir = tempfile.mkdtemp() # Temporary directory with zipfile.ZipFile(zip_file, 'r') as z: z.extractall(temp_dir) return temp_dir # Function to classify images in a folder def classify_images(image_dir, model_pipeline): images = [] labels = [] preds = [] for folder_name, ground_truth_label in [('real', 1), ('ai', 0)]: folder_path = os.path.join(image_dir, folder_name) if not os.path.exists(folder_path): continue for img_name in os.listdir(folder_path): img_path = os.path.join(folder_path, img_name) try: img = Image.open(img_path).convert("RGB") pred = model_pipeline(img) pred_label = np.argmax([x['score'] for x in pred]) preds.append(pred_label) labels.append(ground_truth_label) images.append(img_name) except Exception as e: print(f"Error processing image {img_name}: {e}") return labels, preds, images # Function to generate evaluation metrics def evaluate_model(labels, preds): cm = confusion_matrix(labels, preds) accuracy = accuracy_score(labels, preds) roc_score = roc_auc_score(labels, preds) report = classification_report(labels, preds) fpr, tpr, _ = roc_curve(labels, preds) roc_auc = auc(fpr, tpr) fig, ax = plt.subplots() disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=["AI", "Real"]) disp.plot(cmap=plt.cm.Blues, ax=ax) plt.close(fig) fig_roc, ax_roc = plt.subplots() ax_roc.plot(fpr, tpr, color='blue', lw=2, label=f'ROC curve (area = {roc_auc:.2f})') ax_roc.plot([0, 1], [0, 1], color='gray', linestyle='--') ax_roc.set_xlim([0.0, 1.0]) ax_roc.set_ylim([0.0, 1.05]) ax_roc.set_xlabel('False Positive Rate') ax_roc.set_ylabel('True Positive Rate') ax_roc.set_title('Receiver Operating Characteristic (ROC) Curve') ax_roc.legend(loc="lower right") plt.close(fig_roc) return accuracy, roc_score, report, fig, fig_roc # Gradio function for batch image processing def process_zip(zip_file): extracted_dir = extract_zip(zip_file.name) labels, preds, images = classify_images(extracted_dir, pipe0) # You can switch to pipe1 or pipe2 accuracy, roc_score, report, cm_fig, roc_fig = evaluate_model(labels, preds) shutil.rmtree(extracted_dir) # Clean up extracted files return accuracy, roc_score, report, cm_fig, roc_fig # Single image classification functions def image_classifier0(image): labels = ["AI", "Real"] outputs = pipe0(image) results = {} for idx, result in enumerate(outputs): results[labels[idx]] = float(outputs[idx]['score']) # Convert to float fin_sum.append(results) return results def image_classifier1(image): labels = ["AI", "Real"] outputs = pipe1(image) results = {} for idx, result in enumerate(outputs): results[labels[idx]] = float(outputs[idx]['score']) # Convert to float fin_sum.append(results) return results def image_classifier2(image): labels = ["AI", "Real"] outputs = pipe2(image) results = {} for idx, result in enumerate(outputs): results[labels[idx]] = float(outputs[idx]['score']) # Convert to float fin_sum.append(results) return results def aiornot0(image): labels = ["AI", "Real"] mod = models[0] feature_extractor0 = AutoFeatureExtractor.from_pretrained(mod) model0 = AutoModelForImageClassification.from_pretrained(mod) input = feature_extractor0(image, return_tensors="pt") with torch.no_grad(): outputs = model0(**input) logits = outputs.logits probability = softmax(logits) # Apply softmax on logits px = pd.DataFrame(probability.numpy()) prediction = logits.argmax(-1).item() label = labels[prediction] html_out = f"""