얼굴 표정 인식
2024. 7. 12. 11:01ㆍDeep Learning
✅ 학습목표 |
○ 얼굴영역 추출 방법 방법에 대해 학습한다 ○ 얼굴표정 인식 방법에 대해 학습한다 ○ 얼굴표정 인식 모델을 구현한다 ○ 실제 얼굴표정으로 인식 모델을 테스트한다 |
✅ 얼굴표정인식의 중요성
- 표정인식은 의사결정, 도덕적 판단, 기타 인지 과정에서 중요한 역할을 담당
- 표정은 개인적인 경험이 아니고 문화와 역사에 의해 형성되므로 해석되고 표현되는 방식은 다양할 수 있음
- 표정은 신체 건강과 관련이 있어 만성 스트레스나 장기간의 부정적인 표정상태는 신체에 악영향을 미침
✅ 표정인식 방법
- 인간은 눈으로 보여지는 데이터를 뇌가 처리하고 환경적 요인에 대한 일관된 표정에 대해 오랜기간동안 경험을 통해 개선된 능력을 통해 인식
- 컴퓨터는 카메라의 시각정보를 디지털 데이터로 변환하여 이미지 분류를 통해 표정을 인식
✅ 얼굴 표정인식의 응용
- 소셜 및 콘텐츠 제작
- 감정적 피드백을 기반으로 사용자 경험을 개인화
- 적응형 학습 시스템은 학습자의 표정에 따라 콘텐츠를 변경하여 보다 맞춤화된 학습환경을 제공
- 의학 연구
- 우울증, 불안 또는 기타 정서 장애의 징후가 있는지 환자를 모니터링
- 치료사가 치료 중 환자의 진행 상황이나 반응을 추적하도록 지원
- 스트레스 수준을 실시간으로 모니터링
- 운전자 안전 메커니즘
- 피로, 주의 산만, 스트레스 또는 졸음의 징후가 있는지 운전자를 모니터링
- 마케팅 및 시장 조사
- 광고에 대한 시청자 반응을 실시간으로 분석
- 시청자의 표정에 맞게 광고 콘텐츠를 변경
- 제품 테스트 및 피드백.
- 보안 및 감시
- 혼잡한 지역에서 의심스럽거나 비정상적인 행동을 감지
- 안전을 위한 공개 행사 중 군중 반응을 분석
✅ 얼굴 표정인식 데이터 셋
- FER+ : 얼굴표정인식(FER) 데이터셋의 확장 버전
- https://paperswithcode.com/dataset/fer
- https://github.com/Microsoft/FERPlus
- 실제 이미지 데이터 : https://www.kaggle.com/c/challenges-in-representation-learning-facial-expression-recognition-challenge/data
- 관련 알고리즘 비교 : https://paperswithcode.com/sota/facial-expression-recognition-on-fer-1
- 얼굴표정에 대한 세련되고 미묘한 레이블을 제공
- FER은 6가지 표정을 분류 (행복, 슬픔, 분노, 놀람, 두려움, 혐오)
- FER+는 중립과 경멸 표정을 추가
FER(위쪽)과 FER+(아래쪽)를 사용한 표정분류
자료 : https://github.com/Microsoft/FERPlus
✅ 표정 인식 시스템의 구성
✅ 얼굴 검출 개요
- 이미지나 영상에서 인간의 얼굴의 존재를 감지하고 위치를 찾는 작업
- 얼굴검출은 얼굴의 랜드마크 감지, 성별 분류, 얼굴 추적, 얼굴 인식 등의 작업의 시작점이라 할 수 있음
- 얼굴검출의 응용 분야 : 보안, 마케팅, 의료, 엔터테인먼트, 법 집행, 감시, 사진, 게임, 화상회의 등
✅ 얼굴검출의 어려운 경우
- 일부분만 보이는 경우
- 조명 : 조명이 얼굴의 부위마다 다른 경우
- 피부색이 다른 경우
- 얼굴의 방향이 다른 경우
- 얼굴의 표정이 다른 경우
- 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)
- 2016년 4월 발표
- 3단계의 CNN으로 구성
- P-Net (Proposed Net) : 얕은 CNN을 통해 후보 창을 신속하게 생성
- R-Net (Refine Net) : 더 복잡한 CNN을 통해 많은 수의 얼굴이 아닌 바운딩 박스를 제외하여 구체화
- O-Net (Output Net) : 강력한 CNN을 사용하여 결과를 구체화하고 다섯 개의 얼굴 랜드 마크 위치를 출력
- 논문 : https://kpzhang93.github.io/MTCNN_face_detection_alignment/paper/spl.pdf
- 참고 : https://github.com/ipazc/mtcnn
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)
- 2019년 4월 발표
- 2개의 스트림 형태로 구성
- 논문 : https://arxiv.org/abs/1810.10220
- 참고 : https://github.com/yxlijun/DSFD.pytorch
- face_detection 참고 : https://pypi.org/project/face-detection/
!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
- 2019년 5월 발표
- 성능이 매우 우수한 얼굴인식기 (mxnet 기반)
- 참고 : https://github.com/serengil/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()
'Deep Learning' 카테고리의 다른 글
OpenCV_021_얼굴검출_스켈레톤(MediaPipe) (0) | 2024.07.11 |
---|---|
Yolo7 기반 객체 탐지 및 인식 (0) | 2024.07.10 |
CNN_개_고양이_이진분류실습(모델링) (0) | 2024.07.09 |
CNN 개_고양이_이진분류 실습(데이터 만들기) (0) | 2024.07.08 |
CNN(Convolutional Neural Network) (0) | 2024.07.05 |