이번 포스팅은 OpenCV에서 Haar Cascades을 이용한 얼굴 검출에 대해 알아보겠습니다.
포스팅 관련 내용은 아래에서 출처를 얻어 사용하였습니다.
https://docs.opencv.org/4.5.0/db/d28/tutorial_cascade_classifier.html
GOAL
- Haar Cascade로 object detection을 어떻게 하는지 알아본다.
- Haar Feature-based Cascade Classifiers를 사용하여 기본적인 얼굴 감지 및 눈 감지를 해본다.
- OpenCV에서 Haar Cascade로 어떻게 detection 하는지 알아본다.
Theory
- Haar feature-based cascade classifiers (Haar feature을 기반으로 한 cascade classifiers)를 사용한 객체 감지는 Paul Viola와 Michael Jones가 2001년에 "Rapid Object Detection using a Boosted Cascade of Simple Features" 논문에서 제안한 효과적인 객체 감지 방법입니다.
- cascade는 대량이 positive(대상) 이미지와 negative(대상이 없는) 이미지로부터 학습하고 이는 다른 이미지에서 객체를 탐지하는데 사용됩니다. 이번 포스팅은 얼굴 탐지를 위해 cascade를 사용합니다.
- 초기의 알고리즘은 분류기를 학습시키기 위해 positive(얼굴) 이미지와 negative(얼굴이 없는) 이미지를 최대한 많이 사용하여 훈련시키는 학습 방식입니다.
- 훈련 시키면서 특성을 추출해 내는데 특성 추출을 위해 haar 특성들이 사용됩니다. 마치 convolution 커널처럼 보이지만 특성들은 검은색 직사각형의 픽셀 합에서 흰색 직사각형의 픽셀 합을 빼서 얻어진 단일 값입니다.
- 이미지에서 특성(features)을 검출하기 위해 가능한 크기의 커널에 대해 이미지 모든 부분에 적용되어야 하는데 얼마나 많은 계산이 필요할까요? 24x24 크기의 이미지만 해도 160000개 이상의 특성 결과가 존재합니다. 이 모든 특성들에 대해 위에서 구한 검은색, 흰색의 픽셀 합을 구해야 하니 매우 비효율적입니다. 이것을 해결하기 위해 논문에서는 integral 이미지, 즉 통합된 이미지를 보여주는데 픽셀의 합을 간단하게 계산하고 속도를 향상합니다.
import numpy as np
import cv2
import matplotlib.pyplot as plt
face_cascade = cv2.CascadeClassifier('./haar/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./haar/haarcascade_eye.xml')
img = cv2.imread('./images/runningman.jpg')
cv2.imshow('Original',img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv2.imshow('Detecting img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
결과)
'영상처리' 카테고리의 다른 글
Python - OpenCV (17) : Camshift (0) | 2021.08.10 |
---|---|
Python - OpenCV (16) : Meanshift (0) | 2021.08.06 |
Python - OpenCV (14) : Image Pyramid (0) | 2021.07.26 |
Python - OpenCV (13) : SVM(Support Vector Machines) (0) | 2021.07.20 |
Python - OpenCV (12) : Segmentation with Watershed (0) | 2021.07.19 |