Spaces:
Running
Running
| import insightface | |
| import cv2 | |
| import gradio as gr | |
| import numpy as np | |
| import os | |
| # Initialize InsightFace model | |
| app = insightface.app.FaceAnalysis(name='buffalo_l', providers=['CPUExecutionProvider']) | |
| app.prepare(ctx_id=0, det_size=(640, 640), det_thresh=0.3) | |
| inswapper_path = "checkpoints/inswapper_128.onnx" | |
| if not os.path.exists(inswapper_path): | |
| raise FileNotFoundError(f"Model not found at {inswapper_path}") | |
| swapper = insightface.model_zoo.get_model(inswapper_path, providers=['CPUExecutionProvider']) | |
| # Preprocess image to enhance it | |
| def preprocess_image(img): | |
| alpha = 1.3 | |
| beta = 15 | |
| adjusted = cv2.convertScaleAbs(img, alpha=alpha, beta=beta) | |
| return adjusted | |
| # Sharpen the image to make it look better | |
| def sharpen_image(img): | |
| kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]) | |
| sharpened = cv2.filter2D(img, -1, kernel) | |
| return np.clip(sharpened, 0, 255).astype(np.uint8) | |
| # Perform face swapping | |
| def swap_faces(src_img, dst_img, blur_strength=5, sharpen=False): | |
| try: | |
| # Preprocess images to improve lighting and details | |
| src = preprocess_image(src_img) | |
| dst = preprocess_image(dst_img) | |
| # Convert images to RGB | |
| src_rgb = cv2.cvtColor(src, cv2.COLOR_BGR2RGB) | |
| dst_rgb = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB) | |
| # Detect faces in both images | |
| src_faces = app.get(src_rgb) | |
| dst_faces = app.get(dst_rgb) | |
| if not src_faces or not dst_faces: | |
| raise ValueError("No faces detected in one or both of the images.") | |
| # Get the first detected face from each image | |
| src_face = src_faces[0] | |
| dst_face = dst_faces[0] | |
| # Perform the face swap | |
| swapped_img = swapper.get(dst_rgb, dst_face, src_face, paste_back=True) | |
| # Apply blur if specified | |
| if blur_strength > 0: | |
| swapped_img = cv2.GaussianBlur(swapped_img, (blur_strength, blur_strength), 0) | |
| # Apply sharpening if specified | |
| if sharpen: | |
| swapped_img = sharpen_image(swapped_img) | |
| # Convert back to BGR for output | |
| result = cv2.cvtColor(swapped_img, cv2.COLOR_RGB2BGR) | |
| return result | |
| except Exception as e: | |
| print(f"Error: {str(e)}") | |
| return np.zeros((640, 640, 3), dtype=np.uint8) | |
| # Define Gradio interface | |
| title = "🧠 Futuristic Face Swapper with inswapper_128" | |
| description = ( | |
| "Upload a source face and a target image. The AI swaps the face using inswapper_128.onnx " | |
| "for clean, smooth results. Adjust blur strength or enable sharpening for enhanced output." | |
| ) | |
| demo = gr.Interface( | |
| fn=swap_faces, | |
| inputs=[ | |
| gr.Image(label="Source Face", type="numpy"), | |
| gr.Image(label="Target Image", type="numpy"), | |
| gr.Slider(label="Blur Strength", minimum=0, maximum=7, step=1, value=5), | |
| gr.Checkbox(label="Enable Sharpening", value=False) | |
| ], | |
| outputs=gr.Image(label="Face Swapped Output"), | |
| title=title, | |
| description=description, | |
| flagging_mode="never" | |
| ) | |
| if __name__ == "__main__": | |
| demo.queue().launch() | |