From 6f401353de8d73d6b2b63b080d4601fbbba2b7ca Mon Sep 17 00:00:00 2001 From: gyqls153 Date: Tue, 8 Nov 2022 21:19:06 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=95=88=EC=A0=95=EB=AA=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 메타포 분석중 --- mefamo/blendshapes/blendshape_calculator.py | 9 +- mefamo/blendshapes/blendshape_config.py | 2 +- mefamo/custom/__init__.py | 0 mefamo/custom/__init__.pyo | Bin 138 -> 0 bytes mefamo/custom/face_geometry.pyo | Bin 36723 -> 0 bytes mefamo/mefamo.py | 4 +- mefamo/pylivelinkface/__init__.py | 1 + mefamo/pylivelinkface/pylivelinkface.py | 248 ++++++++++++++++++++ examples/mefamo_cli.py => mefamo_cli.py | 2 +- 9 files changed, 260 insertions(+), 6 deletions(-) delete mode 100644 mefamo/custom/__init__.py delete mode 100644 mefamo/custom/__init__.pyo delete mode 100644 mefamo/custom/face_geometry.pyo create mode 100644 mefamo/pylivelinkface/__init__.py create mode 100644 mefamo/pylivelinkface/pylivelinkface.py rename examples/mefamo_cli.py => mefamo_cli.py (96%) diff --git a/mefamo/blendshapes/blendshape_calculator.py b/mefamo/blendshapes/blendshape_calculator.py index 6608f02..26d0dca 100644 --- a/mefamo/blendshapes/blendshape_calculator.py +++ b/mefamo/blendshapes/blendshape_calculator.py @@ -103,14 +103,18 @@ def _calculate_mouth_landmarks(self): jaw_open_ratio = jaw_nose_dist / head_height # self._live_link_face.set_blendshape(ARKitFace.MouthFrownRight, max(min(mouth_frown_right, 1), 0)) + jaw_open = self._remap_blendshape( FaceBlendShape.JawOpen, jaw_open_ratio) self._live_link_face.set_blendshape(FaceBlendShape.JawOpen, jaw_open) - + mouth_open = self._remap_blendshape( FaceBlendShape.MouthClose, mouth_center_nose_dist - mouth_open_dist) self._live_link_face.set_blendshape( FaceBlendShape.MouthClose, mouth_open) + + print(mouth_open) + # TODO mouth open but teeth closed smile_left = upper_lip[1] - mouth_corner_left[1] @@ -146,7 +150,8 @@ def _calculate_mouth_landmarks(self): mouth_left_stretch = mouth_corner_left[0] - mouth_left_stretch_point[0] mouth_right_stretch = mouth_right_stretch_point[0] - mouth_corner_right[0] mouth_center_left_stretch = mouth_center[0] - mouth_left_stretch_point[0] - mouth_center_right_stretch = mouth_center[0] - mouth_right_stretch_point[0] + mouth_center_right_stretch = mouth_ce + nter[0] - mouth_right_stretch_point[0] mouth_left = self._remap_blendshape( FaceBlendShape.MouthLeft, mouth_center_left_stretch) diff --git a/mefamo/blendshapes/blendshape_config.py b/mefamo/blendshapes/blendshape_config.py index ed29f47..98a7dcb 100644 --- a/mefamo/blendshapes/blendshape_config.py +++ b/mefamo/blendshapes/blendshape_config.py @@ -96,7 +96,7 @@ class CanonicalPpoints: # FaceBlendShape.NoseSneerLeft : (-0.4, 0.0), # FaceBlendShape.NoseSneerRight : (-0.4, 0.0), # FaceBlendShape.TongueOut : (-0.4, 0.0), - # FaceBlendShape.HeadYaw : (-0.4, 0.0), + # FaceBlendShape.67 : (-0.4, 0.0), # FaceBlendShape.HeadPitch : (-0.4, 0.0), # FaceBlendShape.HeadRoll : (-0.4, 0.0), # FaceBlendShape.LeftEyeYaw : (-0.4, 0.0), diff --git a/mefamo/custom/__init__.py b/mefamo/custom/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/mefamo/custom/__init__.pyo b/mefamo/custom/__init__.pyo deleted file mode 100644 index 5456f4af2a38a2467a61b304b09f6d45871c73ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmWIL<>g`k0*<7qi6Hthh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2DX#VRH_KP5G$ zpt2+*KQAUHvn(|&F*!B9B(=CCCb_h@BtJJMK0Y%qvm`!Vub}c4hfQvNN@-529mt^1 HK+FIDUzHzh diff --git a/mefamo/custom/face_geometry.pyo b/mefamo/custom/face_geometry.pyo deleted file mode 100644 index 52c140e7bc452517e58c9875ce6a53f70b70b951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36723 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 None: + + # properties + self.uuid = uuid + self.name = name + self.fps = fps + self._filter_size = filter_size + + self._version = 6 + now = datetime.datetime.now() + timcode = Timecode( + self._fps, f'{now.hour}:{now.minute}:{now.second}:{now.microsecond * 0.001}') + self._frames = timcode.frames + self._sub_frame = 1056060032 # I don't know how to calculate this + self._denominator = int(self._fps / 60) # 1 most of the time + self._blend_shapes = [0.000] * 61 + self._old_blend_shapes = [] # used for filtering + for i in range(61): + self._old_blend_shapes.append(deque([0.0], maxlen = self._filter_size)) + + @property + def uuid(self) -> str: + return self._uuid + + @uuid.setter + def uuid(self, value: str) -> None: + # uuid needs to start with a $, if it doesn't add it + if not value.startswith("$"): + self._uuid = '$' + value + else: + self._uuid = value + + @property + def name(self) -> str: + return self._name + + @name.setter + def name(self, value: str) -> None: + self._name = value + + @property + def fps(self) -> int: + return self._fps + + @fps.setter + def fps(self, value: int) -> None: + if value < 1: + raise ValueError("Only fps values greater than 1 are allowed.") + self._fps = value + + def encode(self) -> bytes: + """ Encodes the PyLiveLinkFace object into a bytes object so it can be + send over a network. """ + + version_packed = struct.pack(' float: + """ Get the current value of the blend shape. + + Parameters + ---------- + index : FaceBlendShape + Index of the BlendShape to get the value from. + + Returns + ------- + float + The value of the BlendShape. + """ + return self._blend_shapes[index.value] + + def set_blendshape(self, index: FaceBlendShape, value: float, + no_filter: bool = False) -> None: + """ Sets the value of the blendshape. + + The function will use mean to filter between the old and the new + values, unless `no_filter` is set to True. + + Parameters + ---------- + index : FaceBlendShape + Index of the BlendShape to get the value from. + value: float + Value to set the BlendShape to, should be in the range of 0 - 1 for + the blendshapes and between -1 and 1 for the head rotation + (yaw, pitch, roll). + no_filter: bool + If set to True, the blendshape will be set to the value without + filtering. + + Returns + ---------- + None + """ + + if no_filter: + self._blend_shapes[index.value] = value + else: + self._old_blend_shapes[index.value].append(value) + filterd_value = mean(self._old_blend_shapes[index.value]) + self._blend_shapes[index.value] = filterd_value + + @staticmethod + def decode(bytes_data: bytes) -> Tuple[bool, PyLiveLinkFace]: + """ Decodes the given bytes (send from an PyLiveLinkFace App or from + this library) and creates a new PyLiveLinkFace object. + Returns True and the generated object if a face was found in the data, + False an a new empty PyLiveLinkFace otherwise. + + Parameters + ---------- + bytes_data : bytes + Bytes input to create the PyLiveLinkFace object from. + + Returns + ------- + bool + True if the bytes data contained a face, False if not. + PyLiveLinkFace + The PyLiveLinkFace object. + + """ + version = struct.unpack(' name_end_pos + 16: + + #FFrameTime, FFrameRate and data length + frame_number, sub_frame, fps, denominator, data_length = struct.unpack( + "!if2ib", bytes_data[name_end_pos:name_end_pos + 17]) + + if data_length != 61: + raise ValueError( + f'Blend shape length is {data_length} but should be 61, something is wrong with the data.') + + data = struct.unpack( + "!61f", bytes_data[name_end_pos + 17:]) + + live_link_face = PyLiveLinkFace(name, uuid, fps) + live_link_face._version = version + live_link_face._frames = frame_number + live_link_face._sub_frame = sub_frame + live_link_face._denominator = denominator + live_link_face._blend_shapes = data + + return True, live_link_face + else: + #print("Data does not contain a face, returning default empty face.") + return False, PyLiveLinkFace() diff --git a/examples/mefamo_cli.py b/mefamo_cli.py similarity index 96% rename from examples/mefamo_cli.py rename to mefamo_cli.py index 2fa6047..adf5257 100644 --- a/examples/mefamo_cli.py +++ b/mefamo_cli.py @@ -1,4 +1,4 @@ -from mefamo import Mefamo +from mefamo.mefamo import Mefamo from argparse import ArgumentParser if __name__ == "__main__": From 620e5aea9428d8dc08b292363778ce78f011f980 Mon Sep 17 00:00:00 2001 From: gyqls153 Date: Mon, 21 Nov 2022 21:52:24 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[=EC=95=88=EC=A0=95=EB=AA=A8]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 에러 수정 --- mefamo/blendshapes/blendshape_calculator.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mefamo/blendshapes/blendshape_calculator.py b/mefamo/blendshapes/blendshape_calculator.py index 26d0dca..98df4db 100644 --- a/mefamo/blendshapes/blendshape_calculator.py +++ b/mefamo/blendshapes/blendshape_calculator.py @@ -150,8 +150,7 @@ def _calculate_mouth_landmarks(self): mouth_left_stretch = mouth_corner_left[0] - mouth_left_stretch_point[0] mouth_right_stretch = mouth_right_stretch_point[0] - mouth_corner_right[0] mouth_center_left_stretch = mouth_center[0] - mouth_left_stretch_point[0] - mouth_center_right_stretch = mouth_ce - nter[0] - mouth_right_stretch_point[0] + mouth_center_right_stretch = mouth_center[0] - mouth_right_stretch_point[0] mouth_left = self._remap_blendshape( FaceBlendShape.MouthLeft, mouth_center_left_stretch)