| import gradio as gr |
| import datetime |
| import shutil |
| import numpy as np |
| import os, subprocess, re, glob, cv2 |
| import os.path as osp |
| import insightface |
| from insightface.app import FaceAnalysis |
| from insightface.data import get_image as ins_get_image |
| import matplotlib.pyplot as plt |
| import gdown |
| from PIL import Image |
| from rich.progress import Progress, track |
|
|
| |
| app = FaceAnalysis(name='buffalo_l',providers=['CUDAExecutionProvider']) |
| app.prepare(ctx_id=0, det_size=(640, 640)) |
| |
| import gdown |
|
|
| |
| file_id = '1MLAMn5pdHsx7lafeA3KjPechXiqYiYEM' |
|
|
| |
| url = f'https://drive.google.com/uc?id={file_id}' |
| |
|
|
| |
| gdown.download(url, 'inswapper_128.onnx', quiet=False) |
|
|
| swapper = insightface.model_zoo.get_model('inswapper_128.onnx',download=False,download_zip=False) |
| os.system("mkdir output") |
| os.system("mkdir frame") |
| os.system("mkdir allpic") |
|
|
|
|
| def facecompare(face1,face2): |
| feat1 = face1.normed_embedding |
| feat2 = face2.normed_embedding |
| similarity = np.dot(feat1, feat2) |
| threshold = 0.3 |
| if similarity > threshold: |
| return True |
| else: |
| return False |
|
|
| def faceswapdir(face_image,path=".",face_id=0,fcfrmid=0): |
| img1 = cv2.imread(face_image) |
| lst = os.listdir(path) |
| lst.sort() |
| img_lst = [cv2.imread(f"{path}/{img}") for img in track(lst,description='Read frames')] |
| base_face = app.get(img1)[0] |
| face_lst =[app.get(face)[face_id] if app.get(face) else None for face in track(img_lst,description='Extract faces ')] |
| out_img = [swapper.get(swap.copy(), face_lst[i], base_face, paste_back=True) if face_lst[i] is not None and facecompare(face_lst[i],face_lst[fcfrmid]) else img_lst[i] for i,swap in enumerate(track(img_lst, description='Swap frames '))] |
| swapped_img1_rgb = [cv2.cvtColor(swapped, cv2.COLOR_BGR2RGB) for swapped in track(out_img,description='Refine swapped faces ')] |
|
|
| for i,swapped2 in enumerate(swapped_img1_rgb): |
| Image.fromarray(np.uint8(swapped2)).save(f"output/{i+1:06}.jpg") |
|
|
| def faceswapdirold(face_image,path=".",face_id=0): |
| img1 = cv2.imread(face_image) |
| lst = os.listdir(path) |
| lst.sort() |
| img_lst = [cv2.imread(f"{path}/{img}") for img in lst] |
| base_face = app.get(img1)[0] |
| face_lst =[app.get(face)[0] if app.get(face) else None for face in img_lst] |
| out_img = [swapper.get(swap.copy(), face_lst[i], base_face, paste_back=True) if face_lst[i] is not None else img_lst[i] for i,swap in enumerate(track(img_lst, description="Swap frames "))] |
| swapped_img1_rgb = [cv2.cvtColor(swapped, cv2.COLOR_BGR2RGB) for swapped in out_img] |
|
|
| for i,swapped2 in enumerate(swapped_img1_rgb): |
| Image.fromarray(np.uint8(swapped2)).save(f"output/{i+1:06}.jpg") |
|
|
| def faceswapfnvidold(path,path2,num1=0): |
| shutil.copyfile(path.name, 'video.mp4') |
| shutil.copyfile(path2.name, 'baseimg.jpg') |
| |
| os.system('ffmpeg -i video.mp4 -q:a 0 -map a ia.mp3') |
| os.system('ffmpeg -hwaccel auto -i video.mp4 -q:v 18 -pix_fmt rgb24 -vf fps=25 frame/%06d.jpg') |
| faceswapdirold('baseimg.jpg','frame',num1) |
| os.system('ffmpeg -hwaccel auto -r 25 -i output/%06d.jpg -vcodec libx264 -crf 18 -pix_fmt yuv420p ov.mp4') |
| os.system('ffmpeg -i ov.mp4 -i ia.mp3 -c:v copy -c:a libmp3lame out_video.mp4') |
| |
| return ['out_video.mp4'] |
| |
| def faceswapfnvid(path,num1,path2): |
| shutil.copyfile(path.name, 'video.mp4') |
| shutil.copyfile(path2.name, 'baseimg.jpg') |
| |
| os.system('ffmpeg -i video.mp4 -q:a 0 -map a ia.mp3') |
| os.system('ffmpeg -hwaccel auto -i video.mp4 -q:v 18 -pix_fmt rgb24 -vf fps=25 frame/%06d.jpg') |
| faceswapdir('baseimg.jpg','frame',0,num1) |
| os.system('ffmpeg -hwaccel auto -r 25 -i output/%06d.jpg -vcodec libx264 -crf 18 -pix_fmt yuv420p ov.mp4') |
| os.system('ffmpeg -i ov.mp4 -i ia.mp3 -c:v copy -c:a libmp3lame out_video.mp4') |
| |
| return ['out_video.mp4'] |
|
|
| def faceswapfn(path,path2): |
| shutil.copyfile(path.name, 'allpic/targ.jpg') |
| shutil.copyfile(path2.name, 'baseimg.jpg') |
| |
| faceswapdir('baseimg.jpg','allpic',0,0) |
| |
| return ['output/000001.jpg'] |
|
|
| |
| gr.set_static_paths(paths=["/home/user/app"]) |
|
|
| with gr.Blocks() as demo: |
| with gr.Tab('Video Faceswap old'): |
| gr.Markdown("Upload Video old") |
| with gr.Row(): |
| inp = [gr.File(file_types=['.mp4'],label="Target Video"),gr.File(file_types=['.jpg','.jpeg','.png'],label="Base Face Image"),gr.Number(value=0)] |
| out = gr.File(label="Swapped Video") |
| btn = gr.Button("Face Swap") |
| btn.click(fn=faceswapfnvidold, inputs=inp, outputs=out) |
| with gr.Tab('Video Faceswap'): |
| gr.Markdown("Upload Video") |
| with gr.Row(): |
| inp = [gr.File(file_types=['.mp4'],label="Target Video"),gr.Number(value=0),gr.File(file_types=['.jpg','.jpeg','.png'],label="Base Face Image")] |
| out = gr.File(label="Swapped Video") |
| btn = gr.Button("Face Swap") |
| btn.click(fn=faceswapfnvid, inputs=inp, outputs=out) |
| with gr.Tab('Image Faceswap'): |
| gr.Markdown("Upload Image") |
| with gr.Row(): |
| inp = [gr.File(file_types=['.jpg','.jpeg','.png'], label="Target Image"),gr.File(file_types=['.jpg','.jpeg','.png'], label="Base Face Image")] |
| out = gr.File(label="Swapped Image") |
| btn = gr.Button("Face Swap") |
| btn.click(fn=faceswapfn, inputs=inp, outputs=out) |
| |
| demo.launch(share=True,allowed_paths=['out_video.mp4','output/000001.jpg']) |
|
|
|
|