원문 : https://google.github.io/mediapipe/solutions/face_mesh
개요
MediaPipe의 얼굴 그물망은 실시간으로 468개의 3D 얼굴 랜드마크를 추정하는 얼굴 형상 솔루션입니다.(모바일에서도 사용 가능!)
머신러닝 기술을 사용하여 3D표면 현상을 유추하므로 전용 센서 없이 일반 카메라만으로 사용이 가능합니다.
이 솔루션은 파이프라인(작업을 병렬 처리하는 기술), GPU 가속, 경량 모델 아키텍처(최적화)를 활용하여, 실시간으로 엄청난 성능을 낼 수 있습니다.
모델
FACE DETECTION MODEL(얼굴 인식 모델)
얼굴 인식은 MediaPipe 얼굴 인식에 사용되는 것과 동일한 BlazeFace 모델입니다.
자세한건 이곳을 읽어주세요.
FACE LANDMARKS MODEL(얼굴 랜드마크 모델)
3D 얼굴 랜드마크에 대해 전송 학습을 채택하고 몇 가지 목표를 가진 네트워크를 훈련시켰습니다.
네트워크는 합성 렌더링 데이터에 대한 3D 랜드마크 좌표를 동시에 예측하고 주석이 달린 실제 데이터에 대한 2D 인풋의 의미를 예측한다.
그 결과 네트워크는 합성 데이터뿐만 아니라 실제 데이터에 대해서도 합리적인 3D 랜드마크 예측을 제공하였다.
ATTENTION MESH MODEL(집중 그물망 모델)
얼굴 그물망 모델 외에도, 우리는 중요한 얼굴 부위에 관심을 집중시키고 더 많은 계산을 합니다.
입술, 눈, 눈동자 주변의 랜드마크을 더 정확하게 예측하는 모델도 제공하고 있습니다.
AR(증강현실) 화장, 요즘 핫한 버츄얼 유튜버 캐릭터 등에 적용할 수 있습니다.
집중 그물망 모델은 솔루션 API에서 refine_landmarks 옵션을 통해 선택할 수 있습니다.
모델에 대한 자세한 내용은 이 문서에서 확인 할 수 있습니다.
Face Geometry Module(면 형상 모듈)
Face Landmark Module은 화면 좌표 공간에서 단일 카메라가 얼굴 랜드마크를 감지해냅니다.
X, Y 좌표는 정규화된 좌표이고 Z 좌표는 상대적이며 약한 투시 투영 카메라 모델에서 X좌표로 크기가 조정됩니다.
이 형식은 일부 어플에서는 적합하지만 가상 3D물체를 감지된 얼굴에 위에 그려내는 증강 현실(AR) 기능에서는 별로 추천하지 않습니다.
주요 개념
METRIC 3D SPACE(계측 3D 공간)
면 형상 모듈 내에 설정된 3D 공간은 오른쪽 정교직교 3D 좌표 공간입니다.
공간 내에서는 공간 원점에 위치 하고 Z축의 음의 방향을 가르키는 가상 투시 카메라가 있습니다.
현재 파이프라인에서는 입력 카메라 프레임이 정확히 가상 카메라에 의해 관찰되므로 해당 매개 변수가 나중에 화면 랜드마크 좌표를 다시 계측 3D 공간으로 변환하는데 사용됩니다.
가상 카메라 매개 변수는 자유롭게 설정할 수 있지만 더 나은 결과를 얻으려면 가능한 실제 촬영용 카메라 매개 변수에 가깝게 설정하는 것이 좋습니다.
CANONICAL FACE MODEL(표준 얼굴 모델)
표준 얼굴 모델은 얼굴 랜드마크 모델의 468개 3D 랜드마크 계산식 따르는 얼굴의 3D 모델입니다.
이 모듈에는 두 가지 중요한 기능이 있습니다.
1. 메트릭 단위 정의
표준 면 모델의 척도는 계측 3D 공간의 계측(Metic) 단위를 정의합니다.
기본 표준 얼굴 모델에서 사용하는 미터법 단위는 센티미터(cm)입니다.
2. 프레임 촬영 런타임 공간 브리지
사실 얼굴 포즈 변환 매트릭스는 표준 얼굴 모델에서 각 프레임별로 추정된 런타임 얼굴 랜드마크 세트까지의 선형 맵이다.
이렇게 하면 표준 얼굴 모델을 중심으로 모델링된 가상 3D 얼굴 포즈 변환 매트릭스를 적용하여 가상 캐릭터가 따라하게 할 수 있습니다.
Components(구성요소들)
GEOMETRY PIPELINE(지오메트리 파이프라인)
지오메트리 파이프라인은 계측 3D 공간 내에서 면 지오메트리 객체를 추정하는 데 사용되는 핵심 구성요소입니다.
각 프레임에서 다음 단계가 지정된 순서대로 실행됩니다.
1. 면 랜드마크 화면 좌표가 미터법 3D 공간 좌표로 변환됩니다.
2. 페이스 포즈 변환 매트릭스는 둘 사이의 차이를 최소화하는 방식으로 런타임 페이스 메트릭 랜드마크 세트로 설정된 표준 페이스 메트릭 랜드마크에서 견고한 선형 매핑으로 추정한다.
3. 면 메시는 런타임 면 메트릭 랜드마크를 정점 위치(XYZ)로 사용하여 생성되며, 정점 텍스처 좌표(UV)와 삼각형 위상은 모두 표준 면 모델에서 상속된다.
EFFECT RENDERER(효과 렌더러)
효과 렌더러는 얼굴 효과 렌더링의 작업 예제 역할을 하는 구성 요소입니다.
ex) 틱톡, Instargram, SNOW, etc.
모바일 장치에서 실시간 성능을 구현하기 위한 OpenGL ES 2.0 API를 사용하며 다음과 같은 렌더링 모드를 지원합니다.
3D 객체 렌더링 모드:
가상 객체를 감지된 얼굴과 위에 그리며 얼굴에 부착된 객체(예: 안경)를 그립니다.
얼굴 그물망 렌더링 모드:
페이스 페인팅 기법을 모방하기 위해 페이스 메시 표면 위에 텍스처가 늘어납니다.
두 렌더링 모드 모두에서 얼굴 그물망은 먼저 깊이 버퍼에 바로 들어가는 폐색체로 렌더링됩니다.
이 단계는 얼굴 표면 뒤에 보이지 않는 요소를 숨겨 더욱 신뢰할 수 있는 효과를 만드는 데 도움이 됩니다.
Solution APIs
네이밍 스타일 및 가용성(=가동률)은 플랫폼 / 언어마다 약간 다를 수 있습니다.
STATIC_IMAGE_MODE(정적 이미지 모드)
false로 설정된 경우, 솔루션은 입력 이미지를 비디오 스트림으로 처리합니다.
첫 번째 입력 이미지에서 얼굴을 감지하고 탐지가 성공하면 얼굴 랜드마크의 위치를 추가로 파악합니다.
후속 영상에서 모든 max_num_faces 면이 감지되고 해당 얼굴 랜드마크가 계산되면 얼굴을 추적할 수 없을 때까지 다른 탐지를 호출하지 않고 이러한 랜드마크만 추적합니다.
따라서 대기 시간이 단축되고 비디오 프레임 처리에 이상적입니다.
true로 설정하면 얼굴 감지가 모든 입력 이미지에서 실행되며, 관련이 없는 정적 이미지 일괄 처리에 이상적입니다.
기본값은 false입니다.
MAX_NUM_FACES(얼굴 최대 갯수)
탐지할 최대 얼굴 수입니다.
기본값은 1입니다.
REFINE_LANDMARKS(정교_랜드마크)
눈과 입술 주변의 랜드마크 좌표를 더욱 정교하게 다듬고 집중 그물망 모델을 적용하여 눈동자 주변의 랜드마크를 추가로 출력할지 여부입니다.
기본값은 false입니다.
MIN_DETECTION_CONFIDENCE(최소_탐지_신뢰도)
탐지가 성공한 것으로 간주되는 얼굴 탐지 모델의 최소 신뢰 값([0.0, 1.0]).
기본값은 0.5입니다.
MIN_TRACKING_CONFIDENCE(최소_추척_신뢰도)
랜드마크 추적 모델의 최소 신뢰 값([0.0, 1.0])이 성공적으로 추적된 것으로 간주되거나, 그렇지 않으면 다음 입력 영상에서 자동으로 얼굴 감지가 호출됩니다.
이 솔루션을 높은 값으로 설정하면 지연 시간이 길어지는 대신 솔루션의 정확성을 높일 수 있습니다.(static_image_mode가 true이면 무시됩니다.)
여기서 얼굴 감지는 모든 이미지에 대해 실행됩니다.
기본값은 0.5입니다.
출력
MULTI_FACE_LANDMARKS(다중_얼굴_랜드마크)
각 면이 468개의 얼굴 랜드마크이 리스트으로 표현되고 각 랜드마크이 x, y 및 z로 구성되는 검출 / 추적된 면의 모음. x와 y는 각각 이미지 폭과 높이로 [0.0, 1.0]으로 정규화된다.
z는 머리 중앙에 깊이가 원점이고 값이 작을수록 랜드마크 깊이를 나타낸다.
랜드마크는 카메라에 있다.
z의 크기는 x와 거의 동일한 척도를 사용합니다.
파이썬 솔루션 API
먼저 MediaPipe 파이썬 패키지를 설치하기 위한 일반적인 지침을 따른 다음, 동반 Python Collab과 아래의 사용 예제를 참조하십시오.
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_face_mesh = mp.solutions.face_mesh
# 이미지 파일의 경우을 사용하세요.:
IMAGE_FILES = []
drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
with mp_face_mesh.FaceMesh(
static_image_mode=True,
max_num_faces=1,
refine_landmarks=True,
min_detection_confidence=0.5) as face_mesh:
for idx, file in enumerate(IMAGE_FILES):
image = cv2.imread(file)
# 작업 전에 BGR 이미지를 RGB로 변환합니다.
results = face_mesh.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# 이미지에 출력하고 그 위에 얼굴 그물망 경계점을 그립니다.
if not results.multi_face_landmarks:
continue
annotated_image = image.copy()
for face_landmarks in results.multi_face_landmarks:
print('face_landmarks:', face_landmarks)
mp_drawing.draw_landmarks(
image=annotated_image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_TESSELATION,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing_styles
.get_default_face_mesh_tesselation_style())
mp_drawing.draw_landmarks(
image=annotated_image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_CONTOURS,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing_styles
.get_default_face_mesh_contours_style())
mp_drawing.draw_landmarks(
image=annotated_image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_IRISES,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing_styles
.get_default_face_mesh_iris_connections_style())
cv2.imwrite('/tmp/annotated_image' +
str(idx) + '.png', annotated_image)
# 웹캠, 영상 파일의 경우 이것을 사용하세요.:
drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
with mp_face_mesh.FaceMesh(
max_num_faces=1,
refine_landmarks=True,
min_detection_confidence=0.5,
min_tracking_confidence=0.5) as face_mesh:
while cap.isOpened():
success, image = cap.read()
if not success:
print("웹캠을 찾을 수 없습니다.")
# 비디오 파일의 경우 'continue'를 사용하시고, 웹캠에 경우에는 'break'를 사용하세요
continue
# 필요에 따라 성능 향상을 위해 이미지 작성을 불가능함으로 기본 설정합니다.
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = face_mesh.process(image)
# 이미지 위에 얼굴 그물망 주석을 그립니다.
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.multi_face_landmarks:
for face_landmarks in results.multi_face_landmarks:
mp_drawing.draw_landmarks(
image=image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_TESSELATION,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing_styles
.get_default_face_mesh_tesselation_style())
mp_drawing.draw_landmarks(
image=image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_CONTOURS,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing_styles
.get_default_face_mesh_contours_style())
mp_drawing.draw_landmarks(
image=image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_IRISES,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing_styles
.get_default_face_mesh_iris_connections_style())
# 보기 편하게 이미지를 좌우 반전합니다.
cv2.imshow('MediaPipe Face Mesh(Puleugo)', cv2.flip(image, 1))
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()
'Python' 카테고리의 다른 글
[파이썬] MediaPipe 손 인식(Hands) (0) | 2021.11.07 |
---|---|
[파이썬] 유튜브 영상 mp3 추출 다운로드 (1) | 2021.11.04 |
[파이썬] MediaPipe 얼굴 인식(Face Detection) (0) | 2021.11.02 |
[파이썬] MediaPipe 얼굴, 포즈 인식 모듈 소개 (1) | 2021.11.01 |
[파이썬] VScode 노란 밑줄 reportMissingImports 오류 해결방법 (0) | 2021.10.31 |
글 내용 중 잘못되거나 이해되지 않는 부분은 댓글을 달아주세요! 감사합니다! 문의: puleugo@gmail.com