diff --git a/apps/DeepFaceLive/backend/FaceMarker.py b/apps/DeepFaceLive/backend/FaceMarker.py index 058e067..60b2c5d 100644 --- a/apps/DeepFaceLive/backend/FaceMarker.py +++ b/apps/DeepFaceLive/backend/FaceMarker.py @@ -193,7 +193,7 @@ class FaceMarkerWorker(BackendWorker): fsi.face_ulmrks = face_ulmrks self.stop_profile_timing() - self.pending_bcd = bcd + self.pending_bcd = bcd if self.pending_bcd is not None: if self.bc_out.is_full_read(1): diff --git a/apps/DeepFaceLive/backend/StreamOutput.py b/apps/DeepFaceLive/backend/StreamOutput.py index cf45b8e..3ce04fd 100644 --- a/apps/DeepFaceLive/backend/StreamOutput.py +++ b/apps/DeepFaceLive/backend/StreamOutput.py @@ -39,10 +39,18 @@ class SourceType(IntEnum): ALIGNED_FACE = 1 SWAPPED_FACE = 2 MERGED_FRAME = 3 - SOURCE_N_MERGED_FRAME = 4 + MERGED_FRAME_OR_SOURCE_FRAME = 4 + SOURCE_N_MERGED_FRAME = 5 + SOURCE_N_MERGED_FRAME_OR_SOURCE_FRAME = 6 -ViewModeNames = ['@StreamOutput.SourceType.SOURCE_FRAME', '@StreamOutput.SourceType.ALIGNED_FACE', '@StreamOutput.SourceType.SWAPPED_FACE', - '@StreamOutput.SourceType.MERGED_FRAME', '@StreamOutput.SourceType.SOURCE_N_MERGED_FRAME'] +ViewModeNames = ['@StreamOutput.SourceType.SOURCE_FRAME', + '@StreamOutput.SourceType.ALIGNED_FACE', + '@StreamOutput.SourceType.SWAPPED_FACE', + '@StreamOutput.SourceType.MERGED_FRAME', + '@StreamOutput.SourceType.MERGED_FRAME_OR_SOURCE_FRAME', + '@StreamOutput.SourceType.SOURCE_N_MERGED_FRAME', + '@StreamOutput.SourceType.SOURCE_N_MERGED_FRAME_OR_SOURCE_FRAME', + ] class StreamOutputWorker(BackendWorker): @@ -70,7 +78,7 @@ class StreamOutputWorker(BackendWorker): state, cs = self.get_state(), self.get_control_sheet() - cs.source_type.call_on_selected(self.on_cs_mode) + cs.source_type.call_on_selected(self.on_cs_source_type) cs.show_hide_window.call_on_signal(self.on_cs_show_hide_window_signal) cs.aligned_face_id.call_on_number(self.on_cs_aligned_face_id) cs.target_delay.call_on_number(self.on_cs_target_delay) @@ -109,7 +117,7 @@ class StreamOutputWorker(BackendWorker): - def on_cs_mode(self, idx, source_type): + def on_cs_source_type(self, idx, source_type): state, cs = self.get_state(), self.get_control_sheet() if source_type == SourceType.ALIGNED_FACE: cs.aligned_face_id.enable() @@ -117,11 +125,11 @@ class StreamOutputWorker(BackendWorker): cs.aligned_face_id.set_number(state.aligned_face_id or 0) else: cs.aligned_face_id.disable() - state.source_type = source_type + self.save_state() self.reemit_frame_signal.send() - + def show_window(self): state, cs = self.get_state(), self.get_control_sheet() cv2.namedWindow(self._wnd_name) @@ -203,8 +211,10 @@ class StreamOutputWorker(BackendWorker): if source_type == SourceType.SOURCE_FRAME: view_image = bcd.get_image(bcd.get_frame_image_name()) - elif source_type == SourceType.MERGED_FRAME: + elif source_type in [SourceType.MERGED_FRAME, SourceType.MERGED_FRAME_OR_SOURCE_FRAME]: view_image = bcd.get_image(bcd.get_merged_image_name()) + if view_image is None and source_type == SourceType.MERGED_FRAME_OR_SOURCE_FRAME: + view_image = bcd.get_image(bcd.get_frame_image_name()) elif source_type == SourceType.ALIGNED_FACE: aligned_face_id = state.aligned_face_id @@ -218,15 +228,20 @@ class StreamOutputWorker(BackendWorker): view_image = bcd.get_image(fsi.face_swap_image_name) if view_image is not None: break - - elif source_type == SourceType.SOURCE_N_MERGED_FRAME: + + elif source_type in [SourceType.SOURCE_N_MERGED_FRAME, SourceType.SOURCE_N_MERGED_FRAME_OR_SOURCE_FRAME]: source_frame = bcd.get_image(bcd.get_frame_image_name()) - merged_frame = bcd.get_image(bcd.get_merged_image_name()) - if source_frame is not None and merged_frame is not None: + if source_frame is not None: source_frame = ImageProcessor(source_frame).to_ufloat32().get_image('HWC') + + merged_frame = bcd.get_image(bcd.get_merged_image_name()) + + if merged_frame is None and source_type == SourceType.SOURCE_N_MERGED_FRAME_OR_SOURCE_FRAME: + merged_frame = source_frame + + if source_frame is not None and merged_frame is not None: view_image = np.concatenate( (source_frame, merged_frame), 1 ) - if view_image is not None: buffered_frames.add_buffer( bcd.get_frame_timestamp(), view_image ) diff --git a/localization/localization.py b/localization/localization.py index a6f18eb..552dd11 100644 --- a/localization/localization.py +++ b/localization/localization.py @@ -336,7 +336,7 @@ class Localization: 'en-US' : 'Increase stabilization by excluding landmarks of moving parts of the face, such as mouth and other.', 'ru-RU' : 'Улучшить стабилизацию исключением лицевых точек\nдвижущихся частей лица, таких как рот и других.', 'zh-CN' : '通过排除面部移动部分(例如嘴巴和其他你懂的)的特征点来提高稳定性。'}, - + 'QFaceAligner.head_mode':{ 'en-US' : 'Head mode', 'ru-RU' : 'Режим головы', @@ -536,7 +536,7 @@ class Localization: 'en-US' : 'Face mask type', 'ru-RU' : 'Тип маски лица', 'zh-CN' : '人脸遮罩类型'}, - + 'QFaceMerger.face_mask_erode':{ 'en-US' : 'Face mask erode', 'ru-RU' : 'Укорочение маски', @@ -546,17 +546,17 @@ class Localization: 'en-US' : 'Face mask blur', 'ru-RU' : 'Размытие маски', 'zh-CN' : '遮罩边缘羽化'}, - + 'QFaceMerger.help.color_transfer':{ 'en-US' : 'Match the color distribution of the replaced face to the original face.', 'ru-RU' : 'Совместить цветовое распределение заменённого лица с исходным.', 'zh-CN' : '将被替换的面孔的颜色分布与原始面孔相匹配。'}, - + 'QFaceMerger.color_transfer':{ 'en-US' : 'Color transfer', 'ru-RU' : 'Перенос цвета', 'zh-CN' : '彩色转印'}, - + 'QFaceMerger.interpolation':{ 'en-US' : 'Interpolation', 'ru-RU' : 'Интерполяция', @@ -566,7 +566,7 @@ class Localization: 'en-US' : 'Color compression', 'ru-RU' : 'Сжатие цвета', 'zh-CN' : '颜色压缩'}, - + 'QFaceMerger.face_opacity':{ 'en-US' : 'Face opacity', 'ru-RU' : 'Непрозрач. лица', @@ -696,7 +696,7 @@ class Localization: 'en-US' : 'Downloading model...', 'ru-RU' : 'Загрузка модели...', 'zh-CN' : '下载模型中...'}, - + 'StreamOutput.SourceType.SOURCE_FRAME':{ 'en-US' : 'Source frame', 'ru-RU' : 'Исходный кадр', @@ -717,9 +717,18 @@ class Localization: 'ru-RU' : 'Склеенный кадр', 'zh-CN' : '合成后的画面'}, + 'StreamOutput.SourceType.MERGED_FRAME_OR_SOURCE_FRAME':{ + 'en-US' : 'Merged frame or source frame', + 'ru-RU' : 'Склеенный кадр или исходный кадр', + 'zh-CN' : '合成后的画面否则源帧'}, + 'StreamOutput.SourceType.SOURCE_N_MERGED_FRAME':{ 'en-US' : 'Source and merged frame', 'ru-RU' : 'Исходный и склеенный кадр', 'zh-CN' : '源和融合后的帧'}, - + + 'StreamOutput.SourceType.SOURCE_N_MERGED_FRAME_OR_SOURCE_FRAME':{ + 'en-US' : 'Source and merged frame or source frame', + 'ru-RU' : 'Исходный и склеенный кадр или исходный кадр', + 'zh-CN' : '源和融合后的帧则源帧'}, }