> 백엔드 개발 > 파이썬 튜토리얼 > Python과 FaceNet을 사용한 얼굴 인식

Python과 FaceNet을 사용한 얼굴 인식

Patricia Arquette
풀어 주다: 2025-01-13 06:36:42
원래의
219명이 탐색했습니다.

이 가이드에서는 Facenet-pytorch를 사용하는 얼굴 유사성 감지 도구를 보여줍니다. FaceNet 모델의 고품질 얼굴 임베딩을 활용하는 이 도구는 대상 이미지를 여러 후보와 비교하여 가장 가까운 일치 항목을 식별합니다. 구현을 살펴보겠습니다.

필수 도구 및 라이브러리

  1. PyTorch: 딥 러닝 운영의 기반
  2. FaceNet-PyTorch: 얼굴 감지 및 임베딩 생성을 위해 사전 훈련된 모델을 제공합니다.
  3. 베개(PIL): 이미지 조작 작업을 처리합니다.
  4. Matplotlib: 결과 시각화에 사용됩니다.

두 가지 핵심 모델이 사용됩니다.

  • MTCNN: 이미지 내에서 얼굴을 감지합니다.
  • InceptionResnetV1: 얼굴 임베딩을 추출합니다.

초기화

<code class="language-python">import torch
from facenet_pytorch import MTCNN, InceptionResnetV1
from PIL import Image
import requests
from io import BytesIO
import matplotlib.pyplot as plt

# Initialize face detection (MTCNN) and embedding extraction (InceptionResnetV1) modules.
mtcnn = MTCNN(image_size=160, keep_all=True)
resnet = InceptionResnetV1(pretrained='vggface2').eval()</code>
로그인 후 복사

함수 정의

1. 이미지 로딩 및 임베딩 추출:

이 함수는 URL에서 이미지를 검색하고, 얼굴을 감지하고, 임베딩을 계산합니다.

<code class="language-python">def get_embedding_and_face(image_path):
    """Loads an image, detects faces, and returns the embedding and detected face."""
    try:
        response = requests.get(image_path)
        response.raise_for_status()
        content_type = response.headers.get('Content-Type')
        if 'image' not in content_type:
            raise ValueError(f"Invalid image URL: {content_type}")
        image = Image.open(BytesIO(response.content)).convert("RGB")
    except Exception as e:
        print(f"Image loading error from {image_path}: {e}")
        return None, None

    faces, probs = mtcnn(image, return_prob=True)
    if faces is None or len(faces) == 0:
        return None, None

    embedding = resnet(faces[0].unsqueeze(0))
    return embedding, faces[0]</code>
로그인 후 복사

2. 텐서에서 이미지로 변환:

표시할 텐서를 준비합니다.

<code class="language-python">def tensor_to_image(tensor):
    """Converts a normalized tensor to a displayable image array."""
    image = tensor.permute(1, 2, 0).detach().numpy()
    image = (image - image.min()) / (image.max() - image.min())
    image = (image * 255).astype('uint8')
    return image</code>
로그인 후 복사

3. 가장 유사한 얼굴 식별:

대상 이미지의 임베딩과 후보 이미지의 임베딩을 비교합니다.

<code class="language-python">def find_most_similar(target_image_path, candidate_image_paths):
    """Identifies the most similar image to the target from a list of candidates."""
    target_emb, target_face = get_embedding_and_face(target_image_path)
    if target_emb is None:
        raise ValueError("No face detected in the target image.")

    highest_similarity = float('-inf')
    most_similar_face = None
    most_similar_image_path = None

    candidate_faces = []
    similarities = []

    for candidate_image_path in candidate_image_paths:
        candidate_emb, candidate_face = get_embedding_and_face(candidate_image_path)
        if candidate_emb is None:
            similarities.append(None)
            candidate_faces.append(None)
            continue

        similarity = torch.nn.functional.cosine_similarity(target_emb, candidate_emb).item()
        similarities.append(similarity)
        candidate_faces.append(candidate_face)

        if similarity > highest_similarity:
            highest_similarity = similarity
            most_similar_face = candidate_face
            most_similar_image_path = candidate_image_path

    # Visualization
    plt.figure(figsize=(12, 8))

    # Display target image
    plt.subplot(2, len(candidate_image_paths) + 1, 1)
    plt.imshow(tensor_to_image(target_face))
    plt.title("Target Image")
    plt.axis("off")

    # Display most similar image
    if most_similar_face is not None:
        plt.subplot(2, len(candidate_image_paths) + 1, 2)
        plt.imshow(tensor_to_image(most_similar_face))
        plt.title("Most Similar")
        plt.axis("off")

    # Display all candidates with similarity scores
    for idx, (candidate_face, similarity) in enumerate(zip(candidate_faces, similarities)):
        plt.subplot(2, len(candidate_image_paths) + 1, idx + len(candidate_image_paths) + 2)
        if candidate_face is not None:
            plt.imshow(tensor_to_image(candidate_face))
            plt.title(f"Score: {similarity * 100:.2f}%")
        else:
            plt.title("No Face Detected")
        plt.axis("off")

    plt.tight_layout()
    plt.show()

    if most_similar_image_path is None:
        raise ValueError("No faces detected in candidate images.")

    return most_similar_image_path, highest_similarity</code>
로그인 후 복사

사용방법

비교용 이미지 URL:

<code class="language-python">image_url_target = 'https://d1mnxluw9mpf9w.cloudfront.net/media/7588/4x3/1200.jpg'
candidate_image_urls = [
    'https://beyondthesinglestory.wordpress.com/wp-content/uploads/2021/04/elon_musk_royal_society_crop1.jpg',
    'https://cdn.britannica.com/56/199056-050-CCC44482/Jeff-Bezos-2017.jpg',
    'https://cdn.britannica.com/45/188745-050-7B822E21/Richard-Branson-2003.jpg'
]

most_similar_image, similarity_score = find_most_similar(image_url_target, candidate_image_urls)
print(f"Most similar image: {most_similar_image}")
print(f"Similarity score: {similarity_score * 100:.2f}%")</code>
로그인 후 복사

결과

Face Recognition with Python and FaceNet

결론

이 예에서는 Facenet-pytorch의 얼굴 인식 기능을 보여줍니다. 얼굴 감지와 임베딩 생성을 결합하면 신원 확인, 콘텐츠 필터링 등 다양한 애플리케이션을 위한 도구를 만들 수 있습니다.

위 내용은 Python과 FaceNet을 사용한 얼굴 인식의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