Spaces:
Sleeping
Sleeping
| import os | |
| import sys | |
| import torch | |
| import logging | |
| from pathlib import Path | |
| from tqdm import tqdm | |
| import cv2 | |
| import numpy as np | |
| # Add src to path to import DeepfakeDetectorAPI | |
| sys.path.append(os.path.join(os.path.dirname(__file__), '..')) | |
| from src.deepfake.deepfake_detector import DeepfakeDetectorAPI | |
| # Configure logging | |
| logging.basicConfig(level=logging.INFO, format='%(message)s') | |
| logger = logging.getLogger("DeepfakeAnalyzer") | |
| def analyze_folder(detector, folder_path, label): | |
| folder = Path(folder_path) | |
| if not folder.exists(): | |
| logger.error(f"Folder not found: {folder}") | |
| return None | |
| images = list(folder.glob("*.jpg")) + list(folder.glob("*.png")) + list(folder.glob("*.jpeg")) | |
| if not images: | |
| logger.error(f"No images found in {folder}") | |
| return None | |
| logger.info(f"\nAnalyzing '{label}' ({folder})... Found {len(images)} images.") | |
| total_prob = 0 | |
| attack_count = 0 | |
| real_count = 0 | |
| # Increase sample size for robustness | |
| sample_size = min(len(images), 50) | |
| logger.info(f"Sampling {sample_size} images using Deepfake Detector (ViT)...") | |
| for img_path in tqdm(images[:sample_size]): | |
| try: | |
| # Detect returns dict with 'deepfake_score' | |
| result = detector.detect(str(img_path)) | |
| score = result['deepfake_score'] | |
| # Threshold 0.5 | |
| threshold = 0.5 | |
| is_attack = score > threshold | |
| total_prob += score | |
| if is_attack: | |
| attack_count += 1 | |
| else: | |
| real_count += 1 | |
| except Exception as e: | |
| logger.warning(f"Failed to analyze {img_path.name}: {e}") | |
| avg_prob = total_prob / sample_size if sample_size > 0 else 0 | |
| attack_percent = (attack_count / sample_size) * 100 if sample_size > 0 else 0 | |
| return { | |
| 'label': label, | |
| 'path': str(folder), | |
| 'sample_size': sample_size, | |
| 'avg_score': avg_prob, | |
| 'attack_percentage': attack_percent, | |
| 'real_count': real_count, | |
| 'attack_count': attack_count | |
| } | |
| def main(): | |
| folder_a = "/media/juanquy/Dev/Users photos/" | |
| folder_b = "/media/juanquy/Dev/a small sample/" | |
| device = 'cuda' if torch.cuda.is_available() else 'cpu' | |
| logger.info(f"Using device: {device}") | |
| logger.info("Initializing DeepfakeDetectorAPI (dima806/ViT)...") | |
| try: | |
| detector = DeepfakeDetectorAPI(device=device) | |
| logger.info("Detector initialized successfully.") | |
| except Exception as e: | |
| logger.error(f"Failed to init detector: {e}") | |
| return | |
| results = [] | |
| res_a = analyze_folder(detector, folder_a, "Real Photos Folder") | |
| if res_a: results.append(res_a) | |
| res_b = analyze_folder(detector, folder_b, "AI Generated Folder") | |
| if res_b: results.append(res_b) | |
| print("\n" + "="*80) | |
| print(f"{'Folder Analysis Report (Deepfake/GenAI Detector)':^80}") | |
| print("="*80) | |
| for res in results: | |
| print(f"\n--- {res['label']} ---") | |
| print(f"Path: {res['path']}") | |
| print(f"Avg AI Probability: {res['avg_score']:.4f} (0=Real, 1=AI)") | |
| print(f"AI Detection Rate: {res['attack_percentage']:.1f}% ({res['attack_count']}/{res['sample_size']})") | |
| verdict = "UNKNOWN" | |
| if res['attack_percentage'] > 70: | |
| verdict = ">> AI GENERATED <<" | |
| elif res['attack_percentage'] < 30: | |
| verdict = ">> REAL PHOTOS <<" | |
| else: | |
| verdict = ">> MIXED / UNCERTAIN <<" | |
| print(f"Verdict: {verdict}") | |
| if __name__ == "__main__": | |
| main() | |