mirror of
https://github.com/iperov/DeepFaceLive
synced 2025-07-07 13:32:10 -07:00
Stream output module: added 2 modes that show source frame if merged frame does not exist
This commit is contained in:
parent
242ec9f06c
commit
05fe7e82dd
3 changed files with 46 additions and 22 deletions
|
@ -193,7 +193,7 @@ class FaceMarkerWorker(BackendWorker):
|
||||||
fsi.face_ulmrks = face_ulmrks
|
fsi.face_ulmrks = face_ulmrks
|
||||||
|
|
||||||
self.stop_profile_timing()
|
self.stop_profile_timing()
|
||||||
self.pending_bcd = bcd
|
self.pending_bcd = bcd
|
||||||
|
|
||||||
if self.pending_bcd is not None:
|
if self.pending_bcd is not None:
|
||||||
if self.bc_out.is_full_read(1):
|
if self.bc_out.is_full_read(1):
|
||||||
|
|
|
@ -39,10 +39,18 @@ class SourceType(IntEnum):
|
||||||
ALIGNED_FACE = 1
|
ALIGNED_FACE = 1
|
||||||
SWAPPED_FACE = 2
|
SWAPPED_FACE = 2
|
||||||
MERGED_FRAME = 3
|
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',
|
ViewModeNames = ['@StreamOutput.SourceType.SOURCE_FRAME',
|
||||||
'@StreamOutput.SourceType.MERGED_FRAME', '@StreamOutput.SourceType.SOURCE_N_MERGED_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):
|
class StreamOutputWorker(BackendWorker):
|
||||||
|
@ -70,7 +78,7 @@ class StreamOutputWorker(BackendWorker):
|
||||||
|
|
||||||
state, cs = self.get_state(), self.get_control_sheet()
|
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.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.aligned_face_id.call_on_number(self.on_cs_aligned_face_id)
|
||||||
cs.target_delay.call_on_number(self.on_cs_target_delay)
|
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()
|
state, cs = self.get_state(), self.get_control_sheet()
|
||||||
if source_type == SourceType.ALIGNED_FACE:
|
if source_type == SourceType.ALIGNED_FACE:
|
||||||
cs.aligned_face_id.enable()
|
cs.aligned_face_id.enable()
|
||||||
|
@ -117,11 +125,11 @@ class StreamOutputWorker(BackendWorker):
|
||||||
cs.aligned_face_id.set_number(state.aligned_face_id or 0)
|
cs.aligned_face_id.set_number(state.aligned_face_id or 0)
|
||||||
else:
|
else:
|
||||||
cs.aligned_face_id.disable()
|
cs.aligned_face_id.disable()
|
||||||
|
|
||||||
state.source_type = source_type
|
state.source_type = source_type
|
||||||
|
|
||||||
self.save_state()
|
self.save_state()
|
||||||
self.reemit_frame_signal.send()
|
self.reemit_frame_signal.send()
|
||||||
|
|
||||||
def show_window(self):
|
def show_window(self):
|
||||||
state, cs = self.get_state(), self.get_control_sheet()
|
state, cs = self.get_state(), self.get_control_sheet()
|
||||||
cv2.namedWindow(self._wnd_name)
|
cv2.namedWindow(self._wnd_name)
|
||||||
|
@ -203,8 +211,10 @@ class StreamOutputWorker(BackendWorker):
|
||||||
|
|
||||||
if source_type == SourceType.SOURCE_FRAME:
|
if source_type == SourceType.SOURCE_FRAME:
|
||||||
view_image = bcd.get_image(bcd.get_frame_image_name())
|
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())
|
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:
|
elif source_type == SourceType.ALIGNED_FACE:
|
||||||
aligned_face_id = state.aligned_face_id
|
aligned_face_id = state.aligned_face_id
|
||||||
|
@ -218,15 +228,20 @@ class StreamOutputWorker(BackendWorker):
|
||||||
view_image = bcd.get_image(fsi.face_swap_image_name)
|
view_image = bcd.get_image(fsi.face_swap_image_name)
|
||||||
if view_image is not None:
|
if view_image is not None:
|
||||||
break
|
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())
|
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:
|
||||||
if source_frame is not None and merged_frame is not None:
|
|
||||||
source_frame = ImageProcessor(source_frame).to_ufloat32().get_image('HWC')
|
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 )
|
view_image = np.concatenate( (source_frame, merged_frame), 1 )
|
||||||
|
|
||||||
|
|
||||||
if view_image is not None:
|
if view_image is not None:
|
||||||
buffered_frames.add_buffer( bcd.get_frame_timestamp(), view_image )
|
buffered_frames.add_buffer( bcd.get_frame_timestamp(), view_image )
|
||||||
|
|
||||||
|
|
|
@ -336,7 +336,7 @@ class Localization:
|
||||||
'en-US' : 'Increase stabilization by excluding landmarks of moving parts of the face, such as mouth and other.',
|
'en-US' : 'Increase stabilization by excluding landmarks of moving parts of the face, such as mouth and other.',
|
||||||
'ru-RU' : 'Улучшить стабилизацию исключением лицевых точек\nдвижущихся частей лица, таких как рот и других.',
|
'ru-RU' : 'Улучшить стабилизацию исключением лицевых точек\nдвижущихся частей лица, таких как рот и других.',
|
||||||
'zh-CN' : '通过排除面部移动部分(例如嘴巴和其他你懂的)的特征点来提高稳定性。'},
|
'zh-CN' : '通过排除面部移动部分(例如嘴巴和其他你懂的)的特征点来提高稳定性。'},
|
||||||
|
|
||||||
'QFaceAligner.head_mode':{
|
'QFaceAligner.head_mode':{
|
||||||
'en-US' : 'Head mode',
|
'en-US' : 'Head mode',
|
||||||
'ru-RU' : 'Режим головы',
|
'ru-RU' : 'Режим головы',
|
||||||
|
@ -536,7 +536,7 @@ class Localization:
|
||||||
'en-US' : 'Face mask type',
|
'en-US' : 'Face mask type',
|
||||||
'ru-RU' : 'Тип маски лица',
|
'ru-RU' : 'Тип маски лица',
|
||||||
'zh-CN' : '人脸遮罩类型'},
|
'zh-CN' : '人脸遮罩类型'},
|
||||||
|
|
||||||
'QFaceMerger.face_mask_erode':{
|
'QFaceMerger.face_mask_erode':{
|
||||||
'en-US' : 'Face mask erode',
|
'en-US' : 'Face mask erode',
|
||||||
'ru-RU' : 'Укорочение маски',
|
'ru-RU' : 'Укорочение маски',
|
||||||
|
@ -546,17 +546,17 @@ class Localization:
|
||||||
'en-US' : 'Face mask blur',
|
'en-US' : 'Face mask blur',
|
||||||
'ru-RU' : 'Размытие маски',
|
'ru-RU' : 'Размытие маски',
|
||||||
'zh-CN' : '遮罩边缘羽化'},
|
'zh-CN' : '遮罩边缘羽化'},
|
||||||
|
|
||||||
'QFaceMerger.help.color_transfer':{
|
'QFaceMerger.help.color_transfer':{
|
||||||
'en-US' : 'Match the color distribution of the replaced face to the original face.',
|
'en-US' : 'Match the color distribution of the replaced face to the original face.',
|
||||||
'ru-RU' : 'Совместить цветовое распределение заменённого лица с исходным.',
|
'ru-RU' : 'Совместить цветовое распределение заменённого лица с исходным.',
|
||||||
'zh-CN' : '将被替换的面孔的颜色分布与原始面孔相匹配。'},
|
'zh-CN' : '将被替换的面孔的颜色分布与原始面孔相匹配。'},
|
||||||
|
|
||||||
'QFaceMerger.color_transfer':{
|
'QFaceMerger.color_transfer':{
|
||||||
'en-US' : 'Color transfer',
|
'en-US' : 'Color transfer',
|
||||||
'ru-RU' : 'Перенос цвета',
|
'ru-RU' : 'Перенос цвета',
|
||||||
'zh-CN' : '彩色转印'},
|
'zh-CN' : '彩色转印'},
|
||||||
|
|
||||||
'QFaceMerger.interpolation':{
|
'QFaceMerger.interpolation':{
|
||||||
'en-US' : 'Interpolation',
|
'en-US' : 'Interpolation',
|
||||||
'ru-RU' : 'Интерполяция',
|
'ru-RU' : 'Интерполяция',
|
||||||
|
@ -566,7 +566,7 @@ class Localization:
|
||||||
'en-US' : 'Color compression',
|
'en-US' : 'Color compression',
|
||||||
'ru-RU' : 'Сжатие цвета',
|
'ru-RU' : 'Сжатие цвета',
|
||||||
'zh-CN' : '颜色压缩'},
|
'zh-CN' : '颜色压缩'},
|
||||||
|
|
||||||
'QFaceMerger.face_opacity':{
|
'QFaceMerger.face_opacity':{
|
||||||
'en-US' : 'Face opacity',
|
'en-US' : 'Face opacity',
|
||||||
'ru-RU' : 'Непрозрач. лица',
|
'ru-RU' : 'Непрозрач. лица',
|
||||||
|
@ -696,7 +696,7 @@ class Localization:
|
||||||
'en-US' : 'Downloading model...',
|
'en-US' : 'Downloading model...',
|
||||||
'ru-RU' : 'Загрузка модели...',
|
'ru-RU' : 'Загрузка модели...',
|
||||||
'zh-CN' : '下载模型中...'},
|
'zh-CN' : '下载模型中...'},
|
||||||
|
|
||||||
'StreamOutput.SourceType.SOURCE_FRAME':{
|
'StreamOutput.SourceType.SOURCE_FRAME':{
|
||||||
'en-US' : 'Source frame',
|
'en-US' : 'Source frame',
|
||||||
'ru-RU' : 'Исходный кадр',
|
'ru-RU' : 'Исходный кадр',
|
||||||
|
@ -717,9 +717,18 @@ class Localization:
|
||||||
'ru-RU' : 'Склеенный кадр',
|
'ru-RU' : 'Склеенный кадр',
|
||||||
'zh-CN' : '合成后的画面'},
|
'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':{
|
'StreamOutput.SourceType.SOURCE_N_MERGED_FRAME':{
|
||||||
'en-US' : 'Source and merged frame',
|
'en-US' : 'Source and merged frame',
|
||||||
'ru-RU' : 'Исходный и склеенный кадр',
|
'ru-RU' : 'Исходный и склеенный кадр',
|
||||||
'zh-CN' : '源和融合后的帧'},
|
'zh-CN' : '源和融合后的帧'},
|
||||||
|
|
||||||
|
'StreamOutput.SourceType.SOURCE_N_MERGED_FRAME_OR_SOURCE_FRAME':{
|
||||||
|
'en-US' : 'Source and merged frame or source frame',
|
||||||
|
'ru-RU' : 'Исходный и склеенный кадр или исходный кадр',
|
||||||
|
'zh-CN' : '源和融合后的帧则源帧'},
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue