【Python】 OpenCV에 의한 얼굴 검출 (Haar Cascade)

소개



이번에는 OpenCV를 사용하여 얼굴이나 검출을 해보고 싶습니다. 얼굴 검출의 수법은 여러 가지 있습니다만, 이번은 Haar cascade를 이용합니다.

환경



MacOS Mojave
파이썬 3.7

Haar Cascade?



얼굴을 나타내는 특징량(Haar 특징량)으로부터, 이것은 얼굴인지 아닌지를 판단하는 분류기입니다. 이 분류기는, 고속화를 위해 복수의 분류기가 결합해 이루어져 있기 때문에, Cascade (결합) 분류기라고 부릅니다. Haar 특징량은 이하와 같은 흑백의 특징량이 이용됩니다.

그림. Haar 특징량
(이미지 인용 원본 : htp://bs. 그래 cs. 푹 빠져. 아 c. jp/sd/메 m r/오야마타/오펜 CV/html/py_개별 ls/py_오 bj에서 ct/py_휴식_에서 c치온/py_후아세_에서 c치온. HTML)

뭐야 이 흑백은 , , 라고 생각했잖아요. 조금 인간의 얼굴이 어떻게 되어 있는지 생각해 봅시다.

인간의 얼굴은 고도로 추상화하면 대개는 다음과 같이 되는 것이 아닐까요 (되지 않을까...w)

그림. 고도로 추상화된 얼굴

위 그림에서, 예를 들면 눈가는 왼쪽에서 "흑백흑"의 색의 배치가 되어 있다고 생각하지 않습니까.

그림. 고도로 추상화 된 얼굴의 흑백 배치

이 고도로 추상화된 얼굴 같은 흰색과 검정의 배치를 나타낸 것이 Haar 특징량입니다.
입력 화상으로부터 임의의 영역을 잘라내고, 이 특징량이 많이 존재하면, 얼굴이라고 판단합니다.

그림. 얼굴이라고 판단된 이미지 (눈매 등, Haar 특징량이 많이 존재한다)
(이미지 인용 원본 : htp://bs. 그래 cs. 푹 빠져. 아 c. jp/sd/메 m r/오야마타/오펜 CV/HTML/py_개별 ls/py_오 bj에서 ct/py_휴식_에서 c치온/py_후아세_에서 c치온. HTML)

여기에서는 거친 이미지의 해설뿐이므로, 상세를 알고 싶은 분은 이하의 논문을 읽어 보세요.
htps //w w. cs. c 음. 에즈 / ~ 에로 s / 이렇게 rs s / LBMV07 / Pape rs / ぃ ぃ ぁ cvpr-01. pdf

얼굴 검출



그럼, haar cascade를 이용해 사람의 얼굴을 인식하고 싶습니다. 이미지는 다음 이미지 (woman.jpg)를 사용했습니다.


실행한 코드는 다음과 같습니다.
import cv2
import matplotlib.pyplot as plt

#画像の読み込み (画像1066x1600)
img = cv2.imread("woman.jpg")
#顔のカスケード分類器を読み込む
face_cascade = cv2.CascadeClassifier("haarcascades/haarcascade_frontalface_default.xml")
#画像をグレースケールにする
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#顔検出を実行!
faces = face_cascade.detectMultiScale(gray)
#facesに顔の位置が入っているので、for文で読み取る
for (x,y,w,h) in faces:
    #矩形を顔の位置に矩形を描画する
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),10)
#色の順番を変更する
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#出力
plt.imshow(img)
plt.show()

결과


제대로 인식되고 있군요!
다음에 코드안의 포인트만 해설해 갑니다.

캐스케이드 분류기 로딩


#顔のカスケード分類器を読み込む
face_cascade = cv2.CascadeClassifier("haarcascades/haarcascade_frontalface_default.xml")

이 부분에서는 위에서 언급 한 얼굴을 분류하는 cascade 분류기를로드합니다. 만약
OpenCV(4.2.0) /Users/travis/build/skvark/opencv-python/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'

와 같은 메시지가 나오면, 아마 캐스케이드 분류기의 xml 파일이 없기 때문에, 이하로부터 다운로드 (혹은 clone) 해 주세요.
htps : // 기주 b. 코 m / 오펜 cv / 오펜 cv

다운로드가 완료되면 data/haarcascades 폴더를 자신의 python 파일(또는 ipynb)과 같은 폴더에 넣어 실행하십시오.

직사각형 그리기


for (x,y,w,h) in faces:
    #矩形を顔の位置に矩形を描画する
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),10)

얼굴의 위치는 (x, y, 폭, 높이)로 출력됩니다. 이것은 다음과 같습니다.


cv2.reactangle의 인수는 다음과 같습니다.
cv2.reactangle (이미지, (왼쪽 위 x, 왼쪽 위 y), (오른쪽 아래 x, 오른쪽 아래 y), (색), 선 두께)


끝에



캐스케이드 분류기는 얼굴뿐만 아니라 몸통과 하체, 고양이 등도 검출할 수 있습니다. 곧 그 기사도 집필하고 싶습니다. 만약, 기사에 대한 의견, 잘못 등이 있으면 코멘트해 주세요.

트위터



Twitter에서도 발신을 하고 있습니다. 만약 좋으면 팔로우 부탁드립니다,,,!
htps : // 라고 해서 r. 코m/류지 33722052

좋은 웹페이지 즐겨찾기