Use face position slider

This commit is contained in:
henryruhs 2023-08-02 08:48:58 +02:00
parent b0b3608b94
commit b4e5ee8140
4 changed files with 38 additions and 24 deletions

View File

@ -1,5 +1,5 @@
from time import sleep
from typing import Any, Dict, Tuple
from typing import Any, Dict, Tuple, List
import cv2
import gradio
@ -12,6 +12,7 @@ from roop.predictor import predict_frame
from roop.processors.frame.core import load_frame_processor_module
from roop.typing import Frame
from roop.uis import core as ui
from roop.uis.typing import ComponentName
from roop.utilities import is_video, is_image
@ -42,7 +43,14 @@ def render() -> None:
preview_image = gradio.Image(**preview_image_args)
preview_slider = gradio.Slider(**preview_slider_args)
preview_slider.change(update, inputs=preview_slider, outputs=[preview_image, preview_slider], show_progress=False)
component_names = ['source_file', 'target_file', 'frame_processors_checkbox_group', 'many_faces_checkbox']
component_names: List[ComponentName] = [
'source_file',
'target_file',
'reference_face_position_slider',
'similar_face_distance_slider',
'frame_processors_checkbox_group',
'many_faces_checkbox'
]
for component_name in component_names:
component = ui.get_component(component_name)
if component:
@ -58,8 +66,9 @@ def update(frame_number: int = 0) -> Tuple[Dict[Any, Any], Dict[Any, Any]]:
if is_video(roop.globals.target_path):
video_frame_total = get_video_frame_total(roop.globals.target_path)
temp_frame = get_video_frame(roop.globals.target_path, frame_number)
roop.globals.reference_frame_number = frame_number
preview_frame = get_preview_frame(temp_frame)
return gradio.update(value=ui.normalize_frame(preview_frame), visible=True), gradio.update(value=frame_number, maximum=video_frame_total, visible=True)
return gradio.update(value=ui.normalize_frame(preview_frame), visible=True), gradio.update(maximum=video_frame_total, visible=True)
return gradio.update(value=None, visible=False), gradio.update(value=0, maximum=1, visible=False)

View File

@ -2,41 +2,45 @@ from time import sleep
from typing import Dict, Any
import gradio
import numpy
import roop.globals
from roop.capturer import get_video_frame
from roop.face_analyser import get_many_faces
from roop.face_reference import clear_face_reference
from roop.uis import core as ui
from roop.utilities import is_video
def render() -> None:
with gradio.Box():
reference_face_gallery_args: Dict[str, Any] = {
'label': 'reference_faces',
'columns': 6,
'height': 200,
'allow_preview': False,
'visible': True
}
if is_video(roop.globals.target_path):
target_frame = get_video_frame(roop.globals.target_path, roop.globals.reference_frame_number)
faces = get_many_faces(target_frame)
if faces:
value = []
for face in faces:
start_x, start_y, end_x, end_y = map(int, face['bbox'])
crop_frame = target_frame[start_y:end_y, start_x:end_x]
value.append(ui.normalize_frame(crop_frame))
reference_face_gallery_args['value'] = value
else:
reference_face_gallery_args['value'] = []
reference_face_gallery = gradio.Gallery(**reference_face_gallery_args)
reference_face_position_slider = gradio.Slider(
label='reference_face_position',
value=roop.globals.reference_face_position,
maximum=len(faces),
step=1
)
ui.register_component('reference_face_position_slider', reference_face_position_slider)
similar_face_distance_slider = gradio.Slider(
label='similar_face_distance',
value=roop.globals.similar_face_distance,
minimum=0,
maximum=2,
step=0.05
)
ui.register_component('reference_face_gallery', reference_face_gallery)
ui.register_component('similar_face_distance_slider', reference_face_position_slider)
reference_face_position_slider.change(update_face_reference_position, inputs=reference_face_position_slider)
similar_face_distance_slider.change(update_similar_face_distance, inputs=similar_face_distance_slider)
def update_face_reference_position(reference_face_position: int) -> Dict[Any, Any]:
clear_face_reference()
roop.globals.reference_face_position = reference_face_position
return gradio.update(value=reference_face_position)
def update_similar_face_distance(similar_face_distance: float) -> Dict[Any, Any]:
roop.globals.similar_face_distance = similar_face_distance
return gradio.update(value=similar_face_distance)

View File

@ -12,8 +12,8 @@ def render() -> gradio.Blocks:
source.render()
target.render()
with gradio.Column(scale=2):
preview.render()
reference.render()
preview.render()
with gradio.Row():
output.render()
return layout

View File

@ -5,7 +5,8 @@ Component = gradio.File or gradio.Image or gradio.Video
ComponentName = Literal[
'source_file',
'target_file',
'reference_face_gallery',
'reference_face_position_slider',
'similar_face_distance_slider',
'frame_processors_checkbox_group',
'many_faces_checkbox'
]