Terry Very Good

[Object Detection] 4. 영상을 이용한 얼굴/눈인식 본문

신기술 습득

[Object Detection] 4. 영상을 이용한 얼굴/눈인식

테리베리 2021. 9. 5. 20:50
728x90
반응형

1. 간단한 이론

영상을 미리세컨드 기준으로 image로 읽어서, 해당 이미지의 face detection을 진행시킨다.
GPU를 사용하지 않기때문에 버퍼링이 걸리고, 라즈베리 파이 등을 사용하면 더 걸린다.
영상이기때문에 q를 누르면 종료되는 식으로 만들었다.

haar로 detection할 경우에는 얼굴을 정면으로 똑바로 보지 않을 경우 등에 대한 인식률이 많이 떨어진다. 차근차근 다른 모델들도 사용해보면서 이러한 정확도들을 높여보자.

GAN을 이용해서 오바마가 이상한 연설을 하게끔 만들기도 하고 했다더라.. 내가 다음 배우려고하던 것이 GAN이었는뎅 ㅎㅎ

 

2. GUI를 활용한 이미지를 이용한 얼굴/눈인식

- Library 다운로드

pip install Pillow

 

- 결과 및 코드

import cv2
import numpy as np

data_root = 'D:/Computer Vision/opencv_dnn_202005/video/';
data_root2 = 'D:/Computer Vision/opencv_dnn_202005/video';
cascade_root = 'D:/Computer Vision/ai_cv/haarcascades/';
file_name = data_root+"son_01.mp4"
title_name = 'Haar cascade object detection'
frame_width = 500

face_cascade_name = cascade_root+'haarcascade_frontalface_alt.xml'
eyes_cascade_name = cascade_root+'haarcascade_eye_tree_eyeglasses.xml'

def detectAndDisplay(frame): # 선택한 파일을 사용하여 Face Detection하고 보여주는 함수
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    frame_gray = cv2.equalizeHist(frame_gray)
    #-- Detect faces
    faces = face_cascade.detectMultiScale(frame_gray)
    for (x,y,w,h) in faces:
        
        center = (x + w//2, y + h//2)
        frame = cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 4)
        faceROI = frame_gray[y:y+h,x:x+w]
        #-- In each face, detect eyes
        eyes = eyes_cascade.detectMultiScale(faceROI)
        for (x2,y2,w2,h2) in eyes:
            eye_center = (x + x2 + w2//2, y + y2 + h2//2)
            radius = int(round((w2 + h2)*0.25))
            frame = cv2.circle(frame, eye_center, radius, (255, 0, 0 ), 4)
    cv2.imshow('Capture - Face detection', frame)
    

face_cascade = cv2.CascadeClassifier()
eyes_cascade = cv2.CascadeClassifier()

#-- 1. Load the cascades
if not face_cascade.load(cv2.samples.findFile(face_cascade_name)):
    print('--(!)Error loading face cascade')
    exit(0)
if not eyes_cascade.load(cv2.samples.findFile(eyes_cascade_name)):
    print('--(!)Error loading eyes cascade')
    exit(0)
    
#-- 2. Read the video stream
cap = cv2.VideoCapture(file_name)
if not cap.isOpened:
    print('--(!)Error openiong video capture')
    exit(0)
while True:
    ret, frame = cap.read()
    if frame is None:
        print('--(!) No captured frame -- Break!')
        break
    detectAndDisplay(frame)
    # Hit 'a' an the keyboard to quit!
    if cv2.waitKey(1) & 0xFF == ord('q'): #q를 입력하면 종료
        break

 

728x90
반응형