From 321920eabad393c3181dab8890fbe60934b463a8 Mon Sep 17 00:00:00 2001 From: henryruhs Date: Mon, 25 Mar 2024 21:49:41 +0100 Subject: [PATCH] Cleanup 5 to 68 landmark convertion --- facefusion/face_analyser.py | 8 ++++---- facefusion/face_helper.py | 2 +- facefusion/processors/frame/choices.py | 2 +- facefusion/processors/frame/modules/face_debugger.py | 7 ++++++- facefusion/processors/frame/typings.py | 2 +- facefusion/typing.py | 3 ++- 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/facefusion/face_analyser.py b/facefusion/face_analyser.py index 64c4a8fa..d9637344 100644 --- a/facefusion/face_analyser.py +++ b/facefusion/face_analyser.py @@ -321,19 +321,19 @@ def create_faces(vision_frame : VisionFrame, bounding_box_list : List[BoundingBo for index in keep_indices: bounding_box = bounding_box_list[index] face_landmark_5_68 = face_landmark_5_list[index] - face_landmark_68 = None + face_landmark_68_5 = convert_face_landmark_5_to_68(face_landmark_5_68) + face_landmark_68 = face_landmark_68_5 face_landmark_68_score = 0.0 if facefusion.globals.face_landmarker_score > 0: face_landmark_68, face_landmark_68_score = detect_face_landmark_68(vision_frame, bounding_box) if face_landmark_68_score > facefusion.globals.face_landmarker_score: face_landmark_5_68 = convert_face_landmark_68_to_5(face_landmark_68) - else: - face_landmark_68 = convert_face_landmark_5_to_68(face_landmark_5_68) landmarks : FaceLandmarkSet =\ { '5': face_landmark_5_list[index], '5/68': face_landmark_5_68, - '68': face_landmark_68 + '68': face_landmark_68, + '68/5': face_landmark_68_5 } scores : FaceScoreSet = \ { diff --git a/facefusion/face_helper.py b/facefusion/face_helper.py index 131d504b..a8903dc7 100644 --- a/facefusion/face_helper.py +++ b/facefusion/face_helper.py @@ -180,7 +180,7 @@ def convert_face_landmark_5_to_68(face_landmark_5 : FaceLandmark5) -> FaceLandma face_landmark_5 = face_landmark_5 / 512 face_landmark_68 = face_landmarker_converter.run(None, { - face_landmarker_converter.get_inputs()[0].name.get: [ face_landmark_5 ] + face_landmarker_converter.get_inputs()[0].name: [ face_landmark_5 ] })[0][0] face_landmark_68 = (face_landmark_68 * 512).reshape(68, 2) face_landmark_68 = cv2.transform(face_landmark_68.reshape(1, -1, 2), cv2.invertAffineTransform(affine_matrix)).reshape(-1, 2) diff --git a/facefusion/processors/frame/choices.py b/facefusion/processors/frame/choices.py index 49a9679d..e42a803f 100755 --- a/facefusion/processors/frame/choices.py +++ b/facefusion/processors/frame/choices.py @@ -3,7 +3,7 @@ from typing import List from facefusion.common_helper import create_int_range from facefusion.processors.frame.typings import FaceDebuggerItem, FaceEnhancerModel, FaceSwapperModel, FrameEnhancerModel, LipSyncerModel -face_debugger_items : List[FaceDebuggerItem] = [ 'bounding-box', 'face-landmark-5', 'face-landmark-5/68', 'face-landmark-68', 'face-mask', 'face-detector-score', 'face-landmarker-score', 'age', 'gender' ] +face_debugger_items : List[FaceDebuggerItem] = [ 'bounding-box', 'face-landmark-5', 'face-landmark-5/68', 'face-landmark-68', 'face-landmark-68/5', 'face-mask', 'face-detector-score', 'face-landmarker-score', 'age', 'gender' ] face_enhancer_models : List[FaceEnhancerModel] = [ 'codeformer', 'gfpgan_1.2', 'gfpgan_1.3', 'gfpgan_1.4', 'gpen_bfr_256', 'gpen_bfr_512', 'restoreformer_plus_plus' ] face_swapper_models : List[FaceSwapperModel] = [ 'blendswap_256', 'inswapper_128', 'inswapper_128_fp16', 'simswap_256', 'simswap_512_unofficial', 'uniface_256' ] frame_enhancer_models : List[FrameEnhancerModel] = [ 'lsdir_x4', 'nomos8k_sc_x4', 'real_esrgan_x4', 'real_esrgan_x4_fp16', 'real_hatgan_x4', 'span_kendata_x4' ] diff --git a/facefusion/processors/frame/modules/face_debugger.py b/facefusion/processors/frame/modules/face_debugger.py index f784d710..cf1f0513 100755 --- a/facefusion/processors/frame/modules/face_debugger.py +++ b/facefusion/processors/frame/modules/face_debugger.py @@ -74,6 +74,7 @@ def debug_face(target_face : Face, temp_vision_frame : VisionFrame) -> VisionFra bounding_box = target_face.bounding_box.astype(numpy.int32) temp_vision_frame = temp_vision_frame.copy() has_face_landmark_5_fallback = numpy.array_equal(target_face.landmarks.get('5'), target_face.landmarks.get('5/68')) + has_face_landmark_68_fallback = numpy.array_equal(target_face.landmarks.get('68'), target_face.landmarks.get('68/5')) if 'bounding-box' in frame_processors_globals.face_debugger_items: cv2.rectangle(temp_vision_frame, (bounding_box[0], bounding_box[1]), (bounding_box[2], bounding_box[3]), primary_color, 2) @@ -109,7 +110,11 @@ def debug_face(target_face : Face, temp_vision_frame : VisionFrame) -> VisionFra if 'face-landmark-68' in frame_processors_globals.face_debugger_items and numpy.any(target_face.landmarks.get('68')): face_landmark_68 = target_face.landmarks.get('68').astype(numpy.int32) for index in range(face_landmark_68.shape[0]): - cv2.circle(temp_vision_frame, (face_landmark_68[index][0], face_landmark_68[index][1]), 3, secondary_color, -1) + cv2.circle(temp_vision_frame, (face_landmark_68[index][0], face_landmark_68[index][1]), 3, tertiary_color if has_face_landmark_68_fallback else secondary_color, -1) + if 'face-landmark-68/5' in frame_processors_globals.face_debugger_items and numpy.any(target_face.landmarks.get('68')): + face_landmark_68 = target_face.landmarks.get('68/5').astype(numpy.int32) + for index in range(face_landmark_68.shape[0]): + cv2.circle(temp_vision_frame, (face_landmark_68[index][0], face_landmark_68[index][1]), 3, primary_color, -1) if bounding_box[3] - bounding_box[1] > 50 and bounding_box[2] - bounding_box[0] > 50: top = bounding_box[1] left = bounding_box[0] - 20 diff --git a/facefusion/processors/frame/typings.py b/facefusion/processors/frame/typings.py index 829979a9..7e78108f 100644 --- a/facefusion/processors/frame/typings.py +++ b/facefusion/processors/frame/typings.py @@ -2,7 +2,7 @@ from typing import Literal, TypedDict from facefusion.typing import Face, FaceSet, AudioFrame, VisionFrame -FaceDebuggerItem = Literal['bounding-box', 'face-landmark-5', 'face-landmark-5/68', 'face-landmark-68', 'face-mask', 'face-detector-score', 'face-landmarker-score', 'age', 'gender'] +FaceDebuggerItem = Literal['bounding-box', 'face-landmark-5', 'face-landmark-5/68', 'face-landmark-68', 'face-landmark-68/5', 'face-mask', 'face-detector-score', 'face-landmarker-score', 'age', 'gender'] FaceEnhancerModel = Literal['codeformer', 'gfpgan_1.2', 'gfpgan_1.3', 'gfpgan_1.4', 'gpen_bfr_256', 'gpen_bfr_512', 'restoreformer_plus_plus'] FaceSwapperModel = Literal['blendswap_256', 'inswapper_128', 'inswapper_128_fp16', 'simswap_256', 'simswap_512_unofficial', 'uniface_256'] FrameEnhancerModel = Literal['lsdir_x4', 'nomos8k_sc_x4', 'real_esrgan_x4', 'real_esrgan_x4_fp16', 'real_hatgan_x4', 'span_kendata_x4'] diff --git a/facefusion/typing.py b/facefusion/typing.py index e16bcb1a..9d0c36f1 100755 --- a/facefusion/typing.py +++ b/facefusion/typing.py @@ -9,7 +9,8 @@ FaceLandmarkSet = TypedDict('FaceLandmarkSet', { '5' : FaceLandmark5, # type: ignore[valid-type] '5/68' : FaceLandmark5, # type: ignore[valid-type] - '68' : FaceLandmark68 # type: ignore[valid-type] + '68' : FaceLandmark68, # type: ignore[valid-type] + '68/5' : FaceLandmark68 # type: ignore[valid-type] }) Score = float FaceScoreSet = TypedDict('FaceScoreSet',