Split out first_face vs multi-face calls

This commit is contained in:
Andras Fekete
2023-06-19 13:21:11 -04:00
parent 8e9035f712
commit 19d039d145

View File

@@ -149,24 +149,21 @@ class Refacer:
ret.append(face) ret.append(face)
return ret return ret
def process_first_face(self,frame):
faces = self.__get_faces(frame,max_num=1)
if len(faces) != 0:
frame = self.face_swapper.get(frame, faces[0], self.replacement_faces[0][1], paste_back=True)
return frame
def process_faces(self,frame): def process_faces(self,frame):
max_num=0 faces = self.__get_faces(frame,max_num=0)
if self.first_face: for rep_face in self.replacement_faces:
max_num=1 for i in range(len(faces) - 1, -1, -1):
sim = self.rec_app.compute_sim(rep_face[0], faces[i].embedding)
faces = self.__get_faces(frame,max_num=max_num) if sim>=rep_face[2]:
if self.first_face: frame = self.face_swapper.get(frame, faces[i], rep_face[1], paste_back=True)
for face in faces: del faces[i]
frame = self.face_swapper.get(frame, face, self.replacement_faces[0][1], paste_back=True) break
break
else:
for rep_face in self.replacement_faces:
for i in range(len(faces) - 1, -1, -1):
sim = self.rec_app.compute_sim(rep_face[0], faces[i].embedding)
if sim>=rep_face[2]:
frame = self.face_swapper.get(frame, faces[i], rep_face[1], paste_back=True)
del faces[i]
break
return frame return frame
def __check_video_has_audio(self,video_path): def __check_video_has_audio(self,video_path):
@@ -178,7 +175,10 @@ class Refacer:
def reface_group(self, faces, frames, output): def reface_group(self, faces, frames, output):
with ThreadPoolExecutor(max_workers = self.use_num_cpus) as executor: with ThreadPoolExecutor(max_workers = self.use_num_cpus) as executor:
results = list(tqdm(executor.map(self.process_faces, frames), total=len(frames),desc="Processing frames")) if self.first_face:
results = list(tqdm(executor.map(self.process_first_face, frames), total=len(frames),desc="Processing frames"))
else:
results = list(tqdm(executor.map(self.process_faces, frames), total=len(frames),desc="Processing frames"))
for result in results: for result in results:
output.write(result) output.write(result)