메뉴 바로가기 본문 바로가기

Face Parsing Tutorial

  • Seokyong Shin
  • 2023.02.22

Face Parsing Tutorial

Introduction

Face parsing(얼굴 분석) 얼굴 이미지를 입력 받아 피부, , , 코와 같은 얼굴의 부위를 픽셀 단위로 판별하는 작업입니다. 얼굴의 세부 부위를 분할하면 크기 조절, 피부 밝기 조절, 헤어스타일 변경, 메이크업 등의 여러 기능을 구현할 있습니다. 아래 그림은 딥러닝 모델을 사용하여 얼굴의 부위를 분할한 , 사람이 알아보기 쉽도록 색칠한 것입니다.

  

그림 1. Face parsing .[1]

 

글에서는 공개된 face parsing 데이터셋과 모델을 사용하여 직접 이를 구현하는 방법을 알아보겠습니다.

 

1. The Fundamentals of face parsing

먼저, face parsing 컴퓨터 비전 분야에서 의미론적 분할(semantic segmentation) 종류입니다. 의미론적 분할은 이미지에서 의미 있는 객체(사람, 자동차 ) 카테고리(클래스) 객체를 구성하는 픽셀을 분류하는 작업입니다. 여기서 의미 있는 객체를 얼굴의 부위로 변경하면, 앞에서 설명한 face parsing 됩니다. 아래 그림은 의미론적 분할을 도식화하였습니다.

 

 


 

그림 2. 의미론적 분할을 단순화한 예시.

 

[2] 왼쪽 사진을 딥러닝 모델로 분할하면 오른쪽과 같이 클래스 번호로 구성된 분할 맵을 출력합니다. 예시의 분할 맵은 단순화한 것으로, 실제로는 입력 이미지 해상도와 동일한 해상도의 분할 맵을 출력합니다.

 

그림 2 같이 분할 결과는 정수로 이루어진 행렬입니다. 이러한 형태의 데이터는 사람이 보기 어려우므로 행렬의 좌표(index) 값을 이용해 그림 1 같이 색칠하여 출력하기도 합니다.

 

의미론적 분할을 자세히 알고 싶으시다면 여기 클릭하여 참고해주세요. (다희 프로님 글로 링크 연결해주세요.)

 

다음 장에서는 오픈소스를 사용하여 직접 face parsing 수행해보겠습니다. 먼저 Python PyTorch 설치되어 있는지 확인해주시고, 없다면 첫번째 링크에서 설치하세요. 그런 다음, 두번째 링크에서 소스코드를 다운로드 해주세요.

https://pytorch.org/get-started/locally/ (PyTorch)

https://github.com/synml/face-parsing.PyTorch (Face parsing)

2. Dataset

공개된 face parsing 데이터셋은 여러가지가 있지만, 여러 연구에서 표준적으로 쓰이는 데이터셋은 아래와 같습니다.

 

  • Helen

 

  • CelebAMask-HQ

 

  • LaPa

 

1. Face parsing 데이터셋 구성 정보

이미지

클래스 개수

해상도

Helen[3]

2,330

11

400 x 400

CelebAMask-HQ[4]

30,000

19

512 x 512

LaPa[5]

22,168

11

450 x 450 ~ 550 x 550

 

글에서는 CelebAMask-HQ 데이터셋을 기준으로 진행하겠습니다.

CelebAMask-HQ데이터셋은 아래 링크에서 다운로드 가능합니다. ( 2.3GB)

https://drive.google.com/file/d/1PtttcVHOjC5-9xSBPWNHh0OOUrEgHWcl/view?usp=sharing

 

다운로드를 완료한 , 압축을 푸시면 아래와 같습니다.

 

 


 

“CelebA-HQ-img” 입력 이미지가 들어있는 폴더이며, “CelebA-HQ-mask-anno” 라벨링된 정답 데이터가 들어있는 폴더입니다.

 

입력 이미지는 3만장으로 구성되며, 다양한 사람들의 얼굴 이미지가 포함되어 있습니다.

 

 


 

그림 3. CelebAMask-HQ 데이터셋의 입력 이미지 예시.

 

정답 데이터는 아래와 같이 클래스마다 이진 영상으로 구성되어 있습니다. 예를 들어, hair 클래스에 해당하는 픽셀은 흰색(RGB: 255, 255, 255)으로 설정되고, 해당하지 않는 픽셀은 검은색(RGB: 0, 0, 0)으로 설정됩니다.

 

 


 

그림 4. CelebAMask-HQ 데이터셋의 정답 데이터 예시.

 

그러나 위의 정답 데이터를 바로 딥러닝 모델의 학습에 사용할 수는 없습니다. 그림 1 따라, 출력 분할 맵은 클래스 번호로 구성된 행렬이므로 정답 데이터도 이와 같은 형태로 변경해야 합니다. 형태가 같아야 딥러닝 모델의 학습이 가능합니다.

 

 


 

그림 5. 딥러닝 모델의 출력 분할 맵과 정답 데이터의 형태가 다름.

 

따라서 정답 데이터를 분할 형식에 맞게 전처리합니다. 아래 명령어를 실행합니다.

python prepropess_data.py

 

그러면 아래와 같이 mask 폴더에 전처리된 정답 데이터가 저장됩니다. 이것들은 입력 이미지와 매칭되는 원본 정답 데이터들을 하나로 합친 것이며, 픽셀은 (0, 0, 0) ~ (19, 19, 19) 값으로 구성되어 있습니다. 지금까지 과정으로 딥러닝 모델 학습 추론을 수행할 준비가 완료되었습니다.

 

 


 

