Python DeepLearning

얼굴 인식 모델 구현 (OpenCV 및 딥러닝 활용)

PyExplorer 2025. 4. 30. 19:43
728x90

얼굴 인식 모델 구현 (OpenCV 및 딥러닝 활용)

1. 서론

얼굴 인식 기술은 보안, 출입 관리, 사용자 인증, 사진 분류 등 다양한 분야에서 활용됩니다. OpenCV와 딥러닝을 활용하면 비교적 간단하게 얼굴 인식 모델을 구현할 수 있습니다. 이번 포스팅에서는 OpenCV의 dnn 모듈과 딥러닝 기반 모델을 사용하여 얼굴을 검출하고 인식하는 방법을 소개하겠습니다.

2. 얼굴 인식 개요

얼굴 인식 모델은 일반적으로 두 가지 주요 단계로 구성됩니다:

  1. 얼굴 검출(Face Detection): 이미지 또는 영상에서 얼굴이 포함된 영역을 찾습니다.
  2. 얼굴 인식(Face Recognition): 검출된 얼굴을 데이터베이스의 얼굴과 비교하여 누구인지 식별합니다.

OpenCV는 Haar Cascade, DNN Caffe 모델, Deep Learning 기반 모델 (Dlib, FaceNet 등)을 활용한 얼굴 검출 기능을 제공합니다.

3. OpenCV를 활용한 얼굴 검출

OpenCV에서는 Haar Cascade 또는 DNN 모델을 사용하여 얼굴을 검출할 수 있습니다. 먼저, Haar Cascade를 이용한 간단한 얼굴 검출 예제를 살펴보겠습니다.

3.1 Haar Cascade를 이용한 얼굴 검출

import cv2

# 얼굴 검출기 로드 (Haar Cascade)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 이미지 불러오기
image = cv2.imread('face.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 얼굴 검출
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), (255, 0, 0), 2)

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

위 코드에서는 OpenCV의 CascadeClassifier를 이용하여 얼굴을 검출하고, 검출된 영역을 사각형으로 표시합니다.

3.2 DNN 기반 얼굴 검출

딥러닝을 활용한 DNN 모듈을 사용하면 더욱 정교한 얼굴 검출이 가능합니다. OpenCV는 ResNet-SSD 기반의 Caffe 모델을 제공하며, 이를 활용하여 얼굴 검출을 수행할 수 있습니다.

import cv2
import numpy as np

# 모델 파일 로드
modelFile = "res10_300x300_ssd_iter_140000.caffemodel"
configFile = "deploy.prototxt"
net = cv2.dnn.readNetFromCaffe(configFile, modelFile)

# 이미지 로드
image = cv2.imread('face.jpg')
h, w = image.shape[:2]

# 전처리 및 모델 입력
blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0))
net.setInput(blob)
detections = net.forward()

# 검출된 얼굴 확인
for i in range(detections.shape[2]):
    confidence = detections[0, 0, i, 2]
    if confidence > 0.5:
        box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
        (x, y, x2, y2) = box.astype("int")
        cv2.rectangle(image, (x, y), (x2, y2), (255, 0, 0), 2)

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

DNN 기반 얼굴 검출은 Haar Cascade보다 더욱 정밀하고 정확한 결과를 제공합니다.

4. 얼굴 인식(Face Recognition)

얼굴 인식에서는 검출된 얼굴을 특정 인물과 매칭하는 작업이 필요합니다. OpenCV에서는 Dlib 라이브러리의 Face Recognition 모델을 활용하여 얼굴을 비교할 수 있습니다.

4.1 Dlib을 이용한 얼굴 인식

Dlib의 face_recognition 라이브러리를 사용하면 얼굴 인식을 간편하게 구현할 수 있습니다.

import face_recognition
import cv2
import numpy as np

# 등록된 얼굴 이미지 로드 및 인코딩
known_image = face_recognition.load_image_file("known_face.jpg")
known_encoding = face_recognition.face_encodings(known_image)[0]

# 테스트할 이미지 로드
unknown_image = face_recognition.load_image_file("unknown_face.jpg")
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]

# 얼굴 비교
results = face_recognition.compare_faces([known_encoding], unknown_encoding)
print("얼굴이 일치합니까?", results[0])

위 코드에서는 face_recognition 라이브러리를 활용하여 얼굴을 벡터로 변환하고, 벡터 간 유사도를 계산하여 얼굴을 비교합니다.

5. 실시간 웹캠 얼굴 인식

웹캠을 활용하여 실시간으로 얼굴을 인식하는 기능도 구현할 수 있습니다.

import face_recognition
import cv2

video_capture = cv2.VideoCapture(0)

# 등록된 얼굴 데이터 로드
known_image = face_recognition.load_image_file("known_face.jpg")
known_encoding = face_recognition.face_encodings(known_image)[0]

while True:
    ret, frame = video_capture.read()
    rgb_frame = frame[:, :, ::-1]
    face_locations = face_recognition.face_locations(rgb_frame)
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        matches = face_recognition.compare_faces([known_encoding], face_encoding)
        name = "Unknown"
        if True in matches:
            name = "Known Face"
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
        cv2.putText(frame, name, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    cv2.imshow("Video", frame)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

video_capture.release()
cv2.destroyAllWindows()

6. 결론

이 포스팅에서는 OpenCV와 딥러닝을 활용하여 얼굴을 검출하고 인식하는 방법을 소개했습니다. OpenCV의 dnn 모듈과 face_recognition 라이브러리를 활용하면 간단하게 얼굴 인식 시스템을 구축할 수 있습니다. 실전에서는 딥러닝 모델을 활용하여 더욱 정교한 얼굴 인식 시스템을 만들 수도 있습니다.

728x90