parse_face.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from argparse import ArgumentParser
  2. import os
  3. from os.path import join as pjoin
  4. from subprocess import run
  5. import numpy as np
  6. import cv2
  7. from tqdm import tqdm
  8. def create_skin_mask(anno_dir, mask_dir, skin_thresh=13, include_hair=False):
  9. names = os.listdir(anno_dir)
  10. names = [n for n in names if n.endswith('.png')]
  11. os.makedirs(mask_dir, exist_ok=True)
  12. for name in tqdm(names):
  13. anno = cv2.imread(pjoin(anno_dir, name), 0)
  14. mask = np.logical_and(0 < anno, anno <= skin_thresh)
  15. if include_hair:
  16. mask |= anno == 17
  17. cv2.imwrite(pjoin(mask_dir, name), mask * 255)
  18. def main(args):
  19. FACE_PARSING_DIR = 'third_party/face_parsing'
  20. main_env = os.getcwd()
  21. os.chdir(FACE_PARSING_DIR)
  22. tmp_parse_dir = pjoin(args.out_dir, 'face_parsing')
  23. cmd = [
  24. 'python',
  25. 'test.py',
  26. args.in_dir,
  27. tmp_parse_dir,
  28. ]
  29. print(' '.join(cmd))
  30. run(cmd)
  31. create_skin_mask(tmp_parse_dir, args.out_dir, include_hair=args.include_hair)
  32. os.chdir(main_env)
  33. def parse_args(args=None, namespace=None):
  34. parser = ArgumentParser("Face Parsing and generate skin (& hair) mask")
  35. parser.add_argument('in_dir')
  36. parser.add_argument('out_dir')
  37. parser.add_argument('--include_hair', action="store_true", help="include hair in the mask")
  38. return parser.parse_args(args=args, namespace=namespace)
  39. if __name__ == "__main__":
  40. main(parse_args())