Python, OpenCV Haar Cascades를 이용한 얼굴 인식방법
2001년 Viola와 Jones가 "Rapid Object Detection using a Boosted Cascade of Simple Features" 논문에서 특징(feature) 기반의 Object 검출 알고리즘(Haar cascades)을 소개하였습니다.
근래에 많은 알고리즘(HOG + Linear SVM, SSD, Faster R-CNN, YOLO 등)이 Haar cascades보다 더 정확하지만 여전히 오늘날에도 Object 검출 연구와는 관련성이 있고 매우 유용합니다. 그리고 확실한 것은 Haar cascades 속도가 너무 빨라 그 속도를 능가하기 어렵다는 것입니다.
Haar cascades는 OpenCV에서 사용이 가능하고 리소스가 제한된 환경에서 사용 있습니다.
알고리즘은 다음 4단계로 구성됩니다.
- Haar Feature Selection
- Creating Integral Images
- Adaboost Training
- Cascading Classifiers
OpenCV를 이용하여 Haar cascades를 사용하는 방법에 대해 소개하겠습니다.
OpenCV는 사전 훈련된 Haar cascades를 제공합니다. 필요한 Haar cascades를 다운로드 후 진행하시기 바랍니다.
파일명 | 검출 대상 |
haarcascade_frontalface_default.xml haarcascade_frontalface_alt.xml haarcascade_frontalface_alt2.xml haarcascade_frontalface_alt_tree.xml |
정면 얼굴 검출 |
haarcascade_profileface.xml | 측면 얼굴 검출 |
haarcascade_smile.xml | 웃음 검출 |
haarcascade_eye.xml haarcascade_eye_tree_eyeglasses.xml haarcascade_lefteye_2splits.xml haarcascade_righteye_2splits.xml |
눈 검출 |
haarcascade_frontalcatface.xml haarcascade_frontalcatface_extended.xml |
고양이 얼굴 검출 |
haarcascade_fullbody.xml | 사람의 전신 검출 |
haarcascade_upperbody.xml | 사람의 상반신 검출 |
haarcascade_lowerbody.xml | 사람의 하반신 검출 |
haarcascade_russian_plate_number.xml haarcascade_licence_plate_rus_16stages.xml |
러시아 자동차 번호판 검출 |
1. Import Packages
import matplotlib.pyplot as plt import imutils import cv2 import os
2. Function
Colab 또는 Jupyter Notebook에서 이미지를 확인하기 위한 Function입니다.
def plt_imshow(title='image', img=None, figsize=(8 ,5)): plt.figure(figsize=figsize) if type(img) == list: if type(title) == list: titles = title else: titles = [] for i in range(len(img)): titles.append(title) for i in range(len(img)): if len(img[i].shape) <= 2: rgbImg = cv2.cvtColor(img[i], cv2.COLOR_GRAY2RGB) else: rgbImg = cv2.cvtColor(img[i], cv2.COLOR_BGR2RGB) plt.subplot(1, len(img), i + 1), plt.imshow(rgbImg) plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.show() else: if len(img.shape) < 3: rgbImg = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB) else: rgbImg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(rgbImg) plt.title(title) plt.xticks([]), plt.yticks([]) plt.show()
3. Load Haar cascades
cascades_path = 'lib/haar_cascades' detectorPaths = { "face": "haarcascade_frontalface_default.xml", "eyes": "haarcascade_eye.xml", }
detectors = {} for (name, path) in detectorPaths.items(): path = os.path.sep.join([cascades_path, path]) detectors[name] = cv2.CascadeClassifier(path)
4. Load Image
image_path = 'asset/images/Emmanuel_Macron.jpg' image = cv2.imread(image_path) image = imutils.resize(image, width=500) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
5. Face Detection
faceRects = detectors["face"].detectMultiScale(gray, scaleFactor=1.05, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
for (fX, fY, fW, fH) in faceRects: # 얼굴 ROI 추출 faceROI = gray[fY:fY+ fH, fX:fX + fW] # 눈 ROI 추출 eyeRects = detectors["eyes"].detectMultiScale(faceROI, scaleFactor=1.1, minNeighbors=10, minSize=(15, 15), flags=cv2.CASCADE_SCALE_IMAGE) # 눈 bounding box for (eX, eY, eW, eH) in eyeRects: # draw the eye bounding box ptA = (fX + eX, fY + eY) ptB = (fX + eX + eW, fY + eY + eH) cv2.rectangle(image, ptA, ptB, (0, 0, 255), 2) # 얼굴 bounding box cv2.rectangle(image, (fX, fY), (fX + fW, fY + fH), (0, 255, 0), 2)
6. Result
plt_imshow("Output", image, figsize=(16,10))

얼굴과 눈의 위치를 잘 찾았네요.
하지만..
Haar Cascades는 정면의 이미지에는 잘 찾지만 잘못 인식하는 경우도 매우 많습니다. 아래는 바위에서 많은 얼굴을 찾아냈네요.

속도가 빠르기때문에 실시간으로 실행해도 문제가 없지만 보시다시피 인식 자체가 매우 정확한 편은 아닙니다.

[참고] dlib, Python을 이용하여 얼굴 검출하기
[참고] dlib, Python을 이용하여 얼굴 인식하는 방법
[참고] dlib, Python을 이용하여 강아지 얼굴 인식하는 방법
'Tech & Development > AI' 카테고리의 다른 글
Edge Detection with OpenCV and Deep Learning (0) | 2022.02.08 |
---|---|
[ Python ] 미디어파이프(Mediapipe) 이용한 얼굴인식 (2) | 2022.02.04 |
dlib, Python을 이용하여 강아지 얼굴 인식하는 방법 (3) | 2022.01.24 |
dlib, Python을 이용하여 얼굴 인식하는 방법 (0) | 2022.01.20 |
dlib, Python을 이용하여 얼굴 검출하기 (0) | 2022.01.20 |
댓글
이 글 공유하기
다른 글
-
Edge Detection with OpenCV and Deep Learning
Edge Detection with OpenCV and Deep Learning
2022.02.08이미지를 다루다보면 특정 영역의 윤곽선 검출이 필요한 경우가 있습니다. 예를들면 촬영한 문서 이미지를 스캔한 이미지 형태로 만들기 위해 가장 큰 사각형의 영역을 찾는다거나 특정 물체의 경계를 찾기도 하고 나아가 이미지를 분석하거나 패턴을 파악하기 위해서도 사용됩니다. 일반적으로 가장 많이 알려진 edge detection algorithms은 Sobel, Canny, Prewiit, Roberts, Fuzzy Logic 방법 등이 있습니다. 이미지 연산을 통한 윤곽선 검출은 임계값을 수동으로 적용해야 하는데 하나의 이미지에서 잘 적용되는 임계값은 다른 이미지에서 제대로 작동하지 않을 수 있습니다. 그리고 추출하려는 영역이 배경이미지와 대비가 잘 되지 않는 경우 윤곽선을 찾는건 매우 어렵고 복잡한 이미지 … -
[ Python ] 미디어파이프(Mediapipe) 이용한 얼굴인식
[ Python ] 미디어파이프(Mediapipe) 이용한 얼굴인식
2022.02.04미디어파이프(Mediapipe)는 구글에서 인체를 대상으로 하는 인식에 대해 다양한 형태로 기능과 모델까지 제공하는 서비스입니다. Python 이외에도 다양한 프로그램언어와 환경에서에서 사용하기 편리한 라이브러리 형태로 제공되며 설치 후 즉시 간편하게 사용이 가능합니다. 이전 글에서 소개한 dlib을 이용한 얼굴인식을 처음 사용해본건 2018년이였는데 처음 사용 했을 때 신기하기도 했고 상당히 빠르기때문에 영상에 적용하여 다양한 응용도 했었습니다. 하지만 dlib을 사용하면서 이런 부분은 조금 문제가 있어서 어려움이 있겠구나 하는 부분도 많았죠. (물론 dlib를 모두 이해하고 사용해본것은 아니지만…) 그런데 최근 MediaPipe라는 라이브러리를 사용해보고 다시 한번 놀랬습니다. MediaPipe의 … -
dlib, Python을 이용하여 강아지 얼굴 인식하는 방법
dlib, Python을 이용하여 강아지 얼굴 인식하는 방법
2022.01.24사람 얼굴을 인식하는 방법에서 조금 더 나아가 강아지의 얼굴을 인식하는 방법에 대해 알아보겠습니다. 강아지 얼굴을 인식하기 위한 모델은 tureckova 라는 분이 개발한 모델을 사용했습니다. (tureckova는 강아지가 카메라를 바라보면 얼굴을 인식하여 자동으로 저장하기 위한 프로그램을 개발하기 위한 목적이였다고 설명하고 있습니다.) 모델 파일은 링크에서 다운로드 가능합니다. (dogHeadDetector.dat, landmarkDetector.dat 파일을 다운로드 받습니다.) 아직까지 사람들은 자신의 얼굴을 인식되는 상황에 대해 거부감이 있습니다. 실제 얼굴 사진을 수집하는 것이 아니라 얼굴의 측정값이라 하더라도 말이죠. 그래서 오히려 강아지 얼굴을 인식하고 구별 할 수 있다면 유기견 문제를 해결… -
dlib, Python을 이용하여 얼굴 인식하는 방법
dlib, Python을 이용하여 얼굴 인식하는 방법
2022.01.20간혹 TV나 영화를 보다보면 누가 누군인지 모를 정도로 닮아 혼란에 빠뜨리게 하는 연애인이 있습니다. 다른 연애인 도플갱어 블로그나 얼굴 인식 기술을 소개하는 자료를 보면 항상 등장하는 사람이 있는데, 바로 Will Ferrell(배우)과 Chad Smith(뮤지션) 입니다. 실제로 두 사람은 닮은 꼴로 유명해서 The Tonight Show라는 토크쇼에 출연했었습니다. 이전 글에서 얼굴을 검출하는 방법을 소개했었는데, 이번에는 얼굴 고유한 특징을 찾아 구별해내는 얼굴 인식 기술을 구현하는 방법을 소개하도록 하겠습니다. 참고 실제로 얼굴을 구별하는 단계에 이르렀습니다. 하지만 이미 얼굴 태그가 달린 사람들과 비교를 하기에는 너무 오래 걸립니다. 특히 수십억 멱의 사용자와 1조 개의 사진이 있는 Faceb…
댓글을 사용할 수 없습니다.