[스터디노트] OpenCV - 얼굴 검출과 응용 1

Hwan·2024년 2월 12일

OpenCV

목록 보기
14/15

OpenCV 응용 - 얼굴 검출과 응용

(1) 얼굴 검출(face detection) 개요

  • 영상에서 얼굴의 위치를 검출하는 기법
    • 얼굴 인식(face recognition)은 검출된 얼굴이 누구인지를 판결하느 ㄴ기법
    • 얼굴 랜드마크 검출은 눈, 눈썹, 코, 입 등의 형태까치 찾는 기법
  • 인종, 조명, 표정, 가려짐(안경, 머리카락)등의 변화에 매우 민감
  • 얼굴 검출 응용
    • 카메라에서 얼굴에 초점, 노출 맞추기
    • 얼굴(성별, 나이) 인식, 얼굴 랜드마크 검출을 위한 전처리 과정

(2) 얼굴 검출 기법의 역사

  • 1990년대의 얼굴 검출 기법

    • 눈, 코, 입의 에지 성분 검출 및 위치 관계 분석
    • 살색 영역 검출
    • 초기 신경망 기법
  • 2000년대 초반 : Viola - Jones 얼굴 검출기

    • 다수의 얼굴 영상과 얼굴이 아닌 영상을 이용한 머신 러닝 기법을 도입하여 빠르고 정확하게 얼굴 영역을 검출
    • 기존 방법과의 차별점
      • 유사 하르 특징을 사용
      • AdaBoost에 기반한 강한 분류 성능
      • 캐스케이드 방식을 통한 빠른 동작 속도
    • 기존 얼굴 검출 방법보다 약 15배 빠르게 동작
  • 2010년대 중반 이후의 얼굴 검출 기법

    • 딥러닝 객체 검출 기법을 응용한 얼굴 검출
    • 기존의 Viola - Jones 얼굴 검출 방법보다 정확하고 안정적인 얼굴 검출 가능
    • OpenCV에서는 딥러닝 기법으로 학습된 모델을 사용하는 예제 파일을 제공함

(3) OpenCV DNN 모듈

  • OpenCV DNN 모듈

    • 미리 학습된 딥러닝 모델을 이용하여 실행 하는 기능(OpenCV는 학습하는 용도로는 불가함)
      • 학습은 Tensorflow, PyTorch 등의 딥러닝 프레임워크 이용
    • OpenCV 3.3 버전부터 기본 기능으로 제공
      • OpenCV 4.3 버전부터 GPU(CUDA) 지원 (소스코드 직접 빌드 필요)
    • 지원하는 딥러닝 프레임워크
  • OpenCV DNN 얼굴 검출 예제

    • OpenCV SSD(Single Shot MultiBox Detector) 기반의 딥러닝 네트워크로 학습된 얼굴 검출 예제를 지원

  • SSD의 입력과 출력

  • OpenCV DNN 얼굴 검출 코드 작성 순서

  • OpenCV DNN 얼굴 검출 코드 예제
import sys
import numpy as np
import cv2

# Caffe
# model = './data/res10_300x300_ssd_iter_140000_fp16.caffemodel'
# config = 'opencv_face_detector/deploy.prototxt'

# Tensorflow
model = './data/opencv_face_detector_uint8.pb'
config = './data/opencv_face_detector.pbtxt'

cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print('Camera open failed!')
    sys.exit()

net = cv2.dnn.readNet(model, config)

if net.empty():
    print('Net open failed!')
    sys.exit()

while True:
    ret, frame = cap.read()

    if not ret:
        break

    blob = cv2.dnn.blobFromImage(frame, 1, (300, 300), (104, 177, 123))
    net.setInput(blob)

    out = net.forward()
    detect = out[0, 0, :, :]

    (h, w) = frame.shape[:2]

    for i in range(detect.shape[0]):
        confidence = detect[i, 2]
        if confidence < 0.5:
            break

        x1 = int(detect[i, 3] * w)
        y1 = int(detect[i, 4] * h)
        x2 = int(detect[i, 5] * w)
        y2 = int(detect[i, 6] * h)

        cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0))

        label = f'Face: {confidence:4.2f}'
        cv2.putText(frame, label, (x1, y1 - 1), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 1, cv2.LINE_AA)

    cv2.imshow('frame', frame)

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

cap.release()
cv2.destroyAllWindows()
profile
Hi.

0개의 댓글