Spaces:
Runtime error
Runtime error
# image_moderator.py | |
from transformers import CLIPProcessor, CLIPModel, ViTForImageClassification, ViTFeatureExtractor | |
from PIL import Image, ImageFilter | |
import torch | |
import cv2 | |
import os | |
class ImageContentModerator: | |
def __init__(self, nsfw_threshold=0.85, blur_radius=99): | |
# NSFW Setup | |
self.nsfw_threshold = nsfw_threshold | |
self.nsfw_classes = [ | |
"porn", "nudity", "sexual activity", "explicit", | |
"safe", "neutral", "hentai", "suggestive", "drawing" | |
] | |
self.nsfw_model = CLIPModel.from_pretrained("openai/clip-vit-base-patch16") | |
self.nsfw_processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch16") | |
# Violence Setup | |
self.violence_model = ViTForImageClassification.from_pretrained('jaranohaal/vit-base-violence-detection') | |
self.violence_extractor = ViTFeatureExtractor.from_pretrained('jaranohaal/vit-base-violence-detection') | |
self.custom_labels = {1: "Non-Violent", 0: "Violent"} | |
self.blur_radius = blur_radius | |
print("[Moderator] Both models loaded successfully.") | |
def is_nsfw(self, image): | |
inputs = self.nsfw_processor(text=self.nsfw_classes, images=image, return_tensors="pt", padding=True) | |
with torch.no_grad(): | |
outputs = self.nsfw_model(**inputs) | |
probs = outputs.logits_per_image.softmax(dim=1)[0] | |
top_class = self.nsfw_classes[probs.argmax()] | |
confidence = probs.max().item() | |
print(f"[NSFW] Predicted: {top_class} ({confidence:.2f})") | |
return top_class not in ['safe', 'neutral', 'drawing'] and confidence > self.nsfw_threshold | |
def is_violent(self, image): | |
inputs = self.violence_extractor(images=image, return_tensors="pt") | |
with torch.no_grad(): | |
outputs = self.violence_model(**inputs) | |
class_idx = outputs.logits.argmax(-1).item() | |
label = self.custom_labels[class_idx] | |
print(f"[Violence] Predicted: {label}") | |
return label == "Violent" | |
def blur_image(self, image_path, output_path): | |
image = Image.open(image_path) | |
blurred = image.filter(ImageFilter.GaussianBlur(radius=self.blur_radius)) | |
blurred.save(output_path) | |
return output_path | |
def process_image(self, image_path, output_path="moderated_image.jpg"): | |
image = Image.open(image_path).convert("RGB") | |
if self.is_nsfw(image): | |
print("β οΈ NSFW Content Detected β Blurring Image") | |
return self.blur_image(image_path, output_path) | |
if self.is_violent(image): | |
print("β οΈ Violent Content Detected β Blurring Image") | |
return self.blur_image(image_path, output_path) | |
print("β Image is clean β No action taken") | |
image.save(output_path) | |
return output_path | |
from transformers import pipeline | |
from better_profanity import profanity | |
# Load profanity model | |
# pipeline("text-classification", model="unitary/toxic-bert").save_pretrained("./models/unitary-toxic-bert") | |
toxic_classifier = pipeline("text-classification", model="./models/unitary-toxic-bert") | |
profanity.load_censor_words() | |
custom_words = [ | |
"idiot", "moron", "dumb", "stupid", "loser", "bastard", "retard", "scumbag", | |
"asshole", "jerk", "shit", "fuck", "damn", "hell", "crap", "bitch" | |
] | |
profanity.add_censor_words(custom_words) | |
def mask_bad_words(text): | |
return profanity.censor(text) | |
def smart_censor(text, toxic_threshold=0.85): | |
result = toxic_classifier(text)[0] | |
label = result['label'].lower() | |
score = result['score'] | |
if label == "toxic" and score > toxic_threshold: | |
masked_text = mask_bad_words(text) | |
if masked_text != text: | |
return masked_text | |
else: | |
return "β οΈ Vulgar Content Detected" | |
return text | |