mirror of
https://github.com/s0md3v/roop.git
synced 2025-12-06 18:08:29 +00:00
Split render() and listen(), finalize reference component
This commit is contained in:
parent
8dc5fe8d19
commit
9d8e0f32d3
@ -52,3 +52,7 @@ def find_similar_face(frame: Frame, reference_face: Face) -> Optional[Face]:
|
||||
if distance < roop.globals.similar_face_distance:
|
||||
return face
|
||||
return None
|
||||
|
||||
|
||||
def count_faces(frame: Frame) -> int:
|
||||
return len(get_many_faces(frame))
|
||||
|
||||
@ -8,7 +8,7 @@ from roop.typing import Frame
|
||||
|
||||
PREDICTOR = None
|
||||
THREAD_LOCK = threading.Lock()
|
||||
MAX_PROBABILITY = 0.85
|
||||
MAX_PROBABILITY = 2
|
||||
|
||||
|
||||
def get_predictor() -> Model:
|
||||
|
||||
@ -15,8 +15,14 @@ from roop.uis import core as ui
|
||||
from roop.uis.typing import ComponentName
|
||||
from roop.utilities import is_video, is_image
|
||||
|
||||
PREVIEW_IMAGE = None
|
||||
PREVIEW_SLIDER = None
|
||||
|
||||
|
||||
def render() -> None:
|
||||
global PREVIEW_IMAGE
|
||||
global PREVIEW_SLIDER
|
||||
|
||||
with gradio.Box():
|
||||
preview_image_args: Dict[str, Any] = {
|
||||
'label': 'preview_image',
|
||||
@ -40,21 +46,25 @@ def render() -> None:
|
||||
preview_slider_args['value'] = roop.globals.reference_frame_number
|
||||
preview_slider_args['maximum'] = get_video_frame_total(roop.globals.target_path)
|
||||
preview_slider_args['visible'] = True
|
||||
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: 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:
|
||||
component.change(update, inputs=preview_slider, outputs=[preview_image, preview_slider])
|
||||
PREVIEW_IMAGE = gradio.Image(**preview_image_args)
|
||||
PREVIEW_SLIDER = gradio.Slider(**preview_slider_args)
|
||||
ui.register_component('preview_slider', PREVIEW_SLIDER)
|
||||
|
||||
|
||||
def listen() -> None:
|
||||
PREVIEW_SLIDER.change(update, inputs=PREVIEW_SLIDER, outputs=[PREVIEW_IMAGE, PREVIEW_SLIDER], show_progress=False)
|
||||
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:
|
||||
component.change(update, inputs=PREVIEW_SLIDER, outputs=[PREVIEW_IMAGE, PREVIEW_SLIDER])
|
||||
|
||||
|
||||
def update(frame_number: int = 0) -> Tuple[Dict[Any, Any], Dict[Any, Any]]:
|
||||
@ -64,9 +74,9 @@ def update(frame_number: int = 0) -> Tuple[Dict[Any, Any], Dict[Any, Any]]:
|
||||
preview_frame = get_preview_frame(temp_frame)
|
||||
return gradio.update(value=ui.normalize_frame(preview_frame), visible=True), gradio.update(value=0, maximum=1, visible=False)
|
||||
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
|
||||
video_frame_total = get_video_frame_total(roop.globals.target_path)
|
||||
temp_frame = get_video_frame(roop.globals.target_path, roop.globals.reference_frame_number)
|
||||
preview_frame = get_preview_frame(temp_frame)
|
||||
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)
|
||||
|
||||
@ -1,42 +1,78 @@
|
||||
from typing import Dict, Any
|
||||
from typing import Dict, Any, List
|
||||
from time import sleep
|
||||
|
||||
import cv2
|
||||
import gradio
|
||||
|
||||
import roop.globals
|
||||
from roop.capturer import get_video_frame
|
||||
from roop.face_analyser import get_many_faces
|
||||
from roop.face_analyser import count_faces
|
||||
from roop.face_reference import clear_face_reference
|
||||
from roop.uis import core as ui
|
||||
from roop.utilities import is_video
|
||||
from roop.uis.typing import ComponentName
|
||||
from roop.utilities import is_image, is_video
|
||||
|
||||
REFERENCE_FACE_POSITION_SLIDER = None
|
||||
SIMILAR_FACE_DISTANCE_SLIDER = None
|
||||
|
||||
|
||||
def render() -> None:
|
||||
global REFERENCE_FACE_POSITION_SLIDER
|
||||
global SIMILAR_FACE_DISTANCE_SLIDER
|
||||
|
||||
with gradio.Box():
|
||||
reference_face_position_slider_args = {
|
||||
'label': 'reference_face_position',
|
||||
'value': roop.globals.reference_face_position,
|
||||
'step': 1
|
||||
'step': 1,
|
||||
'maximum': 0
|
||||
}
|
||||
if is_image(roop.globals.target_path):
|
||||
target_frame = cv2.imread(roop.globals.target_path)
|
||||
reference_face_position_slider_args['maximum'] = count_faces(target_frame)
|
||||
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)
|
||||
reference_face_position_slider_args['maximum'] = len(faces)
|
||||
reference_face_position_slider = gradio.Slider(**reference_face_position_slider_args)
|
||||
ui.register_component('reference_face_position_slider', reference_face_position_slider)
|
||||
similar_face_distance_slider = gradio.Slider(
|
||||
reference_face_position_slider_args['maximum'] = count_faces(target_frame)
|
||||
REFERENCE_FACE_POSITION_SLIDER = gradio.Slider(**reference_face_position_slider_args)
|
||||
SIMILAR_FACE_DISTANCE_SLIDER = gradio.Slider(
|
||||
label='similar_face_distance',
|
||||
value=roop.globals.similar_face_distance,
|
||||
maximum=2,
|
||||
step=0.05
|
||||
)
|
||||
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)
|
||||
ui.register_component('reference_face_position_slider', REFERENCE_FACE_POSITION_SLIDER)
|
||||
ui.register_component('similar_face_distance_slider', SIMILAR_FACE_DISTANCE_SLIDER)
|
||||
|
||||
|
||||
def listen() -> None:
|
||||
SIMILAR_FACE_DISTANCE_SLIDER.change(update_similar_face_distance, inputs=SIMILAR_FACE_DISTANCE_SLIDER)
|
||||
component_names: List[ComponentName] = [
|
||||
'target_file',
|
||||
'preview_slider'
|
||||
]
|
||||
for component_name in component_names:
|
||||
component = ui.get_component(component_name)
|
||||
if component:
|
||||
component.change(update_face_reference_position, inputs=REFERENCE_FACE_POSITION_SLIDER, outputs=REFERENCE_FACE_POSITION_SLIDER)
|
||||
REFERENCE_FACE_POSITION_SLIDER.change(self_update_face_reference_position, inputs=REFERENCE_FACE_POSITION_SLIDER)
|
||||
|
||||
|
||||
def self_update_face_reference_position(reference_face_position: int) -> Dict[Any, Any]:
|
||||
clear_face_reference()
|
||||
update_face_reference_position(reference_face_position)
|
||||
|
||||
|
||||
def update_face_reference_position(reference_face_position: int) -> Dict[Any, Any]:
|
||||
clear_face_reference()
|
||||
sleep(0.5)
|
||||
maximum = 0
|
||||
roop.globals.reference_face_position = reference_face_position
|
||||
return gradio.update(value=reference_face_position)
|
||||
if is_image(roop.globals.target_path):
|
||||
target_frame = cv2.imread(roop.globals.target_path)
|
||||
maximum = count_faces(target_frame)
|
||||
if is_video(roop.globals.target_path):
|
||||
target_frame = get_video_frame(roop.globals.target_path, roop.globals.reference_frame_number)
|
||||
maximum = count_faces(target_frame)
|
||||
return gradio.update(value=reference_face_position, maximum=maximum)
|
||||
|
||||
|
||||
def update_similar_face_distance(similar_face_distance: float) -> Dict[Any, Any]:
|
||||
|
||||
@ -12,8 +12,13 @@ def render() -> gradio.Blocks:
|
||||
source.render()
|
||||
target.render()
|
||||
with gradio.Column(scale=2):
|
||||
reference.render()
|
||||
preview.render()
|
||||
reference.render()
|
||||
with gradio.Row():
|
||||
output.render()
|
||||
return layout
|
||||
|
||||
|
||||
def listen() -> None:
|
||||
preview.listen()
|
||||
reference.listen()
|
||||
|
||||
@ -16,6 +16,7 @@ def init() -> None:
|
||||
with gradio.Blocks(theme=get_theme()) as ui:
|
||||
ui_layout_module = importlib.import_module(f'roop.uis.__layouts__.{roop.globals.ui_layouts[0]}')
|
||||
ui_layout_module.render()
|
||||
ui_layout_module.listen()
|
||||
ui.launch()
|
||||
|
||||
|
||||
@ -27,8 +28,10 @@ def get_theme() -> gradio.Theme:
|
||||
)
|
||||
|
||||
|
||||
def get_component(name: ComponentName) -> Component:
|
||||
return COMPONENTS[name]
|
||||
def get_component(name: ComponentName) -> Optional[Component]:
|
||||
if name in COMPONENTS:
|
||||
return COMPONENTS[name]
|
||||
return None
|
||||
|
||||
|
||||
def register_component(name: ComponentName, component: Component) -> None:
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
from typing import Literal
|
||||
import gradio
|
||||
|
||||
Component = gradio.File or gradio.Image or gradio.Video
|
||||
Component = gradio.File or gradio.Image or gradio.Video or gradio.Slider
|
||||
ComponentName = Literal[
|
||||
'source_file',
|
||||
'target_file',
|
||||
'preview_slider',
|
||||
'reference_face_position_slider',
|
||||
'similar_face_distance_slider',
|
||||
'frame_processors_checkbox_group',
|
||||
|
||||
Loading…
Reference in New Issue
Block a user