본 포스팅에서는 OpenCV Python을 활용하여 얼굴 검출을 수행하는 방법을 소개합니다. 얼굴 검출은 컴퓨터 비전 분야에서 매우 중요한 작업 중 하나로, 이미지나 비디오에서 얼굴을 자동으로 인식하는 기술을 말합니다. 여기서는 하르 캐스케이드(Haar Cascade)라고 하는 객체 검출기를 사용하였고, 실행 환경은 Google Colab에서 실행하였습니다. 

1. OpenCV 설치하기

OpenCV가 설치되어 있지 않은 분들만 다음 코드를 콜랩에서 실행하여 설치해 주시면 됩니다.

!pip install opencv-python

2. Haar Cascade 파일 다운로드

얼굴 검출을 위해 미리 학습된 Haar Cascade 파일이 필요합니다. OpenCV 공식 GitHub 저장소에서 다양한 학습된 모델을 제공하고 있으며, 다음 링크로 들어가셔서 얼굴 검출에 사용할 "haarcascade_frontalface_default.xml" 파일을 다운로드해주시면 됩니다. 

https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml

 

GitHub - opencv/opencv: Open Source Computer Vision Library

Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.

github.com

3. OpenCV 라이브러리 임포트하기

준비 단계는 모두 마쳤고, 이제 본격적으로 얼굴 검출을 진행해보겠습니다. 우선, 다음 코드를 실행하여 OpenCV 라이브러리를 import 해줍니다.

import cv2

4. 구글 드라이브 마운트

구글 드라이브에 있는 파일을 사용하기 위해서 구글 드라이브를 마운트 해줍니다. 다음 코드를 실행만 해주시면 됩니다.

from google.colab import drive
drive.mount('/content/drive')

5. Haar Hascade 경로 설정해 주기

경로는 haarcascade_frontalface_default.xml 파일의 경로로 변경해 주시면 됩니다. 저는 드라이브에서 face 폴더 안에 이 파일을 넣어두었습니다.

# Haar Cascade 파일 경로
cascade_path = '/content/drive/MyDrive/face/haarcascade_frontalface_default.xml'

6. 이미지 읽기

다음으로 얼굴을 검출할 이미지를 불러옵니다. 저는 드라이브에 미리 저장해 두었던 방탄소년단 이미지를 불러왔습니다. 이미지의 형식은 jpeg, jpg 모두 상관없습니다. 

# 이미지 읽기
image_path = '/content/drive/MyDrive/face/bts.jpeg'
image = cv2.imread(image_path)

7. GrayScale로 변경

Haar Cascade는 GrayScale 이미지, 즉 흑백 이미지에서 얼굴을 검출하기 때문에 우리의 이미지 또한 흑백 이미지로 바꿔주어야 합니다. 다음 코드를 실행하시면 이미지를 GrayScale 이미지로 바꾸실 수 있습니다.

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

 

8. 얼굴 검출용 CascadeClassifier 객체 생성

CascadeClassifier 클래스의 인스턴스를 생성하여 얼굴 검출에 사용할 Haar Cascade 파일을 로드합니다.

face_cascade = cv2.CascadeClassifier(cascade_path)

9. 얼굴 검출

detectMultiScale 함수를 사용하여 얼굴을 검출합니다. 첫 번째 인자로는 그레이스케일 이미지를 전달하고, scaleFactor, minNeighbors, minSize와 같은 매개변수를 조정하여 얼굴 검출의 성능을 조절할 수 있습니다.

faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

10. 검출된 얼굴 주변에 사각형 그리기

검출된 얼굴 주위에 사각형을 그려줍니다. 검출된 얼굴의 좌표와 너비, 높이를 사용하여 사각형의 좌표를 계산하고, 그립니다. 이 코드에서는 사각형의 색상을 (0, 255, 0)으로, 두께를 3으로 설정하였습니다.

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

11. 결과 이미지 출력

다음 코드로 얼굴에 사각형이 그려진 이미지를 출력해 볼 수 있습니다. 

from google.colab.patches import cv2_imshow
cv2_imshow(image)
cv2.waitKey(0)
cv2.destroyAllWindows()

전체 코드

import cv2
from google.colab.patches import cv2_imshow

# Haar Cascade 파일 경로
cascade_path = '/content/drive/MyDrive/face/haarcascade_frontalface_default.xml'

# 이미지 읽기
image_path = '/content/drive/MyDrive/face/bts.jpeg'
image = cv2.imread(image_path)

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

# 얼굴 검출용 CascadeClassifier 객체 생성
face_cascade = cv2.CascadeClassifier(cascade_path)

# 얼굴 검출
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 검출된 얼굴 주변에 사각형 그리기
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 3)

# 결과 이미지 출력
cv2_imshow(image)
cv2.waitKey(0)
cv2.destroyAllWindows()

결과 이미지

방탄소년단(bts) 이미지에서 멤버 얼굴 검출하기

하나만 하기에는 아쉬워서 걸그룹 아이브 얼굴도 검출해 보았다.

아이브 이미지에서 멤버 얼굴 검출하기


결론

살짝 정확도가 떨어지는 것 같기는 하지만, 단순 코드 몇 줄로 이렇게 얼굴을 검출할 수 있다는 것이 놀라웠다. 다음 글에서는 얼굴 검출뿐만 아니라 눈 검출이나 다른 것들도 시도해보려고 한다. 

반응형
SMALL

+ Recent posts