|
import gradio as gr |
|
import insightface |
|
from insightface.app import FaceAnalysis |
|
|
|
assert insightface.__version__ >= '0.7' |
|
|
|
def prepare_app(): |
|
app = FaceAnalysis(name='buffalo_l') |
|
app.prepare(ctx_id=0, det_size=(640, 640)) |
|
swapper = insightface.model_zoo.get_model('inswapper_128.onnx', download=True, download_zip=True) |
|
return app, swapper |
|
|
|
def sort_faces(faces): |
|
return sorted(faces, key=lambda x: x.bbox[0]) |
|
|
|
def get_face(faces, face_id): |
|
try: |
|
if len(faces) < face_id or face_id < 1: |
|
raise gr.Error(f"The image includes only {len(faces)} faces, however, you asked for face {face_id}") |
|
return faces[face_id-1] |
|
except Exception as e: |
|
raise gr.Error(f"An error occurred: {str(e)}") |
|
|
|
app, swapper = prepare_app() |
|
|
|
def swap_faces(sourceImage, sourceFaceIndex, destinationImage, destinationFaceIndex): |
|
"""Swaps faces between the source and destination images based on the specified face indices.""" |
|
faces = sort_faces(app.get(sourceImage)) |
|
source_face = get_face(faces, sourceFaceIndex) |
|
|
|
res_faces = sort_faces(app.get(destinationImage)) |
|
res_face = get_face(res_faces, destinationFaceIndex) |
|
|
|
result = swapper.get(destinationImage, res_face, source_face, paste_back=True) |
|
return result |
|
|
|
|
|
gr.Interface( |
|
|
|
swap_faces, |
|
[ |
|
gr.Image(label="Source Image (the image with the face that you want to use)"), |
|
gr.Number(precision=0, value=1, label='Source Face Position', info='In case there are multiple faces on the image specify which should be used from the left, starting at 1', visible=False,), |
|
gr.Image(label="Destination Image (the image with the face that you want to replace)"), |
|
gr.Number(precision=0, value=1, label='Destination Face Position', info='In case there are multiple faces on the image specify which should be replaced from the left, starting at 1' ,visible=False,) |
|
], |
|
gr.Image(), |
|
examples=[ |
|
['./examples/rihanna.jpg', 1, './examples/margaret_thatcher.jpg', 3], |
|
['./examples/game_of_thrones.jpg', 5, './examples/game_of_thrones.jpg', 4], |
|
], |
|
theme="syddharth/gray-minimal", |
|
title="<h1 style='color: black; text-decoration: underline;'>AI Face Swapping - Free Face Swap</h1>", |
|
description="<span>● Swap faces with anyone in seconds - photos or AI images!,</span><br><span>● A gradio demo for <a href='https://aiconvert.online/ai-face-merge/' style='color: blue; text-decoration: none;'>Mergify's Ai Face Swap </a></span><br><span>● Full features and Multiple Face Swapping For Free with no limitations at at <a href='https://aiconvert.online' style='color: crimson; text-decoration: underline;'> <strong style='color: crimson;'>AIconvert.online</strong></a></span>", |
|
thumbnail='./examples/rihatcher.jpg', |
|
css=" footer{display:none !important;}" |
|
).launch() |
|
|
|
|
|
|
|
|