Finalize face reference implementation

This commit is contained in:
henryruhs 2023-07-02 17:20:55 +02:00
parent 33340ecafd
commit f9e663ecac
5 changed files with 56 additions and 22 deletions

View File

@ -22,6 +22,12 @@ def get_face_analyser() -> Any:
return FACE_ANALYSER
def clear_face_analyser() -> Any:
global FACE_ANALYSER
FACE_ANALYSER = None
def get_one_face(frame: Frame, position: int = 0) -> Optional[Face]:
faces = get_many_faces(frame)
try:

21
roop/face_reference.py Normal file
View File

@ -0,0 +1,21 @@
from typing import Optional
from roop.typing import Face
FACE_REFERENCE = None
def get_face_reference() -> Optional[Face]:
return FACE_REFERENCE
def set_face_reference(face: Face) -> None:
global FACE_REFERENCE
FACE_REFERENCE = face
def clear_face_reference() -> None:
global FACE_REFERENCE
FACE_REFERENCE = None

View File

@ -27,6 +27,12 @@ def get_face_enhancer() -> Any:
return FACE_ENHANCER
def clear_face_enhancer() -> None:
global FACE_ENHANCER
FACE_ENHANCER = None
def pre_check() -> bool:
download_directory_path = resolve_relative_path('../models')
conditional_download(download_directory_path, ['https://huggingface.co/henryruhs/roop/resolve/main/GFPGANv1.4.pth'])
@ -41,9 +47,7 @@ def pre_start() -> bool:
def post_process() -> None:
global FACE_ENHANCER
FACE_ENHANCER = None
clear_face_enhancer()
def enhance_face(temp_frame: Frame) -> Frame:

View File

@ -7,6 +7,7 @@ import roop.globals
import roop.processors.frame.core
from roop.core import update_status
from roop.face_analyser import get_one_face, get_many_faces, find_similar_face
from roop.face_reference import get_face_reference, set_face_reference, clear_face_reference
from roop.typing import Face, Frame
from roop.utilities import conditional_download, resolve_relative_path, is_image, is_video
@ -14,8 +15,6 @@ FACE_SWAPPER = None
THREAD_LOCK = threading.Lock()
NAME = 'ROOP.FACE-SWAPPER'
reference_face = None
def get_face_swapper() -> Any:
global FACE_SWAPPER
@ -27,6 +26,12 @@ def get_face_swapper() -> Any:
return FACE_SWAPPER
def clear_face_swapper() -> None:
global FACE_SWAPPER
FACE_SWAPPER = None
def pre_check() -> bool:
download_directory_path = resolve_relative_path('../models')
conditional_download(download_directory_path, ['https://huggingface.co/henryruhs/roop/resolve/main/inswapper_128.onnx'])
@ -47,10 +52,8 @@ def pre_start() -> bool:
def post_process() -> None:
global FACE_SWAPPER, reference_face
FACE_SWAPPER = None
reference_face = None
clear_face_swapper()
clear_face_reference()
def swap_face(source_face: Face, target_face: Face, temp_frame: Frame) -> Frame:
@ -71,11 +74,12 @@ def process_frame(source_face: Face, reference_face: Face, temp_frame: Frame) ->
def process_frames(source_path: str, temp_frame_paths: List[str], update: Callable[[], None]) -> None:
global reference_face
source_face = get_one_face(cv2.imread(source_path))
if not reference_face:
reference_face = get_one_face(cv2.imread(temp_frame_paths[0]), roop.globals.face_position)
if not get_face_reference():
reference_face = get_one_face(cv2.imread(temp_frame_paths[0]), roop.globals.face_position)
set_face_reference(reference_face)
else:
reference_face = get_face_reference()
for temp_frame_path in temp_frame_paths:
temp_frame = cv2.imread(temp_frame_path)
result = process_frame(source_face, reference_face, temp_frame)
@ -85,12 +89,9 @@ def process_frames(source_path: str, temp_frame_paths: List[str], update: Callab
def process_image(source_path: str, target_path: str, output_path: str) -> None:
global reference_face
source_face = get_one_face(cv2.imread(source_path))
target_frame = cv2.imread(target_path)
if not reference_face:
reference_face = get_one_face(cv2.imread(target_frame), roop.globals.face_position)
reference_face = get_one_face(target_frame, roop.globals.face_position)
result = process_frame(source_face, reference_face, target_frame)
cv2.imwrite(output_path, result)

View File

@ -9,6 +9,7 @@ import roop.globals
import roop.metadata
from roop.face_analyser import get_one_face
from roop.capturer import get_video_frame, get_video_frame_total
from roop.face_reference import get_face_reference, set_face_reference, clear_face_reference
from roop.predicter import predict_frame
from roop.processors.frame.core import get_frame_processors_modules
from roop.utilities import is_image, is_video, resolve_relative_path
@ -31,8 +32,6 @@ source_label = None
target_label = None
status_label = None
reference_face = None
def init(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.CTk:
global ROOT, PREVIEW
@ -146,6 +145,7 @@ def select_target_path() -> None:
global RECENT_DIRECTORY_TARGET
PREVIEW.withdraw()
clear_face_reference()
target_path = ctk.filedialog.askopenfilename(title='select an target image or video', initialdir=RECENT_DIRECTORY_TARGET)
if is_image(target_path):
roop.globals.target_path = target_path
@ -201,6 +201,7 @@ def render_video_preview(video_path: str, size: Tuple[int, int], frame_number: i
def toggle_preview() -> None:
if PREVIEW.state() == 'normal':
PREVIEW.withdraw()
clear_face_reference()
elif roop.globals.source_path and roop.globals.target_path:
init_preview()
update_preview()
@ -218,15 +219,16 @@ def init_preview() -> None:
def update_preview(frame_number: int = 0) -> None:
global reference_face
if roop.globals.source_path and roop.globals.target_path:
temp_frame = get_video_frame(roop.globals.target_path, frame_number)
if predict_frame(temp_frame):
quit()
source_face = get_one_face(cv2.imread(roop.globals.source_path))
if not reference_face:
if not get_face_reference():
reference_face = get_one_face(temp_frame, roop.globals.face_position)
set_face_reference(reference_face)
else:
reference_face = get_face_reference()
for frame_processor in get_frame_processors_modules(roop.globals.frame_processors):
temp_frame = frame_processor.process_frame(
source_face,