Spaces:
Sleeping
Sleeping
import numpy as np | |
import cv2 | |
class ThreatLabeler: | |
def __init__(self): | |
""" | |
Initialize the threat labeling system for deepfake detection | |
""" | |
# Define threat level thresholds | |
self.threat_levels = { | |
'low': (0, 30), # Low threat: 0-30% difference | |
'medium': (30, 60), # Medium threat: 30-60% difference | |
'high': (60, 100) # High threat: 60-100% difference | |
} | |
# Define colors for each threat level (BGR format for OpenCV) | |
self.threat_colors = { | |
'low': (0, 255, 0), # Green | |
'medium': (0, 165, 255), # Orange | |
'high': (0, 0, 255) # Red | |
} | |
def calculate_threat_level(self, diff_value): | |
""" | |
Calculate threat level based on difference value | |
Args: | |
diff_value: Normalized difference value (0-100) | |
Returns: | |
Threat level string ('low', 'medium', or 'high') | |
""" | |
for level, (min_val, max_val) in self.threat_levels.items(): | |
if min_val <= diff_value < max_val: | |
return level | |
return 'high' # Default to high if outside ranges | |
def calculate_region_threat(self, diff_image, bbox): | |
""" | |
Calculate the threat level for a specific region | |
Args: | |
diff_image: Difference image (normalized 0-255) | |
bbox: Bounding box (x, y, w, h) | |
Returns: | |
Threat level string and average difference value | |
""" | |
x, y, w, h = bbox | |
region = diff_image[y:y+h, x:x+w] | |
# Calculate average difference in the region (normalized to 0-100) | |
avg_diff = np.mean(region) / 255 * 100 | |
# Determine threat level | |
threat_level = self.calculate_threat_level(avg_diff) | |
return threat_level, avg_diff | |
def label_regions(self, image, diff_image, bounding_boxes): | |
""" | |
Label regions with threat levels and colors | |
Args: | |
image: Original image to label | |
diff_image: Difference image | |
bounding_boxes: List of bounding boxes (x, y, w, h) | |
Returns: | |
Labeled image and list of regions with threat levels | |
""" | |
# Make a copy of the image to avoid modifying the original | |
labeled_image = image.copy() | |
labeled_regions = [] | |
# Process each bounding box | |
for bbox in bounding_boxes: | |
x, y, w, h = bbox | |
# Calculate threat level for this region | |
threat_level, avg_diff = self.calculate_region_threat(diff_image, bbox) | |
# Get color for this threat level | |
color = self.threat_colors[threat_level] | |
# Draw colored rectangle based on threat level | |
cv2.rectangle(labeled_image, (x, y), (x + w, y + h), color, 2) | |
# Add label text with threat level and percentage | |
label_text = f"{threat_level.upper()}: {avg_diff:.1f}%" | |
cv2.putText(labeled_image, label_text, (x, y - 10), | |
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) | |
# Store labeled region info | |
labeled_regions.append({ | |
'bbox': bbox, | |
'threat_level': threat_level, | |
'difference_percentage': avg_diff | |
}) | |
return labeled_image, labeled_regions | |
def get_threat_summary(self, labeled_regions): | |
""" | |
Generate a summary of threat levels in the image | |
Args: | |
labeled_regions: List of labeled regions with threat levels | |
Returns: | |
Dictionary with threat summary statistics | |
""" | |
if not labeled_regions: | |
return { | |
'total_regions': 0, | |
'threat_counts': {'low': 0, 'medium': 0, 'high': 0}, | |
'max_threat': None, | |
'average_difference': 0 | |
} | |
# Count regions by threat level | |
threat_counts = {'low': 0, 'medium': 0, 'high': 0} | |
total_diff = 0 | |
max_threat = {'level': 'low', 'percentage': 0} | |
for region in labeled_regions: | |
level = region['threat_level'] | |
diff = region['difference_percentage'] | |
# Update counts | |
threat_counts[level] += 1 | |
total_diff += diff | |
# Track maximum threat | |
if diff > max_threat['percentage']: | |
max_threat = {'level': level, 'percentage': diff} | |
# Calculate average difference | |
avg_diff = total_diff / len(labeled_regions) if labeled_regions else 0 | |
return { | |
'total_regions': len(labeled_regions), | |
'threat_counts': threat_counts, | |
'max_threat': max_threat, | |
'average_difference': avg_diff | |
} |