Spaces:
Sleeping
Sleeping
| import torch | |
| from transformers import AutoImageProcessor, AutoModelForImageClassification | |
| from PIL import Image | |
| import io | |
| # ---------------------------- | |
| # CONFIG | |
| # ---------------------------- | |
| MODEL_NAME = "dima806/deepfake_vs_real_image_detection" | |
| DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
| # Lower threshold because of concept drift | |
| FAKE_THRESHOLD = 0.1 | |
| # ---------------------------- | |
| # LOAD MODEL (only once) | |
| # ---------------------------- | |
| processor = AutoImageProcessor.from_pretrained(MODEL_NAME) | |
| model = AutoModelForImageClassification.from_pretrained(MODEL_NAME) | |
| model.to(DEVICE) | |
| model.eval() | |
| # ---------------------------- | |
| # PREDICTION FUNCTION | |
| # ---------------------------- | |
| def predict_image(image_bytes): | |
| image = Image.open(io.BytesIO(image_bytes)).convert("RGB") | |
| inputs = processor(images=image, return_tensors="pt").to(DEVICE) | |
| with torch.no_grad(): | |
| outputs = model(**inputs) | |
| logits = outputs.logits | |
| probs = torch.softmax(logits, dim=1) | |
| # Get fake probability | |
| fake_index = model.config.label2id["Fake"] | |
| fake_probability = probs[0][fake_index].item() | |
| # Apply threshold | |
| if fake_probability > FAKE_THRESHOLD: | |
| label = "FAKE" | |
| confidence = fake_probability | |
| else: | |
| label = "REAL" | |
| confidence = 1 - fake_probability | |
| return label, fake_probability, confidence |