face_alignment_utils.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import numpy as np
  2. import copy
  3. yaw_idx_in_mediapipe_mesh = [356, 454, 361, 288, 397, 379, 378, 377, 152, 148, 149, 150, 172,58, 132, 234, 127]
  4. brow_idx_in_mediapipe_mesh = [70, 63, 105, 66, 107, 336, 296, 334, 293, 300]
  5. nose_idx_in_mediapipe_mesh = [6, 5, 1, 2, 129, 240, 2, 460, 358]
  6. eye_idx_in_mediapipe_mesh = [33, 160, 158, 133, 153, 144, 362, 385, 387, 263, 373, 380]
  7. mouth_idx_in_mediapipe_mesh = [78,191,80,81,82,13,312,311,310,415,308,324,318,402,317,14,87,178,88,95]
  8. lm68_idx_in_mediapipe_mesh = yaw_idx_in_mediapipe_mesh + brow_idx_in_mediapipe_mesh + nose_idx_in_mediapipe_mesh + eye_idx_in_mediapipe_mesh + mouth_idx_in_mediapipe_mesh
  9. def mediapipe_lm478_to_face_alignment_lm68(lm478, H, W, return_2d=True):
  10. """
  11. lm478: [B, 478, 3] or [478,3]
  12. """
  13. lm478 = copy.deepcopy(lm478)
  14. lm478[..., 0] *= W
  15. lm478[..., 1] *= H
  16. n_dim = 2 if return_2d else False
  17. if lm478.ndim == 2:
  18. return lm478[lm68_idx_in_mediapipe_mesh, :n_dim].astype(np.int16)
  19. elif lm478.ndim == 3:
  20. return lm478[:, lm68_idx_in_mediapipe_mesh, :n_dim].astype(np.int16)
  21. else:
  22. raise ValueError("input lm478 ndim should in 2 or 3!")
  23. def mediapipe_lm478_to_lm68_3d(lm478):
  24. """
  25. lm478: [B, 478, 3] or [478,3]
  26. also works for lm468
  27. """
  28. if lm478.ndim == 2:
  29. return lm478[lm68_idx_in_mediapipe_mesh]
  30. elif lm478.ndim == 3:
  31. return lm478[:, lm68_idx_in_mediapipe_mesh]
  32. else:
  33. raise ValueError("input lm478 ndim should in 2 or 3!")