얼굴 표정 인식

2024. 7. 12. 11:01Deep Learning

 

 ✅ 학습목표
○ 얼굴영역 추출 방법 방법에 대해 학습한다

○ 얼굴표정 인식 방법에 대해 학습한다

○ 얼굴표정 인식 모델을 구현한다

○ 실제 얼굴표정으로 인식 모델을 테스트한다

 

✅ 얼굴표정인식의 중요성

  • 표정인식은 의사결정, 도덕적 판단, 기타 인지 과정에서 중요한 역할을 담당
  • 표정은 개인적인 경험이 아니고 문화와 역사에 의해 형성되므로 해석되고 표현되는 방식은 다양할 수 있음
  • 표정은 신체 건강과 관련이 있어 만성 스트레스나 장기간의 부정적인 표정상태는 신체에 악영향을 미침

✅ 표정인식 방법

  • 인간은 눈으로 보여지는 데이터를 뇌가 처리하고 환경적 요인에 대한 일관된 표정에 대해 오랜기간동안 경험을 통해 개선된 능력을 통해 인식
  • 컴퓨터는 카메라의 시각정보를 디지털 데이터로 변환하여 이미지 분류를 통해 표정을 인식

 

✅ 얼굴 표정인식의 응용

  • 소셜 및 콘텐츠 제작
    • 감정적 피드백을 기반으로 사용자 경험을 개인화
    • 적응형 학습 시스템은 학습자의 표정에 따라 콘텐츠를 변경하여 보다 맞춤화된 학습환경을 제공
  • 의학 연구
    • 우울증, 불안 또는 기타 정서 장애의 징후가 있는지 환자를 모니터링
    • 치료사가 치료 중 환자의 진행 상황이나 반응을 추적하도록 지원
    • 스트레스 수준을 실시간으로 모니터링
  • 운전자 안전 메커니즘
    • 피로, 주의 산만, 스트레스 또는 졸음의 징후가 있는지 운전자를 모니터링
  • 마케팅 및 시장 조사
    • 광고에 대한 시청자 반응을 실시간으로 분석
    • 시청자의 표정에 맞게 광고 콘텐츠를 변경
    • 제품 테스트 및 피드백.
  • 보안 및 감시
    • 혼잡한 지역에서 의심스럽거나 비정상적인 행동을 감지
    • 안전을 위한 공개 행사 중 군중 반응을 분석

 

✅ 얼굴 표정인식 데이터 셋

 

✅ 표정 인식 시스템의 구성

 

✅ 얼굴 검출 개요

  • 이미지나 영상에서 인간의 얼굴의 존재를 감지하고 위치를 찾는 작업
  • 얼굴검출은 얼굴의 랜드마크 감지, 성별 분류, 얼굴 추적, 얼굴 인식 등의 작업의 시작점이라 할 수 있음
  • 얼굴검출의 응용 분야 : 보안, 마케팅, 의료, 엔터테인먼트, 법 집행, 감시, 사진, 게임, 화상회의 등

 

✅ 얼굴검출의 어려운 경우

  • 일부분만 보이는 경우
  • 조명 : 조명이 얼굴의 부위마다 다른 경우
  • 피부색이 다른 경우
  • 얼굴의 방향이 다른 경우
  • 얼굴의 표정이 다른 경우
  • Accessories, 화장, 문신, 수염, 마스크 등이 있는 경우
  • 얼굴의 크기가 다른 경우

 

✅ 얼굴 감지 성능 평가 도구

  • IoU, Precision, Recall, PR 곡선, ROC 곡선, AP, MAP 등

✅ 얼굴 감지 알고리즘 및 데이터 세트의 변천사

 

 

✅ 얼굴 영역 검출 알고리즘 구현

SSD (Single Shot Dectector)

  • 2015년 발표
  • 다른 모델은 객체 감지를 위해 이미지를 2번 이상 반복하는 것에 반해 1번만으로 객체 감지
  • 백본 모델(피쳐 맵 추출기로 작동하는 일반적인 사전 학습된 이미지 분류 네트워크)과 SSD 헤드(두 개의 컨볼루션 레이어로 구성, 바운딩박스 출력)로 구성
  • 참고 : https://github.com/amdegroot/ssd.pytorch

 

