AnimeAutoCensor / app.py
A123123's picture
Update app.py
b058771 verified
import os
import cv2
import numpy as np
import onnxruntime as ort
import gradio as gr
from huggingface_hub import hf_hub_download
REPO_ID = "A123123/AnimeAutoCensor"
HF_TOKEN = os.getenv("HF_TOKEN")
target_size = 640
session = None
input_name = None
try:
print("Downloading model files...")
model_path = hf_hub_download(repo_id=REPO_ID, filename="model.onnx", token=HF_TOKEN)
hf_hub_download(repo_id=REPO_ID, filename="model.onnx.data", token=HF_TOKEN)
session = ort.InferenceSession(model_path, providers=['CPUExecutionProvider'])
input_name = session.get_inputs()[0].name
print("Model loaded successfully!")
except Exception as e:
print(f"CRITICAL ERROR: {e}")
def apply_mosaic_mask(image_rgb, mask, mosaic_level=16):
h, w = image_rgb.shape[:2]
mask = (mask > 0).astype(np.uint8)
small = cv2.resize(image_rgb, (max(1, w // mosaic_level), max(1, h // mosaic_level)), interpolation=cv2.INTER_LINEAR)
mosaic_image = cv2.resize(small, (w, h), interpolation=cv2.INTER_NEAREST)
output_image = image_rgb.copy()
output_image[mask == 1] = mosaic_image[mask == 1]
return output_image
def process_image(input_img):
if input_img is None or session is None:
return input_img
h_orig, w_orig = input_img.shape[:2]
scale = target_size / max(h_orig, w_orig)
new_h, new_w = int(h_orig * scale), int(w_orig * scale)
img_resized = cv2.resize(input_img, (new_w, new_h))
canvas = np.zeros((target_size, target_size, 3), dtype=np.uint8)
pad_y = (target_size - new_h) // 2
pad_x = (target_size - new_w) // 2
canvas[pad_y:pad_y+new_h, pad_x:pad_x+new_w] = img_resized
input_tensor = canvas.astype(np.float32) / 255.0
input_tensor = (input_tensor - [0.485, 0.456, 0.406]) / [0.229, 0.224, 0.225]
input_tensor = input_tensor.transpose(2, 0, 1)[np.newaxis, ...].astype(np.float32)
outputs = session.run(None, {input_name: input_tensor})
pred = outputs[0][0][0]
mask_valid = pred[pad_y:pad_y+new_h, pad_x:pad_x+new_w]
mask_final = cv2.resize(mask_valid, (w_orig, h_orig))
binary_mask = (mask_final > 0.5).astype(np.uint8)
result_rgb = apply_mosaic_mask(input_img, binary_mask)
return result_rgb
with gr.Blocks(title="AI Anime Auto-Censor") as demo:
gr.Markdown("# 🎨 AI Anime Auto-Censor (Trial Version)")
gr.Markdown("This tool uses AI to detect and censor content. The model is protected.")
with gr.Row():
with gr.Column():
input_i = gr.Image(type="numpy", label="Upload Image")
run_btn = gr.Button("Start Processing", variant="primary")
with gr.Column():
output_i = gr.Image(type="numpy", label="Censored Result")
run_btn.click(fn=process_image, inputs=input_i, outputs=output_i)
if __name__ == "__main__":
demo.launch()