Haar 캐스케이드 분류기를 사용한 OpenCV 얼굴 감지

Salman Mehmood 2024년2월15일
Haar 캐스케이드 분류기를 사용한 OpenCV 얼굴 감지

이 데모에서는 haar 기능 기반 캐스케이드 분류기를 사용하여 얼굴 감지의 기본 사항을 배우고 OpenCV의 이미지 및 비디오에서 얼굴을 감지하는 방법을 배웁니다.

OpenCV에서 Haar Cascade Classifier를 사용하여 얼굴 감지 프로젝트 만들기

Haar feature-based cascade classifiers를 사용한 객체 감지는 Paul Viola와 Michael Jones가 사람들에게 제안한 효과적인 객체 감지 방법입니다. Haar 기능 기반 캐스케이드 분류기는 많은 양수 및 음수 이미지에 대해 캐스케이드 기능이 훈련되는 기계 학습 기반 접근 방식입니다.

그렇다면 이러한 긍정적인 이미지와 부정적인 이미지는 무엇일까요? 분류기는 특정 개체에 대한 수백 개의 샘플 보기로 훈련되며, 이는 얼굴이나 자동차 또는 포지티브라고 하는 기타 개체일 수 있습니다.

예를 들어 얼굴을 감지하려면 얼굴이 포함된 이미지 수로 분류기를 훈련시켜야 합니다. 그런 다음 긍정적 인 이미지라고합니다.

다른 경우에 얼굴을 감지하고 이미지에 얼굴이 포함되어 있지 않은 경우 이를 네거티브 이미지라고 합니다.

분류기가 훈련된 후에는 입력 이미지에서 관심 영역에 적용될 수 있습니다. 영역이 개체를 표시할 가능성이 있는 경우 분류기 출력은 1입니다. 그렇지 않으면 0입니다.

OpenCV에서 Haar Cascade 감지를 사용하는 방법을 살펴보겠습니다.

OpenCV에는 트레이너와 탐지기가 함께 제공됩니다. 시계, 자동차 등과 같은 객체에 대해 분류기를 훈련시키려면 이 분류기를 사용할 수 있습니다.

OpenCV GitHub 페이지에서 훈련된 분류자 XML 파일을 찾을 수 있습니다. 이 리포지토리 내에는 훈련된 분류기가 많이 있습니다.

OpenCV GitHub 훈련된 분류자 XML 파일

이 강조 표시된 파일을 연 다음 원시 아이콘 버튼을 클릭하여 다운로드하기만 하면 됩니다. 열리면 마우스 오른쪽 버튼을 클릭하여 컴퓨터에 저장할 수 있습니다.

코드 편집기를 열고 분류자를 정의해 보겠습니다.

분류자 경로를 제공할 수 있는 CascadeClassifier()라는 메서드가 있습니다. 분류기를 정의하고 나면 이미지를 읽습니다.

F_C = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

이 분류기는 회색조 이미지와 함께 작동하므로 이미지를 회색조 이미지로 변환해야 합니다. 이미지 변환을 구현하는 것은 정말 쉬울 것입니다.

IMG = cv2.imread("inp.png")
G_scale = cv2.cvtColor(IMG, cv2.COLOR_BGR2GRAY)

다음 단계는 이 이미지 내부의 얼굴을 감지하는 것입니다. 이를 위해 Faces라는 변수를 선언합니다. 세 개의 매개변수를 사용하는 detectMultiScale() 메서드를 호출합니다.

첫 번째는 회색조 이미지이고 두 번째 인수는 각 이미지 크기에서 이미지 크기가 얼마나 축소되는지 지정하는 데 사용되는 배율 인수입니다. 다음은 최소 이웃 매개변수로, 각 후보 직사각형에서 이를 유지해야 하는 이웃의 수를 지정합니다.

Faces = F_C.detectMultiScale(G_scale, 1.1, 4)

마지막 단계는 감지한 모든 면을 반복한 다음 직사각형을 그리는 것입니다. 이 Faces 변수는 각 직사각형이 감지된 개체를 포함하는 직사각형의 벡터가 될 것이며, 우리의 경우 감지된 얼굴이 될 것입니다.

Faces 개체에서 (x,y,w,h) 매개변수를 가져옵니다. 이것은 객체의 사각형 값입니다.

좌표를 가져오는 동안 rectangle() 메서드를 사용하여 사각형을 그립니다.

몇 가지 매개변수가 필요합니다. 첫 번째는 이미지이고 두 번째는 Faces 벡터를 사용하여 얻은 (x,y) 점이며 다음 매개변수는 직사각형의 두 번째 점입니다.

다음 두 매개변수는 색상과 두께입니다.

import cv2

F_C = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

IMG = cv2.imread("inp.png")
G_scale = cv2.cvtColor(IMG, cv2.COLOR_BGR2GRAY)
Faces = F_C.detectMultiScale(G_scale, 1.1, 4)

for (x, y, w, h) in Faces:
    cv2.rectangle(IMG, (x, y), (x + w, y + h), (255, 0, 0), 3)

cv2.imshow("IMG", IMG)

cv2.waitKey()

이제 이미지 내부에서 얼굴이 감지된 것을 볼 수 있습니다.

OpenCV Haar 캐스케이드 이미지 얼굴 감지 출력

다른 접근 방식이 아니므로 비디오 내에서 얼굴을 감지해 보겠습니다. 이 접근 방식을 모든 프레임에만 적용하면 되므로 이미지를 읽는 대신 VideoCapture() 메서드를 사용하여 비디오를 캡처합니다.

프레임을 캡처하려면 Video 변수를 정의하고 VideoCapture()와 동일하게 만들고 mp4 파일을 제공해야 합니다. 카메라가 있는 경우 0을 제공할 수 있습니다.

이제 위의 모든 코드를 while 루프에 묶고 while 루프에 isOpened() 메서드를 정의합니다. 이 메서드가 true 값을 반환하면 프로그램은 계속해서 프레임을 읽습니다. 우리는 Video.read()를 호출해야 합니다. 이는 우리가 모든 프레임을 읽고 있음을 의미합니다.

누군가가 q 키를 눌렀을 때 조건을 정의하면 프로그램이 while 루프에서 벗어날 것입니다. 마침내 while 루프 외부에서 비디오를 공개합니다.

import cv2

F_C = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

Video = cv2.VideoCapture("inp.mp4")

while Video.isOpened():
    _, IMG = Video.read()

    G_scale = cv2.cvtColor(IMG, cv2.COLOR_BGR2GRAY)
    Faces = F_C.detectMultiScale(G_scale, 1.1, 4)

    for (x, y, w, h) in Faces:
        cv2.rectangle(IMG, (x, y), (x + w, y + h), (255, 0, 0), 3)

    cv2.imshow("Window", IMG)
    K = cv2.waitKey(1)
    if K & 0xFF == ord("q"):
        break

Video.release()

이 비디오에서는 실시간 비디오에서 감지된 얼굴을 볼 수 있습니다.

OpenCV Haar Cascade 비디오 얼굴 감지 출력

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

관련 문장 - Python OpenCV