얼굴 인식 : face-recognition

김성빈·2024년 5월 22일
0

Modern Computer Vision

목록 보기
43/117

얼굴비교

얼굴을 파이썬 라이브러리 중 face-recognition을 이용해서 분석하고,

둘의 유사성을 비교해서 두개의 이미지가 같은 인물인가? 하는 물음을 해결한다.

1 트럼, 2바이든을 불러왔다.


1트럼, 1바이든

import face_recognition

known_image = face_recognition.load_image_file("biden.jpg")
unknown_image = face_recognition.load_image_file("trump.jpg")

biden_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]

result = face_recognition.compare_faces([biden_encoding], unknown_encoding)
print(f'Face Match is {result[0]}')

1트럼프와 1바이든을 비교를 했을때, 당연히 False가 출력이 된다.

1바이든, 2바이든

import face_recognition

known_image = face_recognition.load_image_file("biden.jpg")
unknown_image = face_recognition.load_image_file("biden2.jpg")

biden_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]

result = face_recognition.compare_faces([biden_encoding], unknown_encoding)
print(f'Face Match is {result[0]}')

그렇다면 같은 인물을 비교했을땐, 당연히 True 가 출력이 된다.

이미지를 통해 얼굴을 인식

face-recognition 라이브러리를 사용하여 얼굴을 학습하고, 새로운 이미지에 이들의 얼굴을 인식,

1트럼, 1바이든을 학습하고,

그 모델로 2바이든을 보여줬을때 1바이든과 같은 인물인지

인식하는 것을 확인한다.

import face_recognition
import cv2
import numpy as np
from matplotlib import pyplot as plt

# 샘플 이미지를 불러와서 얼굴 인식용 데이터를 생성
trump_image = face_recognition.load_image_file("trump.jpg")
trump_face_encoding = face_recognition.face_encodings(trump_image)[0]

# 두 번째 샘플 이미지를 불러와서 얼굴 인식용 데이터를 생성
biden_image = face_recognition.load_image_file("biden.jpg")
biden_face_encoding = face_recognition.face_encodings(biden_image)[0]

# 인식된 얼굴 인코딩 배열과 해당 이름 배열을 생성
known_face_encodings = [
    trump_face_encoding,
    biden_face_encoding
]
known_face_names = [
    "Donald Trump",
    "Joe Biden"
]

# 몇 가지 변수를 초기화
face_locations = []
face_encodings = []
face_names = []
process_this_frame = True

# 비디오의 단일 프레임을 가져옴
frame = cv2.imread('biden2.jpg')

# 얼굴 인식 처리를 빠르게 하기 위해 비디오 프레임 크기를 1/4로 조정
small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

# 이미지를 BGR 색상에서 RGB 색상으로 변환 (OpenCV는 BGR을 사용, face_recognition은 RGB를 사용)
rgb_small_frame = small_frame[:, :, ::-1]

# 시간 절약을 위해 매 프레임을 처리
if process_this_frame:
    # 현재 비디오 프레임에서 모든 얼굴과 얼굴 인코딩을 찾음
    face_locations = face_recognition.face_locations(rgb_small_frame)
    face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)

    face_names = []
    for face_encoding in face_encodings:
        # 얼굴이 알려진 얼굴과 일치하는지 확인
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
        name = "Unknown"

        # # 알려진 얼굴 인코딩에서 일치하는 얼굴이 있으면 이름을 사용
        # if True in matches:
        #     first_match_index = matches.index(True)
        #     name = known_face_names[first_match_index]

        # 또는 대신, 새로운 얼굴과의 거리가 가장 가까운 알려진 얼굴을 사용
        face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
        best_match_index = np.argmin(face_distances)
        if matches[best_match_index]:
            name = known_face_names[best_match_index]

        face_names.append(name)

# 결과를 표시
for (top, right, bottom, left), name in zip(face_locations, face_names):
    # 1/4 크기로 조정된 프레임에서 얼굴 위치를 다시 원래 크기로 조정
    top *= 4
    right *= 4
    bottom *= 4
    left *= 4

    # 얼굴 주위에 상자 그리기
    cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

    # 얼굴 아래에 이름을 표시할 레이블 그리기
    cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
    font = cv2.FONT_HERSHEY_DUPLEX
    cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

# 결과 이미지를 표시
imshow('Face Recognition', frame)

위 코드에서 맨 처음에 말한 1트럼, 1바이든 인식하는 부분은 아래와 같다.

# 샘플 이미지를 불러와서 얼굴 인식용 데이터를 생성
trump_image = face_recognition.load_image_file("trump.jpg")
trump_face_encoding = face_recognition.face_encodings(trump_image)[0]

# 두 번째 샘플 이미지를 불러와서 얼굴 인식용 데이터를 생성
biden_image = face_recognition.load_image_file("biden.jpg")
biden_face_encoding = face_recognition.face_encodings(biden_image)[0]

# 인식된 얼굴 인코딩 배열과 해당 이름 배열을 생성
known_face_encodings = [
    trump_face_encoding,
    biden_face_encoding
]
known_face_names = [
    "Donald Trump",
    "Joe Biden"
]

위와같이 인식을 해서 2바이든을 보여줬을때 1바이든과 같은 인물인지 인식하는 코드를 실행했을 경우.

face-recognition을 이용해서 학습한것으로, 1바이든 만으로 2바이든이 1바이든과 같다는 것을 확인할 수 있다.

profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글

관련 채용 정보