티스토리 뷰

활동/ETC

[IT]얼굴 & 눈 검출

geonwoopaeng@gmail.com 2021. 4. 30. 16:57

종설을 가상 안경 피팅룸이라는 주제로 하게 되었는데 얼굴 검출과 눈 검출을 해야 합니다.

그래서 머신러닝과 관련된 다양한 알고리즘을 지원하고 있는 OpenCV를 사용하기로 했습니다.

OpenCV에 있는 것중 HOG, haar feature를 고민 했지만 HOG는 https://darkpgmr.tistory.com/116에 나오는 특징을 보면

HOG는 밝이에 덜 민감하고 물체의 실루엣 정보를 이용하며 물체의 형태변화가 심하지 않고 내부 패턴이 단순하며 물체의 윤곽선으로 물체를 식별할 수 있는 경우 적합

그러나 haar feature의 특징을 보면 명암을 토대로 분류를 하기 때문에 사람 얼굴 검출에 의미있는 feature라고 합니다.

그래서 haar feature을 사용한 캐스케이드를 사용하게 되었습니다.

캐스케이드 분류기

 

캡처1

출처: https://blog.naver.com/dic1224/220989033563

 

  • Viola - Jones 얼굴 검출기
  • Haar-like(유사 하르) 특징 사용 https://en.wikipedia.org/wiki/Haar-like_feature
    • 특정 위치에서 인접한 직사각형 영역을 고려하고 각 영역의 픽셀 강도를 합산하고 합계간의 차이를 계산
      캡처
    • => 사각형 필터(흰색 +검정색)를 이용해서 흰색 사각형 영역 픽셀 합 - 검정색 사각형 영역 픽셀 값(명암)을 파악하여 특징 인지하는 것
  • AdaBoost(Adaptive + Boosting)라는 알고리즘(ML)을 사용합니다.
    • Boosting: 예측 성능이 낮은 weak classifier(약한 분류기)들을 사용하여 좀 더 좋은 성능을 보이는 하나의 strong classifier(강한 분류기)를 만드는 법
    • AdaBoost: weak classifier들이 상호보완 하도록 순차적으로 학습한 후 이들을 조합하여 strong classifier의 성능 향상 https://blog.naver.com/dic1224/220989033563

 

과정

https://www.youtube.com/watch?v=hPCTwxF0qf4

  • 얼굴 영상 & 얼굴이 아닌 영상 학습
    • 얼굴 아닌 것을 빠르게 걸러낸다 + 얼굴 검출(Haar-like) => 반복

 

Code

 

https://github.com/opencv/opencv/tree/master/data/haarcascades

여기 에서 xml 파일 다운받아야 합니다 :) + 경로 설정이 중요합니다.

 

import sys
import numpy as np
import cv2

cam = cv2.VideoCapture(0)

w = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH)) #기본 카메라 넓이
h = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT)) #기본 카메라 높이

# 객체 생성 및 학습 데이터 불러오기
#얼굴 검출
face_classifier = cv2.CascadeClassifier('.\haarcascade_frontalface_alt2.xml')
#눈 검출
eye_classifier = cv2.CascadeClassifier('.\haarcascade_eye.xml')

while True:
    #비디오의 한 프레임씩 읽는다.
    #제대로 읽으면 ret는 True, frame에는 읽은 프레임이 나온다.
    ret, frame = cam.read()

    # 멀티 스케일 객체 검출 함수
    faces = face_classifier.detectMultiScale(frame, minSize=(100, 100), maxSize=(400, 400))

    # 영상 받아오기
    for (x, y, w, h) in faces:
        # 얼굴 빨간색 사각형 그리기
        cv2.rectangle(frame, (x, y, w, h), (255, 0, 255), 2) 

        #눈 검출
        face_half = frame[y:y + h // 2, x:x + w] #위 화면에서만 (빨리 찾기 위함)
        eyes = eye_classifier.detectMultiScale(face_half)

        for (ex, ey, ew, eh) in eyes:
            # 눈 파란색 사각형 그리기
            cv2.rectangle(face_half, (ex, ey, ew, eh), (255, 0, 0), 2) 

    cv2.imshow('IT42', frame)

    if cv2.waitKey(1) == 27:
        break

cam.release()
cv2.destroyAllWindows()

 

eye_face_detection.mp4
2.66MB

반응형

'활동 > ETC' 카테고리의 다른 글

우테코 Cypress 맛보기, 계산기 미션  (0) 2021.10.16
우테코 프리코스 하면서..  (0) 2021.09.06
얼마나 공부하고 있니 ??  (0) 2020.11.15
DSC Core member  (2) 2020.09.30
kakao Coding Test  (0) 2020.09.17
공지사항
최근에 올라온 글