""" Image Analysis Module using Gemini API """ import google.generativeai as genai from PIL import Image import json class ImageAnalyzer: def __init__(self, api_key): """Initialize the image analyzer with Gemini API""" genai.configure(api_key=api_key) self.model = genai.GenerativeModel('gemini-1.5-flash') def analyze(self, image_path): """ Analyze an image for deepfake/AI-generated content Args: image_path: Path to the image file Returns: dict: Analysis results containing confidence score and details """ try: # Load image img = Image.open(image_path) # Create detailed prompt for deepfake detection prompt = """Analyze this image for signs of being a deepfake or AI-generated content. Please examine the following aspects: 1. **Facial Features**: Irregularities in eyes, teeth, skin texture, facial symmetry 2. **Lighting & Shadows**: Inconsistent lighting, unnatural shadows, mismatched light sources 3. **Background**: Blurry or inconsistent backgrounds, unrealistic elements 4. **Artifacts**: Digital artifacts, blending errors, warping, unnatural edges 5. **Details**: Hair texture, jewelry, reflections, fine details that AI often struggles with 6. **Context**: Overall scene coherence and realism Provide your analysis in the following JSON format: { "is_deepfake": true/false, "confidence_score": 0-100, "analysis": "Detailed explanation of your findings", "indicators": ["List of specific indicators found"], "suspicious_areas": ["Areas that seem manipulated or artificial"] } Be thorough and specific in your analysis. Consider both obvious and subtle signs.""" # Generate analysis response = self.model.generate_content([prompt, img]) # Parse response result_text = response.text # Try to extract JSON from response try: # Clean the response text json_start = result_text.find('{') json_end = result_text.rfind('}') + 1 if json_start != -1 and json_end > json_start: json_str = result_text[json_start:json_end] result = json.loads(json_str) else: # Fallback: create structured result from text result = self._parse_text_response(result_text) except json.JSONDecodeError: result = self._parse_text_response(result_text) # Ensure all required fields exist result.setdefault('is_deepfake', False) result.setdefault('confidence_score', 0) result.setdefault('analysis', result_text) result.setdefault('indicators', []) result.setdefault('suspicious_areas', []) return result except Exception as e: return { 'is_deepfake': False, 'confidence_score': 0, 'analysis': f'Error during analysis: {str(e)}', 'indicators': [], 'suspicious_areas': [], 'error': str(e) } def _parse_text_response(self, text): """Parse text response when JSON extraction fails""" # Simple heuristic parsing is_deepfake = any(keyword in text.lower() for keyword in ['deepfake', 'ai-generated', 'artificial', 'synthetic', 'fake', 'manipulated']) # Estimate confidence based on strength of language confidence = 0 if any(word in text.lower() for word in ['likely', 'probably', 'appears']): confidence = 65 if any(word in text.lower() for word in ['definitely', 'clearly', 'obvious']): confidence = 85 if any(word in text.lower() for word in ['possibly', 'might', 'could']): confidence = 40 # Extract indicators (simple sentence splitting) indicators = [] for sentence in text.split('.'): if any(keyword in sentence.lower() for keyword in ['inconsistent', 'unnatural', 'artifact', 'blurr', 'warp', 'irregular']): indicators.append(sentence.strip()) return { 'is_deepfake': is_deepfake, 'confidence_score': confidence if is_deepfake else 100 - confidence, 'analysis': text, 'indicators': indicators[:5], # Limit to top 5 'suspicious_areas': [] }