Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import sys | |
| import json | |
| import argparse | |
| from types import SimpleNamespace | |
| # Try to import detector - if this fails, we'll show an error in the UI | |
| try: | |
| from support.detect import run_detect | |
| DETECTOR_AVAILABLE = True | |
| IMPORT_ERROR = None | |
| except Exception as e: | |
| DETECTOR_AVAILABLE = False | |
| IMPORT_ERROR = str(e) | |
| print(f"Warning: Could not import detector: {e}") | |
| # Create a dummy function | |
| def run_detect(args): | |
| raise ImportError(f"Detector not available: {IMPORT_ERROR}") | |
| # Download weights on first run (for HF Spaces) | |
| if os.environ.get("SPACE_ID"): | |
| try: | |
| from download_weights import download_all_weights | |
| download_all_weights() | |
| except Exception as e: | |
| print(f"Warning: Could not download weights: {e}") | |
| # Available detectors based on launcher.py | |
| DETECTORS = ['R50_TF', 'R50_nodown', 'CLIP-D', 'P2G', 'NPR'] | |
| def predict(image_path, detector_name): | |
| # Check if detector is available | |
| if not DETECTOR_AVAILABLE: | |
| return json.dumps({ | |
| "error": "Detector module not available", | |
| "details": IMPORT_ERROR, | |
| "message": "The detection system could not be initialized. Please check the logs." | |
| }, indent=2) | |
| if not image_path: | |
| return json.dumps({"error": "Please upload an image."}, indent=2) | |
| # Create a temporary output file path | |
| output_path = "temp_result.json" | |
| # Mock args object | |
| args = SimpleNamespace( | |
| image=image_path, | |
| detector=detector_name, | |
| config_dir='configs', | |
| output=output_path, | |
| weights='pretrained', # Use default/pretrained | |
| device='cpu', # Force CPU | |
| dry_run=False, | |
| verbose=False | |
| ) | |
| try: | |
| # Run detection | |
| # We need to capture stdout/stderr or just trust the function | |
| # run_detect might raise FileNotFoundError if weights are missing | |
| run_detect(args) | |
| # Read results | |
| if os.path.exists(output_path): | |
| with open(output_path, 'r') as f: | |
| result = json.load(f) | |
| # Format output | |
| prediction = result.get('prediction', 'Unknown') | |
| confidence = result.get('confidence', 0.0) | |
| elapsed_time = result.get('elapsed_time', 0.0) | |
| output = { | |
| "Prediction": prediction, | |
| "Confidence": f"{confidence:.4f}", | |
| "Elapsed Time": f"{elapsed_time:.3f}s" | |
| } | |
| return json.dumps(output, indent=2) | |
| else: | |
| return json.dumps({"error": "No result file generated. Check console logs for details."}, indent=2) | |
| except FileNotFoundError as e: | |
| return json.dumps({ | |
| "error": str(e), | |
| "message": f"Please ensure you have downloaded the weights for {detector_name}." | |
| }, indent=2) | |
| except Exception as e: | |
| return json.dumps({"error": str(e)}, indent=2) | |
| finally: | |
| # Cleanup | |
| if os.path.exists(output_path): | |
| os.remove(output_path) | |
| # Create Gradio Interface | |
| # Use theme only if gradio version supports it | |
| try: | |
| demo = gr.Blocks(title="Deepfake Detection", theme=gr.themes.Soft()) | |
| except TypeError: | |
| # Older gradio version doesn't support theme parameter | |
| demo = gr.Blocks(title="Deepfake Detection") | |
| with demo: | |
| gr.Markdown("# π Deepfake Detection Library") | |
| gr.Markdown(""" | |
| Upload an image and select a detector to check if it's real or fake. | |
| **Available Detectors:** | |
| - **R50_TF**: ResNet-50 based detector | |
| - **R50_nodown**: ResNet-50 without downsampling | |
| - **CLIP-D**: CLIP-based detector | |
| - **P2G**: Prompt2Guard detector | |
| - **NPR**: Neural Posterior Regularization | |
| """) | |
| with gr.Row(): | |
| with gr.Column(): | |
| image_input = gr.Image(type="filepath", label="Input Image", height=400) | |
| detector_input = gr.Dropdown( | |
| choices=DETECTORS, | |
| value=DETECTORS[0], | |
| label="Select Detector", | |
| info="Choose which deepfake detection model to use" | |
| ) | |
| submit_btn = gr.Button("π Detect", variant="primary") | |
| with gr.Column(): | |
| output_display = gr.Code(label="Detection Results", language="json", lines=10) | |
| gr.Markdown(""" | |
| --- | |
| ### About | |
| This Space provides access to multiple state-of-the-art deepfake detection models. | |
| All models are trained on StyleGAN2, StableDiffusionXL, FFHQ, and FORLAB datasets. | |
| **Note:** First detection may be slower due to model loading. | |
| """) | |
| submit_btn.click( | |
| fn=predict, | |
| inputs=[image_input, detector_input], | |
| outputs=output_display | |
| ) | |
| if __name__ == "__main__": | |
| # For HF Spaces, configure server settings | |
| demo.launch(server_name="0.0.0.0", server_port=7860) | |