그림 6. CelebAMask-HQ 데이터셋의 전처리 데이터 예시. 분할 맵은 흑백 이미지이며, 픽셀마다 클래스 번호가 매핑되어 있습니다.

3. Model

Face parsing에서 사용되는 딥러닝 모델은 FaRL[6], AGRNet[7], EAGR[8] 등이 있습니다. 글에서는 중에서 BiSeNetV1[9] 사용하여 진행하겠습니다. 사실 BiSeNet face parsing 전용 모델이 아닌 의미론적 분할 모델이지만 연산량이 적어 face parsing 테스트해보기에 적절합니다.

 

 


 

그림 7. BiSeNetV1 구조.[9]

 

BiSeNet 크게 Spatial path Context path 구분됩니다.

1.Spatial path 객체의 위치와 경계에 해당하는 공간 정보를 추출합니다. 3개의 계층이 있으며, 계층에는 stride 2 컨볼루션, 배치 정규화, ReLU 활성화 함수로 구성됩니다.

2.Context path 객체의 클래스를 판별하는 정보를 추출하며, ARM (Attention refinement module)으로 추출한 정보를 더욱 강조(self-attention)합니다.

3.FFM (Feature fusion module) 앞에서 추출한 성질이 다른 정보를 결합하는 모듈입니다. 따라서 먼저 특징을 concatenate하고, 컨볼루션으로 이를 재구성 강조합니다.

 

예제 코드에서는 model.py 파일에서 BiSeNet 확인할 있습니다.

4. Train & Inference

4장에서는 CelebAMask-HQ 데이터셋으로 딥러닝 모델을 학습시킨 , 추론해보겠습니다. 예제를 테스트하려면 GPU 반드시 필요합니다.

4.1. Train

아래 명령어를 실행하여 학습을 시작합니다.

python train.py

 

 


 

그림 8. 학습 실행 예시.

 

학습 과정은 아래와 같습니다.

1.이미지를 딥러닝 모델에 입력

2.모델의 추론

3.추론 결과와 정답 데이터의 차이를 손실 함수로 계산

4.계산한 손실 값을 기반으로 최적화기(Optimizer)에서 딥러닝 모델의 가중치를 조정

5.사용자가 지정한 횟수만큼 반복

 

 


 

그림 9. Face parsing 학습 과정.

 

학습을 완료하는데 시간이 소요되므로 빠른 진행을 원하시면, “res” 폴더에 저장된 “bisenet.pth” 파일을 사용하세요.

4.2. Inference

추론은 아래 명령어를 실행합니다.

python test.py

 

추론 결과는 “test_result” 폴더에 저장되며, 아래와 같습니다.

 

 


 

그림 10. (왼쪽) 딥러닝 모델이 출력한 분할 . (오른쪽) 사람이 알아보기 쉽게 색칠한 추론 결과.

 

 


 

그림 11. Face parsing 추론 과정.

Conclusion

글에서는 공개된 데이터셋과 소스코드를 활용하여 face parsing 테스트해보았습니다. Face parsing 의미론적 분할과 매우 유사하므로 모델을 제외하고 대부분의 코드가 같습니다. 따라서 데이터셋과 모델만 변경하면 의미론적 분할도 쉽게 구현할 있습니다.

지금까지 실습한 내용이 face parsing 의미론적 분할의 입문에 도움 되셨으면 좋겠습니다.

 

Reference

[1] Lin, J., Yang, H., Chen, D., Zeng, M., Wen, F., & Yuan, L. (2019). Face parsing with roi tanh-warping. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 5654-5663).

[2] https://www.jeremyjordan.me/semantic-segmentation/#dilated_convolutions

[3] Le, V., Brandt, J., Lin, Z., Bourdev, L., & Huang, T. S. (2012, October). Interactive facial feature localization. In European conference on computer vision (pp. 679-692). Springer, Berlin, Heidelberg.

[4] Lee, C. H., Liu, Z., Wu, L., & Luo, P. (2020). Maskgan: Towards diverse and interactive facial image manipulation. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 5549-5558).

[5] Liu, Y., Shi, H., Shen, H., Si, Y., Wang, X., & Mei, T. (2020, April). A new dataset and boundary-attention semantic segmentation for face parsing. In Proceedings of the AAAI Conference on Artificial Intelligence (Vol. 34, No. 07, pp. 11637-11644).

[6] Zheng, Y., Yang, H., Zhang, T., Bao, J., Chen, D., Huang, Y., ... & Wen, F. (2021). General Facial Representation Learning in a Visual-Linguistic Manner. arXiv preprint arXiv:2112.03109.

[7] Te, G., Hu, W., Liu, Y., Shi, H., & Mei, T. (2021). Agrnet: Adaptive graph representation learning and reasoning for face parsing. IEEE Transactions on Image Processing, 30, 8236-8250.

[8] Te, G., Liu, Y., Hu, W., Shi, H., & Mei, T. (2020, August). Edge-aware graph representation learning and reasoning for face parsing. In European Conference on Computer Vision (pp. 258-274). Springer, Cham.

[9] Yu, C., Wang, J., Peng, C., Gao, C., Yu, G., & Sang, N. (2018). Bisenet: Bilateral segmentation network for real-time semantic segmentation. In Proceedings of the European conference on computer vision (ECCV) (pp. 325-341).

 

 

   ​About Author 

 

신 석 용

Pro, AI 1팀

syshin@cubox.ai

TAG