def __init__(self, backend : FaceAligner): cs = backend.get_control_sheet() q_align_mode_label = QLabelPopupInfo(label=L('@QFaceAligner.align_mode'), popup_info_text=L('@QFaceAligner.help.align_mode')) q_align_mode = QComboBoxCSWDynamicSingleSwitch(cs.align_mode, reflect_state_widgets=[q_align_mode_label]) q_face_coverage_label = QLabelPopupInfo(label=L('@QFaceAligner.face_coverage'), popup_info_text=L('@QFaceAligner.help.face_coverage') ) q_face_coverage = QSpinBoxCSWNumber(cs.face_coverage, reflect_state_widgets=[q_face_coverage_label]) q_resolution_label = QLabelPopupInfo(label=L('@QFaceAligner.resolution'), popup_info_text=L('@QFaceAligner.help.resolution') ) q_resolution = QSpinBoxCSWNumber(cs.resolution, reflect_state_widgets=[q_resolution_label]) q_exclude_moving_parts_label = QLabelPopupInfo(label=L('@QFaceAligner.exclude_moving_parts'), popup_info_text=L('@QFaceAligner.help.exclude_moving_parts') ) q_exclude_moving_parts = QCheckBoxCSWFlag(cs.exclude_moving_parts, reflect_state_widgets=[q_exclude_moving_parts_label]) q_head_mode_label = QLabelPopupInfo(label=L('@QFaceAligner.head_mode'), popup_info_text=L('@QFaceAligner.help.head_mode') ) q_head_mode = QCheckBoxCSWFlag(cs.head_mode, reflect_state_widgets=[q_head_mode_label]) q_freeze_z_rotation_label = QLabelPopupInfo(label=L('@QFaceAligner.freeze_z_rotation') ) q_freeze_z_rotation = QCheckBoxCSWFlag(cs.freeze_z_rotation, reflect_state_widgets=[q_freeze_z_rotation_label]) q_x_offset_label = QLabelPopupInfo(label=L('@QFaceAligner.x_offset')) q_x_offset = QSpinBoxCSWNumber(cs.x_offset, reflect_state_widgets=[q_x_offset_label]) q_y_offset_label = QLabelPopupInfo(label=L('@QFaceAligner.y_offset')) q_y_offset = QSpinBoxCSWNumber(cs.y_offset, reflect_state_widgets=[q_y_offset_label]) grid_l = qtx.QXGridLayout(spacing=5) row = 0 grid_l.addWidget(q_align_mode_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addWidget(q_align_mode, row, 1, alignment=qtx.AlignLeft ) row += 1 grid_l.addWidget(q_face_coverage_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addWidget(q_face_coverage, row, 1, alignment=qtx.AlignLeft ) row += 1 grid_l.addWidget(q_resolution_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addWidget(q_resolution, row, 1, alignment=qtx.AlignLeft ) row += 1 grid_l.addWidget(q_exclude_moving_parts_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addWidget(q_exclude_moving_parts, row, 1, alignment=qtx.AlignLeft ) row += 1 grid_l.addWidget(q_head_mode_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addWidget(q_head_mode, row, 1, alignment=qtx.AlignLeft ) row += 1 grid_l.addWidget(q_freeze_z_rotation_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addWidget(q_freeze_z_rotation, row, 1, alignment=qtx.AlignLeft ) row += 1 grid_l.addLayout( qtx.QXVBoxLayout([q_x_offset_label, q_y_offset_label]), row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addLayout( qtx.QXHBoxLayout([q_x_offset, q_y_offset]), row, 1, alignment=qtx.AlignLeft ) row += 1 super().__init__(backend, L('@QFaceAligner.module_title'), layout=qtx.QXVBoxLayout([grid_l]))
def __init__( self, backed_weak_heap: backend.BackendWeakHeap, bc: backend.BackendConnection, preview_width=256, ): self._preview_width = preview_width self._timer = qtx.QXTimer(interval=16, timeout=self._on_timer_16ms, start=True) self._backed_weak_heap = backed_weak_heap self._bc = bc self._bcd_id = None layered_images = self._layered_images = qtx.QXFixedLayeredImages( preview_width, preview_width) info_label = self._info_label = qtx.QXLabel( font=QXFontDB.get_fixedwidth_font(size=7)) main_l = qtx.QXVBoxLayout([(layered_images, qtx.AlignCenter), (info_label, qtx.AlignCenter)]) super().__init__(title=L('@QBCFaceSwapViewer.title'), content_layout=main_l)
def __init__(self, csw_number: lib_csw.Number.Client, reflect_state_widgets=None): """ Implements lib_csw.Number control by Slider """ if not isinstance(csw_number, lib_csw.Number.Client): raise ValueError('csw_number must be an instance of Number.Client') self._csw_number = csw_number csw_number.call_on_number(self._on_csw_number) csw_number.call_on_config(self._on_csw_config) slider = self._slider = qtx.QXSlider( orientation=qtx.Qt.Orientation.Horizontal, min=0, max=0, tick_position=qtx.QSlider.TickPosition.NoTicks, tick_interval=1, sliderReleased=self._on_slider_sliderReleased, valueChanged=self._on_slider_valueChanged) super().__init__(csw_control=csw_number, reflect_state_widgets=reflect_state_widgets, layout=qtx.QXVBoxLayout([slider]))
def __init__( self, csw_idx: lib_csw.Number.Client, csw_idx_count: lib_csw.Number.Client, ): """ Implements controlable Slider with lib_csw.Number controls """ if not isinstance(csw_idx, lib_csw.Number.Client): raise ValueError('csw_idx must be an instance of Number.Client') if not isinstance(csw_idx_count, lib_csw.Number.Client): raise ValueError( 'csw_idx_count must be an instance of Number.Client') self._csw_idx = csw_idx self._csw_idx_count = csw_idx_count csw_idx.call_on_number(self._on_csw_idx) csw_idx_count.call_on_number(self._on_csw_idx_count) slider = self._slider = qtx.QXSlider( orientation=qtx.Qt.Orientation.Horizontal, min=0, max=0, tick_position=qtx.QSlider.TickPosition.NoTicks, tick_interval=1, valueChanged=self._on_slider_valueChanged) spinbox_font = QXFontDB.Digital7_Mono(11, italic=True) spinbox_index = self._spinbox_index = qtx.QXSpinBox( font=spinbox_font, min=0, max=0, step=1, alignment=qtx.AlignRight, button_symbols=qtx.QAbstractSpinBox.ButtonSymbols.NoButtons, editingFinished=self._on_spinbox_index_editingFinished) spinbox_count = self._spinbox_count = qtx.QXSpinBox( font=spinbox_font, min=0, max=0, step=1, alignment=qtx.AlignRight, button_symbols=qtx.QAbstractSpinBox.ButtonSymbols.NoButtons, readonly=True) super().__init__( csw_control=csw_idx, layout=qtx.QXVBoxLayout([ slider, (qtx.QXFrameHBox( [spinbox_index, qtx.QXLabel(text='/'), spinbox_count], size_policy=('fixed', 'fixed')), qtx.AlignCenter), ]))
def __init__(self, csw_switch: lib_csw.DynamicSingleSwitch.Client, horizontal: bool, radio_buttons: bool): """ Implements lib_csw.DynamicSingleSwitch control with radiobuttons or checkboxes """ if not isinstance(csw_switch, lib_csw.DynamicSingleSwitch.Client): raise ValueError( 'csw_switch must be an instance of DynamicSingleSwitch.Client') self._csw_switch = csw_switch self._is_radio_buttons = radio_buttons csw_switch.call_on_selected(self._on_csw_switch_selected) csw_switch.call_on_choices(self._on_csw_choices) self._btns = [] self._main_l = qtx.QXHBoxLayout() if horizontal else qtx.QXVBoxLayout() super().__init__(csw_control=csw_switch, layout=self._main_l)
def __init__(self, csw_progress: lib_csw.Progress.Client): if not isinstance(csw_progress, lib_csw.Progress.Client): raise ValueError( 'csw_progress must be an instance of Progress.Client') self._csw_progress = csw_progress csw_progress.call_on_progress(self._on_csw_progress) csw_progress.call_on_config(self._on_csw_config) label_title = self._label_title = qtx.QXLabel('', word_wrap=True, hided=True) progressbar = self._progressbar = qtx.QXProgressBar( min=0, max=100, font=QXFontDB.Digital7_Mono(11, italic=True)) super().__init__(csw_control=csw_progress, layout=qtx.QXVBoxLayout([label_title, progressbar]))
def __init__(self, backend): cs = backend.get_control_sheet() q_median_blur_label = QLabelPopupInfo(label=L('@QFrameAdjuster.median_blur_per'), popup_info_text=L('@QFrameAdjuster.help.median_blur_per') ) q_median_blur = QSliderCSWNumber(cs.median_blur_per, reflect_state_widgets=[q_median_blur_label]) q_degrade_bicubic_label = QLabelPopupInfo(label=L('@QFrameAdjuster.degrade_bicubic_per'), popup_info_text=L('@QFrameAdjuster.help.degrade_bicubic_per') ) q_degrade_bicubic = QSliderCSWNumber(cs.degrade_bicubic_per, reflect_state_widgets=[q_degrade_bicubic_label]) grid_l = qtx.QXGridLayout(spacing=5) row = 0 grid_l.addWidget(q_median_blur_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addWidget(q_median_blur, row, 1) row += 1 grid_l.addWidget(q_degrade_bicubic_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addWidget(q_degrade_bicubic, row, 1) row += 1 super().__init__(backend, L('@QFrameAdjuster.module_title'), layout=qtx.QXVBoxLayout([grid_l]) )
def __init__(self, backend : BackendHost, name : str, layout, content_align_top=False): super().__init__() if not isinstance(backend, BackendHost): raise ValueError('backend must be an instance of BackendHost') self._backend = backend self._name = name backend.call_on_state_change(self._on_backend_state_change) backend.call_on_profile_timing(self._on_backend_profile_timing) btn_on_off = self._btn_on_off = qtx.QXPushButton(tooltip_text=L('@QBackendPanel.start'), released=self._on_btn_on_off_released, fixed_width=20) btn_reset_state = self._btn_reset_state = qtx.QXPushButton(image=QXImageDB.settings_reset_outline('gray'), released=self._on_btn_reset_state_released, tooltip_text=L('@QBackendPanel.reset_settings'), fixed_width=20) fps_label = self._fps_label = qtx.QXLabel() bar_widget = self._bar_widget = \ qtx.QXFrameHBox(widgets=[btn_on_off, 1, btn_reset_state, 2, qtx.QXLabel(name, font=QXFontDB.get_default_font(10)), (fps_label, qtx.AlignRight), 2], size_policy=('expanding', 'fixed'), fixed_height=24) content_widget = self._content_widget = qtx.QXFrameHBox([layout], contents_margins=2, enabled=False) l_widgets = [bar_widget, 1] if not content_align_top: l_widgets += [ qtx.QXFrame(size_policy=('expanding','expanding') ) ] l_widgets += [content_widget] l_widgets += [ qtx.QXFrame(size_policy=('expanding', 'expanding') ) ] self.setLayout(qtx.QXVBoxLayout(l_widgets)) btn_on_off.set_image( QXImageDB.power_outline('red') )
def __init__(self, userdata_path): self.userdata_path = userdata_path settings_dirpath = self.settings_dirpath = userdata_path / 'settings' if not settings_dirpath.exists(): settings_dirpath.mkdir(parents=True) super().__init__(app_name='DeepFaceLive', settings_dirpath=settings_dirpath) self.setFont(QXFontDB.get_default_font()) self.setWindowIcon(QXImageDB.app_icon().as_QIcon()) splash_wnd = self.splash_wnd =\ qtx.QXSplashWindow(layout=qtx.QXVBoxLayout([ (qtx.QXLabel(image=QXImageDB.splash_deepfacelive()), qtx.AlignCenter) ], contents_margins=20)) splash_wnd.show() splash_wnd.center_on_screen() self._dfl_wnd = None self._t = qtx.QXTimer(interval=1666, timeout=self._on_splash_wnd_expired, single_shot=True, start=True) self.initialize()
def __init__(self, backend: FaceSwapper, dfm_models_path: Path): self._dfm_models_path = dfm_models_path cs = backend.get_control_sheet() 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]) q_model_dl_error = self._q_model_dl_error = QErrorCSWError( cs.model_dl_error) q_model_dl_progress = self._q_model_dl_progress = QProgressBarCSWProgress( cs.model_dl_progress) q_model_info_label = self._q_model_info_label = QLabelPopupInfoCSWInfoLabel( cs.model_info_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]) q_face_id_label = QLabelPopupInfo( label=L('@QFaceSwapper.face_id'), popup_info_text=L('@QFaceSwapper.help.face_id')) q_face_id = QSpinBoxCSWNumber(cs.face_id, reflect_state_widgets=[q_face_id_label]) q_morph_factor_label = QLabelPopupInfo( label=L('@QFaceSwapper.morph_factor'), popup_info_text=L('@QFaceSwapper.help.morph_factor')) q_morph_factor = QSliderCSWNumber( cs.morph_factor, reflect_state_widgets=[q_morph_factor_label]) q_sharpen_amount_label = QLabelPopupInfo( label=L('@QFaceSwapper.presharpen_amount'), popup_info_text=L('@QFaceSwapper.help.presharpen_amount')) q_sharpen_amount = QSliderCSWNumber( cs.presharpen_amount, reflect_state_widgets=[q_sharpen_amount_label]) q_pre_gamma_label = QLabelPopupInfo( label=L('@QFaceSwapper.pregamma'), popup_info_text=L('@QFaceSwapper.help.pregamma')) q_pre_gamma_red = QSpinBoxCSWNumber( cs.pre_gamma_red, reflect_state_widgets=[q_pre_gamma_label]) q_pre_gamma_green = QSpinBoxCSWNumber(cs.pre_gamma_green) q_pre_gamma_blue = QSpinBoxCSWNumber(cs.pre_gamma_blue) q_post_gamma_label = QLabelPopupInfo( label=L('@QFaceSwapper.postgamma')) q_post_gamma_red = QSpinBoxCSWNumber( cs.post_gamma_red, reflect_state_widgets=[q_post_gamma_label]) q_post_gamma_green = QSpinBoxCSWNumber(cs.post_gamma_green) q_post_gamma_blue = QSpinBoxCSWNumber(cs.post_gamma_blue) q_two_pass_label = QLabelPopupInfo( label=L('@QFaceSwapper.two_pass'), popup_info_text=L('@QFaceSwapper.help.two_pass')) q_two_pass = QCheckBoxCSWFlag(cs.two_pass, reflect_state_widgets=[q_two_pass_label]) 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 grid_l.addWidget(q_model_dl_progress, row, 0, 1, 2) row += 1 grid_l.addWidget(q_model_dl_error, row, 0, 1, 2) 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 grid_l.addWidget(q_morph_factor_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_morph_factor, row, 1) row += 1 grid_l.addWidget(q_sharpen_amount_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_sharpen_amount, row, 1) row += 1 grid_l.addWidget(q_pre_gamma_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addLayout( qtx.QXHBoxLayout( [q_pre_gamma_red, q_pre_gamma_green, q_pre_gamma_blue]), row, 1) row += 1 grid_l.addWidget(q_post_gamma_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addLayout( qtx.QXHBoxLayout( [q_post_gamma_red, q_post_gamma_green, q_post_gamma_blue]), row, 1) row += 1 grid_l.addWidget(q_two_pass_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_two_pass, row, 1) row += 1 super().__init__(backend, L('@QFaceSwapper.module_title'), layout=qtx.QXVBoxLayout([grid_l]))
def __init__(self, backend): cs = backend.get_control_sheet() q_marker_type_label = QLabelPopupInfo( label=L('@QFaceMarker.marker_type'), popup_info_text=L('@QFaceMarker.help.marker_type')) q_marker_type = QComboBoxCSWDynamicSingleSwitch( cs.marker_type, reflect_state_widgets=[q_marker_type_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_marker_coverage_label = QLabelPopupInfo( label=L('@QFaceMarker.marker_coverage'), popup_info_text=L('@QFaceMarker.help.marker_coverage')) q_marker_coverage = QSpinBoxCSWNumber( cs.marker_coverage, reflect_state_widgets=[q_marker_coverage_label]) q_temporal_smoothing_label = QLabelPopupInfo( label=L('@QFaceMarker.temporal_smoothing'), popup_info_text=L('@QFaceMarker.help.temporal_smoothing')) q_temporal_smoothing = QSpinBoxCSWNumber( cs.temporal_smoothing, reflect_state_widgets=[q_temporal_smoothing_label]) grid_l = qtx.QXGridLayout(spacing=5) row = 0 grid_l.addWidget(q_marker_type_label, row, 0, 1, 1, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_marker_type, row, 1, 1, 3) row += 1 grid_l.addWidget(q_device_label, row, 0, 1, 1, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_device, row, 1, 1, 3) row += 1 sub_row = 0 sub_grid_l = qtx.QXGridLayout(spacing=5) sub_grid_l.addWidget(q_marker_coverage_label, sub_row, 0, 1, 1, alignment=qtx.AlignRight | qtx.AlignVCenter) sub_grid_l.addWidget(q_marker_coverage, sub_row, 1, 1, 1, alignment=qtx.AlignLeft) sub_row += 1 sub_grid_l.addWidget(q_temporal_smoothing_label, sub_row, 0, 1, 1, alignment=qtx.AlignRight | qtx.AlignVCenter) sub_grid_l.addWidget(q_temporal_smoothing, sub_row, 1, 1, 1, alignment=qtx.AlignLeft) sub_row += 1 grid_l.addLayout(sub_grid_l, row, 0, 1, 4, alignment=qtx.AlignCenter) row += 1 super().__init__(backend, L('@QFaceMarker.module_title'), layout=qtx.QXVBoxLayout([grid_l]))
def __init__(self, userdata_path: Path, settings_dirpath: Path): super().__init__() dfm_models_path = userdata_path / 'dfm_models' dfm_models_path.mkdir(parents=True, exist_ok=True) animatables_path = userdata_path / 'animatables' animatables_path.mkdir(parents=True, exist_ok=True) output_sequence_path = userdata_path / 'output_sequence' output_sequence_path.mkdir(parents=True, exist_ok=True) # Construct backend config backend_db = self.backend_db = backend.BackendDB(settings_dirpath / 'states.dat') backend_weak_heap = self.backend_weak_heap = backend.BackendWeakHeap( size_mb=2048) reemit_frame_signal = self.reemit_frame_signal = backend.BackendSignal( ) multi_sources_bc_out = backend.BackendConnection(multi_producer=True) face_detector_bc_out = backend.BackendConnection() face_marker_bc_out = backend.BackendConnection() face_aligner_bc_out = backend.BackendConnection() face_swapper_bc_out = backend.BackendConnection() frame_adjuster_bc_out = backend.BackendConnection() face_merger_bc_out = backend.BackendConnection() file_source = self.file_source = backend.FileSource( weak_heap=backend_weak_heap, reemit_frame_signal=reemit_frame_signal, bc_out=multi_sources_bc_out, backend_db=backend_db) camera_source = self.camera_source = backend.CameraSource( weak_heap=backend_weak_heap, bc_out=multi_sources_bc_out, backend_db=backend_db) face_detector = self.face_detector = backend.FaceDetector( weak_heap=backend_weak_heap, reemit_frame_signal=reemit_frame_signal, bc_in=multi_sources_bc_out, bc_out=face_detector_bc_out, backend_db=backend_db) face_marker = self.face_marker = backend.FaceMarker( weak_heap=backend_weak_heap, reemit_frame_signal=reemit_frame_signal, bc_in=face_detector_bc_out, bc_out=face_marker_bc_out, backend_db=backend_db) face_aligner = self.face_aligner = backend.FaceAligner( weak_heap=backend_weak_heap, reemit_frame_signal=reemit_frame_signal, bc_in=face_marker_bc_out, bc_out=face_aligner_bc_out, backend_db=backend_db) face_animator = self.face_animator = backend.FaceAnimator( weak_heap=backend_weak_heap, reemit_frame_signal=reemit_frame_signal, bc_in=face_aligner_bc_out, bc_out=face_merger_bc_out, animatables_path=animatables_path, backend_db=backend_db) face_swapper = self.face_swapper = backend.FaceSwapper( weak_heap=backend_weak_heap, reemit_frame_signal=reemit_frame_signal, bc_in=face_aligner_bc_out, bc_out=face_swapper_bc_out, dfm_models_path=dfm_models_path, backend_db=backend_db) frame_adjuster = self.frame_adjuster = backend.FrameAdjuster( weak_heap=backend_weak_heap, reemit_frame_signal=reemit_frame_signal, bc_in=face_swapper_bc_out, bc_out=frame_adjuster_bc_out, backend_db=backend_db) face_merger = self.face_merger = backend.FaceMerger( weak_heap=backend_weak_heap, reemit_frame_signal=reemit_frame_signal, bc_in=frame_adjuster_bc_out, bc_out=face_merger_bc_out, backend_db=backend_db) stream_output = self.stream_output = backend.StreamOutput( weak_heap=backend_weak_heap, reemit_frame_signal=reemit_frame_signal, bc_in=face_merger_bc_out, save_default_path=userdata_path, backend_db=backend_db) self.all_backends: List[backend.BackendHost] = [ file_source, camera_source, face_detector, face_marker, face_aligner, face_animator, face_swapper, frame_adjuster, face_merger, stream_output ] self.q_file_source = QFileSource(self.file_source) self.q_camera_source = QCameraSource(self.camera_source) self.q_face_detector = QFaceDetector(self.face_detector) self.q_face_marker = QFaceMarker(self.face_marker) self.q_face_aligner = QFaceAligner(self.face_aligner) self.q_face_animator = QFaceAnimator(self.face_animator, animatables_path=animatables_path) self.q_face_swapper = QFaceSwapper(self.face_swapper, dfm_models_path=dfm_models_path) self.q_frame_adjuster = QFrameAdjuster(self.frame_adjuster) self.q_face_merger = QFaceMerger(self.face_merger) self.q_stream_output = QStreamOutput(self.stream_output) self.q_ds_frame_viewer = QBCFrameViewer(backend_weak_heap, multi_sources_bc_out) self.q_ds_fa_viewer = QBCFaceAlignViewer(backend_weak_heap, face_aligner_bc_out, preview_width=256) self.q_ds_fc_viewer = QBCFaceSwapViewer(backend_weak_heap, face_merger_bc_out, preview_width=256) self.q_ds_merged_frame_viewer = QBCMergedFrameViewer( backend_weak_heap, face_merger_bc_out) q_nodes = qtx.QXWidgetHBox([ qtx.QXWidgetVBox([self.q_file_source, self.q_camera_source], spacing=5, fixed_width=256), qtx.QXWidgetVBox([ self.q_face_detector, self.q_face_aligner, ], spacing=5, fixed_width=256), qtx.QXWidgetVBox([ self.q_face_marker, self.q_face_animator, self.q_face_swapper ], spacing=5, fixed_width=256), qtx.QXWidgetVBox([ self.q_frame_adjuster, self.q_face_merger, self.q_stream_output ], spacing=5, fixed_width=256), ], spacing=5, size_policy=('fixed', 'fixed')) q_view_nodes = qtx.QXWidgetHBox([ (qtx.QXWidgetVBox([self.q_ds_frame_viewer], fixed_width=256), qtx.AlignTop), (qtx.QXWidgetVBox([self.q_ds_fa_viewer], fixed_width=256), qtx.AlignTop), (qtx.QXWidgetVBox([self.q_ds_fc_viewer], fixed_width=256), qtx.AlignTop), (qtx.QXWidgetVBox([self.q_ds_merged_frame_viewer], fixed_width=256), qtx.AlignTop), ], spacing=5, size_policy=('fixed', 'fixed')) self.setLayout( qtx.QXVBoxLayout([(qtx.QXWidgetVBox([q_nodes, q_view_nodes], spacing=5), qtx.AlignCenter)])) self._timer = qtx.QXTimer(interval=5, timeout=self._on_timer_5ms, start=True)
def __init__(self, backend: FaceAnimator, animatables_path: Path): self._animatables_path = animatables_path cs = backend.get_control_sheet() 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_animatable_label = QLabelPopupInfo( label=L('@QFaceAnimator.animatable')) q_animatable = QComboBoxCSWDynamicSingleSwitch( cs.animatable, reflect_state_widgets=[q_animatable_label, btn_open_folder]) q_animator_face_id_label = QLabelPopupInfo( label=L('@QFaceAnimator.animator_face_id')) q_animator_face_id = QSpinBoxCSWNumber( cs.animator_face_id, reflect_state_widgets=[q_animator_face_id_label]) q_relative_mode_label = QLabelPopupInfo( label=L('@QFaceAnimator.relative_mode')) q_relative_mode = QCheckBoxCSWFlag( cs.relative_mode, reflect_state_widgets=[q_relative_mode_label]) q_relative_power = QSliderCSWNumber(cs.relative_power) q_update_animatables = QXPushButtonCSWSignal( cs.update_animatables, image=QXImageDB.reload_outline('light gray'), button_size=(24, 22)) q_reset_reference_pose = QXPushButtonCSWSignal( cs.reset_reference_pose, text=L('@QFaceAnimator.reset_reference_pose')) 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_animatable_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addLayout( qtx.QXHBoxLayout( [q_animatable, 2, btn_open_folder, 2, q_update_animatables]), row, 1) row += 1 grid_l.addWidget(q_animator_face_id_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_animator_face_id, row, 1, alignment=qtx.AlignLeft) row += 1 grid_l.addWidget(q_relative_mode_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addLayout(qtx.QXHBoxLayout( [q_relative_mode, 2, q_relative_power]), row, 1, alignment=qtx.AlignLeft) row += 1 grid_l.addWidget(q_reset_reference_pose, row, 0, 1, 2) row += 1 super().__init__(backend, L('@QFaceAnimator.module_title'), layout=qtx.QXVBoxLayout([grid_l]))
def __init__(self, backend: FileSource): cs = backend.get_control_sheet() q_input_type = QButtonCSWDynamicSingleSwitch(cs.input_type, horizontal=True, radio_buttons=True) q_input_paths = QPathEditCSWPaths(cs.input_paths) q_error = QErrorCSWError(cs.error) q_target_width_label = QLabelPopupInfo( label=L('@QFileSource.target_width'), popup_info_text=L('@QFileSource.help.target_width')) q_target_width = QSpinBoxCSWNumber( cs.target_width, reflect_state_widgets=[q_target_width_label]) q_fps_label = QLabelPopupInfo( label=L('@QFileSource.fps'), popup_info_text=L('@QFileSource.help.fps')) q_fps = QSpinBoxCSWNumber(cs.fps, reflect_state_widgets=[q_fps_label]) q_is_realtime_label = QLabelPopupInfo( label=L('@QFileSource.is_realtime'), popup_info_text=L('@QFileSource.help.is_realtime')) q_is_realtime = QCheckBoxCSWFlag( cs.is_realtime, reflect_state_widgets=[q_is_realtime_label]) q_is_autorewind_label = QLabelPopupInfo( label=L('@QFileSource.is_autorewind')) q_is_autorewind = QCheckBoxCSWFlag( cs.is_autorewind, reflect_state_widgets=[q_is_autorewind_label]) btn_size = (32, 32) btn_color = '#E01010' btn_seek_begin = QXPushButtonCSWSignal( cs.seek_begin, image=QXImageDB.play_skip_back_circle_outline(btn_color), button_size=btn_size) btn_seek_backward = QXPushButtonCSWSignal( cs.seek_backward, image=QXImageDB.play_back_circle_outline(btn_color), button_size=btn_size) btn_play = QXPushButtonCSWSignal( cs.play, image=QXImageDB.play_circle_outline(btn_color), button_size=btn_size) btn_pause = QXPushButtonCSWSignal( cs.pause, image=QXImageDB.pause_circle_outline(btn_color), button_size=btn_size) btn_seek_forward = QXPushButtonCSWSignal( cs.seek_forward, image=QXImageDB.play_forward_circle_outline(btn_color), button_size=btn_size) btn_seek_end = QXPushButtonCSWSignal( cs.seek_end, image=QXImageDB.play_skip_forward_circle_outline(btn_color), button_size=btn_size) q_frame_slider = QSliderCSWNumbers(cs.frame_index, cs.frame_count) grid_l = qtx.QXGridLayout(spacing=5) row = 0 grid_l.addWidget(q_target_width_label, row, 0, 1, 2, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_target_width, row, 2, 1, 2, alignment=qtx.AlignLeft) row += 1 grid_l.addLayout(qtx.QXHBoxLayout( [q_is_realtime_label, 5, q_is_realtime, 5, q_fps_label]), row, 0, 1, 2, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_fps, row, 2, 1, 2, alignment=qtx.AlignLeft) row += 1 grid_l.addWidget(q_is_autorewind_label, row, 0, 1, 2, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_is_autorewind, row, 2, 1, 2, alignment=qtx.AlignLeft) row += 1 grid_l.addWidget(qtx.QXFrameHBox([ btn_seek_begin, btn_seek_backward, btn_play, btn_pause, btn_seek_forward, btn_seek_end ], spacing=1), row, 0, 1, 4, alignment=qtx.AlignCenter) row += 1 grid_l.addWidget(q_frame_slider, row, 0, 1, 4) row += 1 main_l = qtx.QXVBoxLayout( [q_input_type, q_input_paths, q_error, grid_l], spacing=5) super().__init__(backend, L('@QFileSource.module_title'), layout=main_l, content_align_top=True)
def __init__(self, backend: CameraSource): cs = backend.get_control_sheet() q_driver_label = QLabelPopupInfo( label=L('@QCameraSource.driver'), popup_info_text=L('@QCameraSource.help.driver')) q_driver = QComboBoxCSWDynamicSingleSwitch( cs.driver, reflect_state_widgets=[q_driver_label]) q_device_idx_label = QLabelPopupInfo( label=L('@QCameraSource.device_index')) q_device_idx = QComboBoxCSWDynamicSingleSwitch( cs.device_idx, reflect_state_widgets=[q_device_idx_label]) q_resolution_label = QLabelPopupInfo( label=L('@QCameraSource.resolution'), popup_info_text=L('@QCameraSource.help.resolution')) q_resolution = QComboBoxCSWDynamicSingleSwitch( cs.resolution, reflect_state_widgets=[q_resolution_label]) q_fps_label = QLabelPopupInfo( label=L('@QCameraSource.fps'), popup_info_text=L('@QCameraSource.help.fps')) q_fps = QSpinBoxCSWNumber(cs.fps, reflect_state_widgets=[q_fps_label]) q_rotation_label = QLabelPopupInfo(label=L('@QCameraSource.rotation')) q_rotation = QComboBoxCSWDynamicSingleSwitch( cs.rotation, reflect_state_widgets=[q_rotation_label]) q_flip_horizontal_label = QLabelPopupInfo( label=L('@QCameraSource.flip_horizontal')) q_flip_horizontal = QCheckBoxCSWFlag( cs.flip_horizontal, reflect_state_widgets=[q_flip_horizontal_label]) q_camera_settings_group_label = QLabelPopupInfo( label=L('@QCameraSource.camera_settings')) q_open_settings = QXPushButtonCSWSignal( cs.open_settings, text=L('@QCameraSource.open_settings')) q_load_settings = QXPushButtonCSWSignal( cs.load_settings, text=L('@QCameraSource.load_settings'), reflect_state_widgets=[q_camera_settings_group_label]) q_save_settings = QXPushButtonCSWSignal( cs.save_settings, text=L('@QCameraSource.save_settings')) grid_l = qtx.QXGridLayout(spacing=5) row = 0 grid_l.addWidget(q_driver_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_driver, row, 1, alignment=qtx.AlignLeft) row += 1 grid_l.addWidget(q_device_idx_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_device_idx, row, 1, alignment=qtx.AlignLeft) row += 1 grid_l.addWidget(q_resolution_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_resolution, row, 1, alignment=qtx.AlignLeft) row += 1 btn_height = 24 grid_l.addWidget(q_camera_settings_group_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(qtx.QXWidgetHBox( [q_open_settings, q_load_settings, q_save_settings], contents_margins=(1, 0, 1, 0), spacing=1, fixed_height=btn_height), row, 1, alignment=qtx.AlignLeft) row += 1 grid_l.addWidget(q_fps_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_fps, row, 1, alignment=qtx.AlignLeft) row += 1 grid_l.addWidget(q_rotation_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_rotation, row, 1, alignment=qtx.AlignLeft) row += 1 grid_l.addWidget(q_flip_horizontal_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_flip_horizontal, row, 1, alignment=qtx.AlignLeft) row += 1 super().__init__(backend, L('@QCameraSource.module_title'), layout=qtx.QXVBoxLayout([grid_l], spacing=5), content_align_top=True)
def __init__(self, backend: FaceDetector): if not isinstance(backend, FaceDetector): raise ValueError('backend must be an instance of FaceDetector') self._backend = backend self._bc_out = backend.get_bc_out() self._weak_heap = backend.get_weak_heap() self._bcd_id = None self._timer = qtx.QXTimer(interval=10, timeout=self._on_timer_10ms, start=True) face_coords_label = self._q_face_coords_label = qtx.QXLabel( font=QXFontDB.get_fixedwidth_font(size=7), word_wrap=False) q_detected_faces = self._q_detected_faces = qtx.QXCollapsibleSection( title=L('@QFaceDetector.detected_faces'), content_layout=qtx.QXVBoxLayout([face_coords_label]), is_opened=True) cs = backend.get_control_sheet() q_detector_type_label = QLabelPopupInfo( label=L('@QFaceDetector.detector_type'), popup_info_text=L('@QFaceDetector.help.detector_type')) q_detector_type = QComboBoxCSWDynamicSingleSwitch( cs.detector_type, reflect_state_widgets=[q_detector_type_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_fixed_window_size_label = QLabelPopupInfo( label=L('@QFaceDetector.window_size'), popup_info_text=L('@QFaceDetector.help.window_size')) q_fixed_window_size = QSpinBoxCSWNumber(cs.fixed_window_size, reflect_state_widgets=[ q_fixed_window_size_label, q_detected_faces ]) q_threshold_label = QLabelPopupInfo( label=L('@QFaceDetector.threshold'), popup_info_text=L('@QFaceDetector.help.threshold')) q_threshold = QSpinBoxCSWNumber( cs.threshold, reflect_state_widgets=[q_threshold_label]) q_max_faces_label = QLabelPopupInfo( label=L('@QFaceDetector.max_faces'), popup_info_text=L('@QFaceDetector.help.max_faces')) q_max_faces = QSpinBoxCSWNumber( cs.max_faces, reflect_state_widgets=[q_max_faces_label]) q_sort_by_label = QLabelPopupInfo( label=L('@QFaceDetector.sort_by'), popup_info_text=L('@QFaceDetector.help.sort_by')) q_sort_by = QComboBoxCSWDynamicSingleSwitch( cs.sort_by, reflect_state_widgets=[q_sort_by_label]) q_temporal_smoothing_label = QLabelPopupInfo( label=L('@QFaceDetector.temporal_smoothing'), popup_info_text=L('@QFaceDetector.help.temporal_smoothing')) q_temporal_smoothing = QSpinBoxCSWNumber( cs.temporal_smoothing, reflect_state_widgets=[q_temporal_smoothing_label]) grid_l = qtx.QXGridLayout(vertical_spacing=5, horizontal_spacing=5) row = 0 grid_l.addWidget(q_detector_type_label, row, 0, 1, 1, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_detector_type, row, 1, 1, 3) row += 1 grid_l.addWidget(q_device_label, row, 0, 1, 1, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_device, row, 1, 1, 3) row += 1 grid_l.addWidget(q_fixed_window_size_label, row, 0, 1, 2, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_fixed_window_size, row, 2, 1, 2, alignment=qtx.AlignLeft) row += 1 grid_l.addWidget(q_threshold_label, row, 0, 1, 2, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_threshold, row, 2, 1, 2, alignment=qtx.AlignLeft) row += 1 grid_l.addLayout(qtx.QXHBoxLayout([q_max_faces_label, 5, q_max_faces]), row, 0, 1, 2, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addLayout(qtx.QXHBoxLayout([q_sort_by_label, 5, q_sort_by]), row, 2, 1, 2, alignment=qtx.AlignLeft | qtx.AlignVCenter) row += 1 grid_l.addLayout(qtx.QXHBoxLayout( [q_temporal_smoothing_label, 5, q_temporal_smoothing]), row, 0, 1, 4, alignment=qtx.AlignCenter) row += 1 grid_l.addWidget(q_detected_faces, row, 0, 1, 4) row += 1 super().__init__(backend, L('@QFaceDetector.module_title'), layout=qtx.QXVBoxLayout([grid_l]))
def __init__(self, userdata_path, settings_dirpath): super().__init__(save_load_state=True, size_policy=('minimum', 'minimum')) self._userdata_path = userdata_path self._settings_dirpath = settings_dirpath menu_bar = qtx.QXMenuBar(font=QXFontDB.get_default_font(size=10), size_policy=('fixed', 'minimumexpanding')) menu_file = menu_bar.addMenu(L('@QDFLAppWindow.file')) menu_language = menu_bar.addMenu(L('@QDFLAppWindow.language')) menu_file_action_reinitialize = menu_file.addAction( L('@QDFLAppWindow.reinitialize')) menu_file_action_reinitialize.triggered.connect( lambda: qtx.QXMainApplication.inst.reinitialize()) menu_file_action_reset_settings = menu_file.addAction( L('@QDFLAppWindow.reset_modules_settings')) menu_file_action_reset_settings.triggered.connect( self._on_reset_modules_settings) menu_file_action_quit = menu_file.addAction(L('@QDFLAppWindow.quit')) menu_file_action_quit.triggered.connect( lambda: qtx.QXMainApplication.quit()) menu_language_action_english = menu_language.addAction('English') menu_language_action_english.triggered.connect( lambda: (qtx.QXMainApplication.inst.set_language('en-US'), qtx.QXMainApplication.inst.reinitialize())) menu_language_action_spanish = menu_language.addAction('Español') menu_language_action_spanish.triggered.connect( lambda: (qtx.QXMainApplication.inst.set_language('es-ES'), qtx.QXMainApplication.inst.reinitialize())) menu_language_action_italian = menu_language.addAction('Italiano') menu_language_action_italian.triggered.connect( lambda: (qtx.QXMainApplication.inst.set_language('it-IT'), qtx.QXMainApplication.inst.reinitialize())) menu_language_action_russian = menu_language.addAction('Русский') menu_language_action_russian.triggered.connect( lambda: (qtx.QXMainApplication.inst.set_language('ru-RU'), qtx.QXMainApplication.inst.reinitialize())) menu_language_action_chinese = menu_language.addAction('汉语') menu_language_action_chinese.triggered.connect( lambda: (qtx.QXMainApplication.inst.set_language('zh-CN'), qtx.QXMainApplication.inst.reinitialize())) menu_help = menu_bar.addMenu(L('@QDFLAppWindow.help')) menu_help_action_github = menu_help.addAction( L('@QDFLAppWindow.visit_github_page')) menu_help_action_github.triggered.connect( lambda: qtx.QDesktopServices.openUrl( qtx.QUrl('https://github.com/iperov/DeepFaceLive'))) self.q_live_swap = None self.q_live_swap_container = qtx.QXWidget() self.content_l = qtx.QXVBoxLayout() cb_process_priority = self._cb_process_priority = qtx.QXSaveableComboBox( db_key='_QDFLAppWindow_process_priority', choices=[ lib_os.ProcessPriority.NORMAL, lib_os.ProcessPriority.IDLE ], default_choice=lib_os.ProcessPriority.NORMAL, choices_names=[ L('@QDFLAppWindow.process_priority.normal'), L('@QDFLAppWindow.process_priority.lowest') ], on_choice_selected=self._on_cb_process_priority_choice) menu_bar_tail = qtx.QXFrameHBox([ 10, QXLabel(text=L('@QDFLAppWindow.process_priority')), 4, cb_process_priority ], size_policy=('fixed', 'fixed')) self.setLayout( qtx.QXVBoxLayout([ qtx.QXWidgetHBox([menu_bar, menu_bar_tail, qtx.QXFrame()], size_policy=('minimumexpanding', 'fixed')), 5, qtx.QXWidget(layout=self.content_l) ])) self.call_on_closeEvent(self._on_closeEvent) q_live_swap = self.q_live_swap = QLiveSwap( userdata_path=self._userdata_path, settings_dirpath=self._settings_dirpath) q_live_swap.initialize() self.content_l.addWidget(q_live_swap)
def __init__(self, backend): cs = backend.get_control_sheet() 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_face_x_offset_label = QLabelPopupInfo(label=L('@QFaceMerger.face_x_offset')) q_face_x_offset = QSpinBoxCSWNumber(cs.face_x_offset, reflect_state_widgets=[q_face_x_offset_label]) q_face_y_offset_label = QLabelPopupInfo(label=L('@QFaceMerger.face_y_offset')) q_face_y_offset = QSpinBoxCSWNumber(cs.face_y_offset, reflect_state_widgets=[q_face_y_offset_label]) q_face_scale_label = QLabelPopupInfo(label=L('@QFaceMerger.face_scale') ) q_face_scale = QSpinBoxCSWNumber(cs.face_scale, reflect_state_widgets=[q_face_scale_label]) q_face_mask_type_label = QLabelPopupInfo(label=L('@QFaceMerger.face_mask_type') ) q_face_mask_source_label = QLabelPopupInfo(label='SRC') q_face_mask_source = QCheckBoxCSWFlag(cs.face_mask_source, reflect_state_widgets=[q_face_mask_type_label, q_face_mask_source_label]) q_face_mask_celeb_label = QLabelPopupInfo(label='CELEB') q_face_mask_celeb = QCheckBoxCSWFlag(cs.face_mask_celeb, reflect_state_widgets=[q_face_mask_celeb_label, q_face_mask_source_label]) q_face_mask_lmrks_label = QLabelPopupInfo(label='LMRKS') q_face_mask_lmrks = QCheckBoxCSWFlag(cs.face_mask_lmrks, reflect_state_widgets=[q_face_mask_lmrks_label, q_face_mask_source_label]) q_face_mask_erode_label = QLabelPopupInfo(label=L('@QFaceMerger.face_mask_erode') ) q_face_mask_erode = QSpinBoxCSWNumber(cs.face_mask_erode, reflect_state_widgets=[q_face_mask_erode_label]) q_face_mask_blur_label = QLabelPopupInfo(label=L('@QFaceMerger.face_mask_blur') ) q_face_mask_blur = QSpinBoxCSWNumber(cs.face_mask_blur, reflect_state_widgets=[q_face_mask_blur_label]) q_color_transfer_label = QLabelPopupInfo(label=L('@QFaceMerger.color_transfer'), popup_info_text=L('@QFaceMerger.help.color_transfer')) q_color_transfer = QComboBoxCSWDynamicSingleSwitch(cs.color_transfer, reflect_state_widgets=[q_color_transfer_label]) q_interpolation_label = QLabelPopupInfo(label=L('@QFaceMerger.interpolation') ) q_interpolation = QComboBoxCSWDynamicSingleSwitch(cs.interpolation, reflect_state_widgets=[q_interpolation_label]) q_color_compression_label = QLabelPopupInfo(label=L('@QFaceMerger.color_compression') ) q_color_compression = QSliderCSWNumber(cs.color_compression, reflect_state_widgets=[q_color_compression_label]) q_face_opacity_label = QLabelPopupInfo(label=L('@QFaceMerger.face_opacity') ) q_face_opacity = QSliderCSWNumber(cs.face_opacity, reflect_state_widgets=[q_face_opacity_label]) 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.addLayout( qtx.QXVBoxLayout([q_face_x_offset_label, q_face_y_offset_label]), row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addLayout( qtx.QXHBoxLayout([q_face_x_offset, q_face_y_offset]), row, 1, alignment=qtx.AlignLeft ) row += 1 grid_l.addWidget(q_face_scale_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_face_scale, row, 1, alignment=qtx.AlignLeft ) row += 1 grid_l.addWidget( q_face_mask_type_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addLayout( qtx.QXHBoxLayout([q_face_mask_source, q_face_mask_source_label, 5, q_face_mask_celeb, q_face_mask_celeb_label, 5, q_face_mask_lmrks, q_face_mask_lmrks_label]), row, 1, alignment=qtx.AlignLeft ) row += 1 grid_l.addLayout(qtx.QXVBoxLayout([q_face_mask_erode_label,q_face_mask_blur_label]), row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addLayout(qtx.QXHBoxLayout([q_face_mask_erode,q_face_mask_blur], spacing=3), row, 1, alignment=qtx.AlignLeft ) row += 1 grid_l.addWidget(q_color_transfer_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_color_transfer, row, 1 ) row += 1 grid_l.addWidget(q_interpolation_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_interpolation, row, 1) row += 1 grid_l.addWidget(q_color_compression_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_color_compression, row, 1) row += 1 grid_l.addWidget(q_face_opacity_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter) grid_l.addWidget(q_face_opacity, row, 1) row += 1 super().__init__(backend, L('@QFaceMerger.module_title'), layout=qtx.QXVBoxLayout([grid_l]) )