File size: 4,329 Bytes
2e8ccd8
a262dd1
 
 
ff41b45
 
 
 
 
a262dd1
 
d744498
 
2e8ccd8
d744498
 
23d88ae
 
 
 
a262dd1
 
 
d744498
ff41b45
 
a262dd1
 
 
 
 
 
 
ff41b45
a262dd1
 
 
 
 
ff41b45
 
 
 
 
 
23d88ae
a262dd1
ff41b45
a262dd1
 
23d88ae
 
 
 
ff41b45
23d88ae
2e8ccd8
ff41b45
2e8ccd8
23d88ae
 
 
 
 
 
 
 
 
 
 
2e8ccd8
23d88ae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2e8ccd8
 
23d88ae
 
 
2e8ccd8
 
 
 
23d88ae
 
a262dd1
d744498
 
23d88ae
2e8ccd8
 
d744498
23d88ae
2e8ccd8
23d88ae
2e8ccd8
18855ba
d744498
18855ba
23d88ae
18855ba
 
 
23d88ae
 
 
d744498
18855ba
23d88ae
2e8ccd8
a262dd1
f7d4f80
23d88ae
d744498
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import gradio as gr
from transformers import ViTForImageClassification, ViTImageProcessor
from PIL import Image
import torch
import logging

# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Load the model and processor from Hugging Face
model = ViTForImageClassification.from_pretrained("prithivMLmods/Deep-Fake-Detector-Model")
processor = ViTImageProcessor.from_pretrained("prithivMLmods/Deep-Fake-Detector-Model")

def detect(image, confidence_threshold=0.5):
    """Detect deepfake content using prithivMLmods/Deep-Fake-Detector-Model"""
    if image is None:
        raise gr.Error("Please upload an image to analyze")
    
    try:
        # Convert Gradio image (filepath) to PIL Image
        pil_image = Image.open(image).convert("RGB")
        
        # Resize to match ViT input requirements (224x224)
        pil_image = pil_image.resize((224, 224), Image.Resampling.LANCZOS)
        
        # Preprocess the image
        inputs = processor(images=pil_image, return_tensors="pt")
        
        # Perform inference
        with torch.no_grad():
            outputs = model(**inputs)
            logits = outputs.logits
            probabilities = torch.softmax(logits, dim=1)[0]
        
        # Get confidence scores
        confidence_real = probabilities[0].item() * 100
        confidence_fake = probabilities[1].item() * 100
        
        # Determine prediction based on threshold
        predicted_label = "Fake" if confidence_fake / 100 >= confidence_threshold else "Real"
        confidence_score = max(confidence_real, confidence_fake)
        
        # Log the prediction
        logger.info(f"Real: {confidence_real:.1f}%, Fake: {confidence_fake:.1f}%, Predicted: {predicted_label}")
        
        # Prepare output
        overall = f"{confidence_score:.1f}% Confidence ({predicted_label})"
        aigen = f"{confidence_fake:.1f}% (AI-Generated Content Likelihood)"
        deepfake = f"{confidence_fake:.1f}% (Face Manipulation Likelihood)"
        
        return overall, aigen, deepfake
    
    except Exception as e:
        logger.error(f"Error during analysis: {str(e)}")
        raise gr.Error(f"Analysis error: {str(e)}")

# Custom CSS (unchanged)
custom_css = """
.container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 20px;
    font-family: 'Arial', sans-serif;
}
.header {
    color: #2c3e50;
    border-bottom: 2px solid #3498db;
    padding-bottom: 10px;
}
.button-gradient {
    background: linear-gradient(45deg, #3498db, #2ecc71, #9b59b6);
    background-size: 400% 400%;
    border: none;
    padding: 12px 24px;
    font-size: 16px;
    font-weight: 600;
    color: white;
    border-radius: 8px;
    cursor: pointer;
    transition: all 0.3s ease;
    animation: gradientAnimation 3s ease infinite;
    box-shadow: 0 2px 8px rgba(52, 152, 219, 0.3);
}
.button-gradient:hover {
    transform: translateY(-2px);
    box-shadow: 0 4px 12px rgba(52, 152, 219, 0.5);
}
@keyframes gradientAnimation {
    0% { background-position: 0% 50%; }
    50% { background-position: 100% 50%; }
    100% { background-position: 0% 50%; }
}
"""

MARKDOWN0 = """
<div class="header">
    <h1>DeepFake Detection System</h1>
    <p>Advanced AI-powered analysis for identifying manipulated media<br>
    Powered by prithivMLmods/Deep-Fake-Detector-Model (Updated Jan 2025)<br>
    Adjustable threshold for tuning detection sensitivity</p>
</div>
"""

# Create Gradio interface with threshold slider
with gr.Blocks(css=custom_css, theme=gr.themes.Default()) as demo:
    gr.Markdown(MARKDOWN0)
    with gr.Row(elem_classes="container"):
        with gr.Column(scale=1):
            image = gr.Image(type='filepath', height=400, label="Upload Image")
            threshold = gr.Slider(0, 1, value=0.5, step=0.01, label="Confidence Threshold (Fake)")
            detect_button = gr.Button("Analyze Image", elem_classes="button-gradient")
        with gr.Column(scale=2):
            overall = gr.Label(label="Confidence Score")
            aigen = gr.Label(label="AI-Generated Content")
            deepfake = gr.Label(label="Face Manipulation")
    
    detect_button.click(
        fn=detect,
        inputs=[image, threshold],
        outputs=[overall, aigen, deepfake]
    )

# Launch the application
demo.launch(
    debug=True
)