Spaces:
Running
Running
| 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 | |
| # Instantiate the Predictor class | |
| predictor = Predictor() | |
| title = "Swap Faces Using Our Model!!!" | |
| # Create Gradio Interface | |
| iface = gr.Interface( | |
| fn=predictor.predict, | |
| inputs=[ | |
| gr.Image(type="filepath", label="Target Image"), | |
| gr.Image(type="filepath", label="Swap Image") | |
| ], | |
| outputs=gr.Image(type="filepath", label="Result"), | |
| title=title, | |
| examples=[["input.jpg", "swap img.jpg"]]) | |
| # Launch the Gradio Interface | |
| iface.launch() | |