Spaces:
Running
Running
| from chain_img_processor import ChainImgProcessor, ChainImgPlugin | |
| from roop.face_helper import get_one_face, get_many_faces, swap_face | |
| import os | |
| from roop.utilities import compute_cosine_distance | |
| modname = os.path.basename(__file__)[:-3] # calculating modname | |
| # start function | |
| def start(core:ChainImgProcessor): | |
| manifest = { # plugin settings | |
| "name": "Faceswap", # name | |
| "version": "1.0", # version | |
| "default_options": { | |
| "swap_mode": "selected", | |
| "max_distance": 0.65, # max distance to detect face similarity | |
| }, | |
| "img_processor": { | |
| "faceswap": Faceswap | |
| } | |
| } | |
| return manifest | |
| def start_with_options(core:ChainImgProcessor, manifest:dict): | |
| pass | |
| class Faceswap(ChainImgPlugin): | |
| def init_plugin(self): | |
| pass | |
| def process(self, frame, params:dict): | |
| if not "input_face_datas" in params or len(params["input_face_datas"]) < 1: | |
| params["face_detected"] = False | |
| return frame | |
| temp_frame = frame | |
| params["face_detected"] = True | |
| params["processed_faces"] = [] | |
| if params["swap_mode"] == "first": | |
| face = get_one_face(frame) | |
| if face is None: | |
| params["face_detected"] = False | |
| return frame | |
| params["processed_faces"].append(face) | |
| frame = swap_face(params["input_face_datas"][0], face, frame) | |
| return frame | |
| else: | |
| faces = get_many_faces(frame) | |
| if(len(faces) < 1): | |
| params["face_detected"] = False | |
| return frame | |
| dist_threshold = params["face_distance_threshold"] | |
| if params["swap_mode"] == "all": | |
| for sf in params["input_face_datas"]: | |
| for face in faces: | |
| params["processed_faces"].append(face) | |
| temp_frame = swap_face(sf, face, temp_frame) | |
| return temp_frame | |
| elif params["swap_mode"] == "selected": | |
| for i,tf in enumerate(params["target_face_datas"]): | |
| for face in faces: | |
| if compute_cosine_distance(tf.embedding, face.embedding) <= dist_threshold: | |
| temp_frame = swap_face(params["input_face_datas"][i], face, temp_frame) | |
| params["processed_faces"].append(face) | |
| break | |
| elif params["swap_mode"] == "all_female" or params["swap_mode"] == "all_male": | |
| gender = 'F' if params["swap_mode"] == "all_female" else 'M' | |
| face_found = False | |
| for face in faces: | |
| if face.sex == gender: | |
| face_found = True | |
| if face_found: | |
| params["processed_faces"].append(face) | |
| temp_frame = swap_face(params["input_face_datas"][0], face, temp_frame) | |
| face_found = False | |
| return temp_frame | |