diff --git a/apps/DeepFaceLive/backend/FaceSwapper.py b/apps/DeepFaceLive/backend/FaceSwapper.py index 5ccde8c..e5f01d5 100644 --- a/apps/DeepFaceLive/backend/FaceSwapper.py +++ b/apps/DeepFaceLive/backend/FaceSwapper.py @@ -1,5 +1,6 @@ import time from pathlib import Path +from typing import Dict import numpy as np from modelhub import DFLive @@ -24,7 +25,7 @@ class FaceSwapper(BackendHost): worker_start_args=[weak_heap, reemit_frame_signal, bc_in, bc_out, dfm_models_path]) def get_control_sheet(self) -> 'Sheet.Host': return super().get_control_sheet() - + def _get_name(self): return super()._get_name()# + f'{self._id}' @@ -48,7 +49,7 @@ class FaceSwapperWorker(BackendWorker): state, cs = self.get_state(), self.get_control_sheet() - cs.model.call_on_selected(self.on_cs_model_info) + cs.model.call_on_selected(self.on_cs_model) cs.device.call_on_selected(self.on_cs_device) cs.swap_all_faces.call_on_flag(self.on_cs_swap_all_faces) cs.face_id.call_on_number(self.on_cs_face_id) @@ -59,32 +60,31 @@ class FaceSwapperWorker(BackendWorker): cs.pre_gamma_blue.call_on_number(self.on_cs_pre_gamma_blue) cs.two_pass.call_on_flag(self.on_cs_two_pass) - cs.model.enable() - cs.model.set_choices( DFLive.get_available_models_info(dfm_models_path), none_choice_name='@misc.menu_select') - cs.model.select(state.model) + cs.device.enable() + cs.device.set_choices( DFLive.get_available_devices(), none_choice_name='@misc.menu_select') + cs.device.select(state.device) - def on_cs_model_info(self, idx, model): + def on_cs_device(self, idx, device): state, cs = self.get_state(), self.get_control_sheet() - if state.model == model: - - cs.device.enable() - cs.device.set_choices( DFLive.get_available_devices(), none_choice_name='@misc.menu_select') - cs.device.select(state.model_state.device) + if device is not None and state.device == device: + cs.model.enable() + cs.model.set_choices( DFLive.get_available_models_info(self.dfm_models_path), none_choice_name='@misc.menu_select') + cs.model.select(state.model) else: - state.model = model - state.model_state = ModelState() + state.device = device self.save_state() self.restart() - def on_cs_device(self, idxs, device): + def on_cs_model(self, idx, model): state, cs = self.get_state(), self.get_control_sheet() - if device is not None and state.model_state.device == device: - self.dfm_model_initializer = DFLive.DFMModel_from_info(state.model, device) + + if state.model == model: + state.model_state = state.models_state[model.get_name()] = state.models_state.get(model.get_name(), ModelState()) + self.dfm_model_initializer = DFLive.DFMModel_from_info(state.model, state.device) self.set_busy(True) else: - state.model_state = ModelState() - state.model_state.device = device + state.model = model self.save_state() self.restart() @@ -338,7 +338,6 @@ class Sheet: self.two_pass = lib_csw.Flag.Host() class ModelState(BackendWorkerState): - device = None swap_all_faces : bool = None face_id : int = None morph_factor : float = None @@ -349,5 +348,9 @@ class ModelState(BackendWorkerState): two_pass : bool = None class WorkerState(BackendWorkerState): - model : DFLive.DFMModelInfo = None - model_state : ModelState = None + def __init__(self): + super().__init__() + self.device = None + self.model : DFLive.DFMModelInfo = None + self.models_state : Dict[str, ModelState] = {} + self.model_state : ModelState = None diff --git a/apps/DeepFaceLive/ui/QFaceSwapper.py b/apps/DeepFaceLive/ui/QFaceSwapper.py index 2db2699..bca47b9 100644 --- a/apps/DeepFaceLive/ui/QFaceSwapper.py +++ b/apps/DeepFaceLive/ui/QFaceSwapper.py @@ -25,6 +25,9 @@ class QFaceSwapper(QBackendPanel): btn_open_folder = self.btn_open_folder = qtx.QXPushButton(image = QXImageDB.eye_outline('light gray'), tooltip_text='Reveal in Explorer', released=self._btn_open_folder_released, fixed_size=(24,22) ) + q_device_label = QLabelPopupInfo(label=L('@common.device'), popup_info_text=L('@common.help.device') ) + q_device = QComboBoxCSWDynamicSingleSwitch(cs.device, reflect_state_widgets=[q_device_label]) + q_model_label = QLabelPopupInfo(label=L('@QFaceSwapper.model'), popup_info_text=L('@QFaceSwapper.help.model') ) q_model = QComboBoxCSWDynamicSingleSwitch(cs.model, reflect_state_widgets=[q_model_label, btn_open_folder]) @@ -33,9 +36,6 @@ class QFaceSwapper(QBackendPanel): q_model_info_label = self._q_model_info_label = QLabelPopupInfoCSWInfoLabel(cs.model_info_label) - q_device_label = QLabelPopupInfo(label=L('@common.device'), popup_info_text=L('@common.help.device') ) - q_device = QComboBoxCSWDynamicSingleSwitch(cs.device, reflect_state_widgets=[q_device_label]) - q_swap_all_faces_label = QLabelPopupInfo(label=L('@QFaceSwapper.swap_all_faces') ) q_swap_all_faces = QCheckBoxCSWFlag(cs.swap_all_faces, reflect_state_widgets=[q_swap_all_faces_label]) @@ -59,6 +59,9 @@ class QFaceSwapper(QBackendPanel): grid_l = qtx.QXGridLayout( spacing=5) row = 0 + grid_l.addWidget(q_device_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) + grid_l.addWidget(q_device, row, 1, alignment=qtx.AlignLeft ) + row += 1 grid_l.addWidget(q_model_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addLayout(qtx.QXHBoxLayout([q_model, 2, btn_open_folder, 2, q_model_info_label]), row, 1 ) row += 1 @@ -66,9 +69,6 @@ class QFaceSwapper(QBackendPanel): row += 1 grid_l.addWidget(q_model_dl_error, row, 0, 1, 2 ) row += 1 - grid_l.addWidget(q_device_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) - grid_l.addWidget(q_device, row, 1, alignment=qtx.AlignLeft ) - row += 1 grid_l.addWidget( q_swap_all_faces_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addLayout( qtx.QXHBoxLayout([q_swap_all_faces, 4, q_face_id_label, 4, q_face_id ]), row, 1, alignment=qtx.AlignLeft ) row += 1