Skip to content

Commit

Permalink
Split render() and listen(), finalize reference component
Browse files Browse the repository at this point in the history
  • Loading branch information
henryruhs committed Aug 6, 2023
1 parent 8dc5fe8 commit 9d8e0f3
Show file tree
Hide file tree
Showing 7 changed files with 95 additions and 36 deletions.
4 changes: 4 additions & 0 deletions roop/face_analyser.py
Expand Up @@ -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))
2 changes: 1 addition & 1 deletion roop/predictor.py
Expand Up @@ -8,7 +8,7 @@

PREDICTOR = None
THREAD_LOCK = threading.Lock()
MAX_PROBABILITY = 0.85
MAX_PROBABILITY = 2


def get_predictor() -> Model:
Expand Down
44 changes: 27 additions & 17 deletions roop/uis/__components__/preview.py
Expand Up @@ -15,8 +15,14 @@
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',
Expand All @@ -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]]:
Expand All @@ -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)
Expand Down
64 changes: 50 additions & 14 deletions roop/uis/__components__/reference.py
@@ -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 update_face_reference_position(reference_face_position: int) -> Dict[Any, Any]:
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]:
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]:
Expand Down
7 changes: 6 additions & 1 deletion roop/uis/__layouts__/default.py
Expand Up @@ -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()
7 changes: 5 additions & 2 deletions roop/uis/core.py
Expand Up @@ -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()


Expand All @@ -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:
Expand Down
3 changes: 2 additions & 1 deletion roop/uis/typing.py
@@ -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',
Expand Down

0 comments on commit 9d8e0f3

Please sign in to comment.