✅ MTCNN (Multi-Task Cascaded Convolutional Neural Network)

 

 

from google.colab import drive

drive.mount("/content/drive/")

%cd /content/drive/MyDrive/Colab Notebooks/Deep Learning

!pip install mtcnn

  • 📌 사용이미지를 다운로드하여 구글 드라이브 작업폴더의 images 폴더로 업로드 (파일명 : 103_faces4.jpg)
from mtcnn import MTCNN
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("./data/img2.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# MTCNN 검출기 생성
detector = MTCNN()

# 얼굴 영역 검출 (복수개)
faces = detector.detect_faces(img)

# (x, y, w, h) 형태로 반환 (얼굴 영역의 바운딩 박스 좌표)
# confidence : 정확도
# keypoints : 왼쪽 눈, 오른쪽 눈, 코, 왼쪽 입술, 오른쪽 입술의 좌표 값
print(faces)

# 얼굴 영역을 하나씩 읽어온다
for face in faces :

    # 정확도가 70% 이상인 경우에만 얼굴 영역을 표시
    if face['confidence'] > 0.7 :
        x, y, w, h = face['box']

        # 얼굴 영역을 표시
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

plt.imshow(img)
plt.axis('off')
plt.show()

 

 

✅ DSFD (Dual Shot Face Dectector)

!pip install face_detection

!pip install git+https://github.com/hukkelas/DSFD-Pytorch-Inference.git

import cv2
import matplotlib.pyplot as plt
import face_detection

# 이미지 로드
img = cv2.imread("./data/img2.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 얼굴 검출기 생성
detector = face_detection.build_detector("DSFDDetector",)

# 얼굴 영역 검출
faces = detector.detect(img)

# 좌상단, 우하단 좌표, 정확도
print(faces)

for (x1, y1, x2, y2, score) in faces :
    if score >= 0.9 :
        cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)

plt.imshow(img)
plt.axis('off')
plt.show()

 

✅ RetinaFace

!pip install retina-face

from retinaface import RetinaFace

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("./data/img2.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 얼굴 영역 검출
faces = RetinaFace.detect_faces(img)

# score : 신뢰도
# facial_area : 얼굴 영역 (우하단 좌표, 좌상단 좌표)
print(faces)

for key in faces :
    x2, y2, x1, y1 = faces[key]['facial_area']
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)

plt.imshow(img)
plt.axis('off')
plt.show()

  • 📌 군중 얼굴 추출
    • 사용이미지를 다운로드하여 구글 드라이브 작업폴더의 images 폴더로 업로드 (파일명 : 103_faces3.jpg)
from retinaface import RetinaFace

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("./data/img1.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 얼굴 영역 검출
faces = RetinaFace.detect_faces(img)

# score : 신뢰도
# facial_area : 얼굴 영역 (우하단 좌표, 좌상단 좌표)
print(faces)

for key in faces :
    x2, y2, x1, y1 = faces[key]['facial_area']
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)

plt.imshow(img)
plt.axis('off')
plt.show()

 

 

✅ MediaPipe

  • 2019년 발표
  • BlazeFace를 기반으로 하는 초고속 얼굴 감지 솔루션을 제공
!pip install mediapipe

import mediapipe as mp
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("./data/img2.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

h, w, _ = img.shape

# 그리기 라이브러리
mp_drawing = mp.solutions.drawing_utils

# 얼굴 영역 검출 라이브러리
mp_face_detection = mp.solutions.face_detection

# 그리기 설정
drawing_spec = mp_drawing.DrawingSpec(color=(105, 201, 244))

# 얼굴 검출
with mp_face_detection.FaceDetection(min_detection_confidence=0.5) as face_detection:
    img.flags.writeable = False
    faces = face_detection.process(img)
    img.flags.writeable = True

    # 좌표 추출
    for face in faces.detections :

        # 좌표의 상대적 비율 위치를 가져온다
        bbox = face.location_data.relative_bounding_box
        x, y, w2, h2 = int(bbox.xmin * w), int(bbox.ymin * h), int(bbox.width * w), int(bbox.height * h)

        # 얼굴 영역을 표시
        cv2.rectangle(img, (x, y), (x + w2, y + h2), (0, 255, 0), 2)

plt.imshow(img)
plt.axis('off')
plt.show()