OpenCV 강좌, 얼굴, 눈, 미소 등의 분류기 학습

OpenCV는 이미지 처리 및 컴퓨터 비전(Computer Vision) 분야에서 널리 사용되는 오픈 소스 라이브러리입니다. 이 글에서는 얼굴, 눈, 미소 감지와 같은 다양한 분류기를 학습하는 방법에 대해 다뤄보겠습니다. 이 과정은 파이썬을 기반으로 하여 진행하며, 각 단계에서 필요한 예제 코드도 함께 제공하겠습니다.

1. OpenCV 설치하기

먼저, OpenCV 라이브러리를 설치해야 합니다. 다음의 명령어를 사용하여 OpenCV를 설치할 수 있습니다:

pip install opencv-python

추가적으로, 얼굴 인식에 필요한 Haar Cascade 분류기를 사용할 것이므로, 다음의 명령어로 OpenCV-contrib-python도 설치합니다:

pip install opencv-python-headless

2. Haar Cascade 분류기 이해하기

Haar Cascade는 OpenCV에서 제공하는 사전 학습된 분류기입니다. 이미지에서 특정 객체(예: 얼굴, 눈 등)를 감지하는 데 사용됩니다. 이러한 분류기는 다양한 단계의 특징(feature)을 기반으로 작동하며, 긍정적 샘플과 부정적 샘플을 통해 학습됩니다.

3. 얼굴 감지 예제

얼굴 감지를 시작하기 전에 Haar Cascade XML 파일을 다운로드하여야 합니다. OpenCV는 기본적으로 haarcascade_frontalface_default.xml라는 파일을 제공합니다. 예제 코드는 아래와 같습니다:

import cv2

# Haar Cascade 분류기 로드
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 이미지 읽기
image = cv2.imread('image.jpg')

# 그레이스케일 변환
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 얼굴 감지
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

# 결과 출력
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)

cv2.imshow('Face Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

위의 코드에서 얼굴 감지 과정을 설명하겠습니다:

  • Haar Cascade 로드: cv2.CascadeClassifier를 사용하여 Haar Cascade 모델을 로드합니다.
  • 이미지 읽기: cv2.imread로 이미지를 읽어옵니다.
  • 그레이스케일 변환: 감지 성능을 높이기 위해 이미지를 그레이스케일로 변환합니다.
  • 얼굴 감지: detectMultiScale 메서드를 통해 얼굴을 감지합니다.
  • 결과 출력: 감지된 얼굴을 직사각형으로 표시하여 결과를 출력합니다.

4. 눈 감지 예제

눈 감지를 위해 haarcascade_eye.xml 파일을 사용합니다. 아래의 코드를 참조하세요:

# 눈 감지 코드
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

# 얼굴 감지 후 눈 감지
for (x, y, w, h) in faces:
    roi_gray = gray[y:y + h, x:x + w]
    roi_color = image[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('Eye Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

눈 감지 코드의 설명:

  • 얼굴이 감지된 후, 해당 영역(ROI)에서 눈을 감지합니다.
  • 눈을 감지된 영역에 사각형으로 그려 결과를 출력합니다.

5. 미소 감지 예제

미소 감지는 좀 더 복잡한 과정입니다. 미소를 감지하기 위해서는 얼굴의 하단 영역에서 특정 특징을 학습해야 합니다. 이를 위해서는 OpenCV와 함께 머신러닝 모델을 사용할 수 있습니다.

아래는 미소를 감지하기 위한 간단한 알고리즘을 설명합니다:

def smile_detection(image):
    smile_cascade = cv2.CascadeClassifier('haarcascade_smile.xml')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
    for (x, y, w, h) in faces:
        roi_gray = gray[y + h // 2:y + h, x:x + w]
        roi_color = image[y + h // 2:y + h, x:x + w]
        smiles = smile_cascade.detectMultiScale(roi_gray, scaleFactor=1.8, minNeighbors=20)
        for (sx, sy, sw, sh) in smiles:
            cv2.rectangle(roi_color, (sx, sy + h // 2), (sx + sw, sy + h // 2 + sh), (255, 0, 255), 2)
    return image

image = cv2.imread('image.jpg')
result_image = smile_detection(image)
cv2.imshow('Smile Detection', result_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

미소 감지 코드의 설명:

  • 미소를 감지하기 위해 얼굴 감지와 유사한 방법을 사용하지만, 얼굴 하단 부분에서만 감지합니다.
  • scaleFactorminNeighbors 값을 조정하여 감지 성능을 개선합니다.

6. 학습 데이터 생성

자신만의 분류기를 만들고자 할 경우, 긍정적 샘플과 부정적 샘플을 수집하여 학습 데이터를 생성해야 합니다. 긍정적 샘플은 감지하고자 하는 객체의 이미지이며, 부정적 샘플은 해당 객체가 포함되지 않은 이미지입니다.

이러한 샘플을 수집한 후, OpenCV의 opencv_createsamplesopencv_traincascade 도구를 활용하여 분류기를 학습할 수 있습니다.

6.1 긍정적 샘플 만들기

$ opencv_createsamples -info positives.txt -w 20 -h 20 -num 500 -show

6.2 분류기 학습하기

$ opencv_traincascade -data data -vec positives.vec -bg negatives.txt -numPos 400 -numNeg 1000 -numStages 10 -featureType HAAR -mode ALL

7. 결론

OpenCV를 활용한 얼굴, 눈, 미소 감지는 다양한 응용 프로그램에 활용될 수 있습니다. 이 강좌를 통해 basic한 감지 방법을 익힌 후, 더 고급 기술을 익히고자 한다면 딥 러닝을 활용한 방법도 탐구해보는 것을 추천드립니다. 또한, 다른 객체 감지 기법들과의 비교 등을 통해 더 나은 결과를 얻을 수 있습니다.

8. 참고 문헌