|
import insightface |
|
import os |
|
import onnxruntime |
|
import cv2 |
|
import gfpgan |
|
import tempfile |
|
import time |
|
import gradio as gr |
|
|
|
|
|
class Predictor: |
|
def __init__(self): |
|
self.setup() |
|
|
|
def setup(self): |
|
os.makedirs('models', exist_ok=True) |
|
os.chdir('models') |
|
if not os.path.exists('GFPGANv1.4.pth'): |
|
os.system( |
|
'wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth' |
|
) |
|
if not os.path.exists('inswapper_128.onnx'): |
|
os.system( |
|
'wget https://huggingface.co./ashleykleynhans/inswapper/resolve/main/inswapper_128.onnx' |
|
) |
|
os.chdir('..') |
|
|
|
"""Load the model into memory to make running multiple predictions efficient""" |
|
self.face_swapper = insightface.model_zoo.get_model('models/inswapper_128.onnx', |
|
providers=onnxruntime.get_available_providers()) |
|
self.face_enhancer = gfpgan.GFPGANer(model_path='models/GFPGANv1.4.pth', upscale=1) |
|
self.face_analyser = insightface.app.FaceAnalysis(name='buffalo_l') |
|
self.face_analyser.prepare(ctx_id=0, det_size=(640, 640)) |
|
|
|
def get_face(self, img_data): |
|
analysed = self.face_analyser.get(img_data) |
|
try: |
|
largest = max(analysed, key=lambda x: (x.bbox[2] - x.bbox[0]) * (x.bbox[3] - x.bbox[1])) |
|
return largest |
|
except: |
|
print("No face found") |
|
return None |
|
|
|
def predict(self, input_image, swap_image): |
|
"""Run a single prediction on the model""" |
|
try: |
|
frame = cv2.imread(input_image.name) |
|
face = self.get_face(frame) |
|
source_face = self.get_face(cv2.imread(swap_image.name)) |
|
try: |
|
print(frame.shape, face.shape, source_face.shape) |
|
except: |
|
print("printing shapes failed.") |
|
result = self.face_swapper.get(frame, face, source_face, paste_back=True) |
|
|
|
_, _, result = self.face_enhancer.enhance( |
|
result, |
|
paste_back=True |
|
) |
|
out_path = tempfile.mkdtemp() + f"/{str(int(time.time()))}.jpg" |
|
cv2.imwrite(out_path, result) |
|
return out_path |
|
except Exception as e: |
|
print(f"{e}") |
|
return None |
|
|
|
|
|
|
|
predictor = Predictor() |
|
title = "Swap Faces Using Our Model!!!" |
|
|
|
|
|
iface = gr.Interface( |
|
fn=predictor.predict, |
|
inputs=[ |
|
gr.inputs.Image(type="file", label="Target Image"), |
|
gr.inputs.Image(type="file", label="Swap Image") |
|
], |
|
outputs=gr.outputs.Image(type="file", label="Result"), |
|
title=title, |
|
examples=[["input.jpg", "swap img.jpg"]]) |
|
|
|
|
|
|
|
iface.launch() |
|
|