얼굴 특징 벡터화
검출된 얼굴 특징들을 수치화하여 고유한 벡터로 변환함. 이 벡터는 해당 얼굴의 고유한 "지문"과 같은 역할을 함. 이게 임베딩이라고 할 수 있음
얼굴 인식 과정
데이터베이스 구축 : 많은 사람들의 얼굴 이미지를 수집하고, 각 얼굴의 특징 벡터를 추출하여 데이터베이스에 저장
입력 얼굴 처리 : 새로운 얼굴 이미지가 입력되면, 동일한 과정을 거쳐 해당 얼굴의 특징 벡터를 생성
비교 및 매칭 : 입력된 얼굴의 특징 벡터를 데이터베이스에 저장된 벡터들과 비교 - 유사도 측정
딥러닝과 유사도 비교의 관계
- 특징 추출: 딥러닝 모델은 얼굴의 복잡한 특징을 자동으로 학습하고 추출
- 임베딩 생성: 추출된 특징을 바탕으로 고차원의 벡터(임베딩)를 생성
- 유사도 비교: 생성된 임베딩 간의 유사도를 계산하여 얼굴을 매칭
실제 구현 예시
class FaceRecognitionModel(nn.Module):
def __init__(self):
super().__init__()
self.cnn = nn.Sequential(
# CNN 레이어들...
)
self.fc = nn.Linear(512, 128) # 128차원 임베딩
def forward(self, x):
x = self.cnn(x)
x = self.fc(x)
# 트리플렛 손실 함수
def triplet_loss(anchor, positive, negative, margin=0.2):
distance_positive = (anchor - positive).pow(2).sum(1)
distance_negative = (anchor - negative).pow(2).sum(1)
losses = F.relu(distance_positive - distance_negative + margin)
return losses.mean()
결국 cnn으로 임베딩만 하게 되고, 판단은 임베딩과 유사도만 측정하는 것임.
- CNN의 역할: 특징 추출 및 임베딩 생성
- CNN은 얼굴 이미지로부터 고차원의 특징을 추출하고, 이를 압축된 형태의 임베딩 벡터로 변환
- 이 과정에서 CNN은 얼굴의 중요한 특징들을 효과적으로 포착하도록 학습
- 판단 과정: 임베딩 간 유사도 측정
- 실제 인식 과정에서는 생성된 임베딩 벡터들 간의 유사도를 계산
- 주로 사용되는 유사도 측정 방법:
- 코사인 유사도
- 유클리디안 거리
- L2 노름
* 직접적인 분류 학습 대신, 임베딩 공간에서의 거리를 최적화하는 방식으로 학습
* 트리플렛 손실이나 대조 손실 등을 사용하여 같은 사람의 얼굴은 가깝게, 다른 사람의 얼굴은 멀게 위치
얼굴 인식을 위한 임베딩 과정에 대해 몇 가지 중요한 힌트는!
- CNN 모델 사용:
- 일반적으로 깊은 CNN 구조(예: ResNet, Inception)를 사용하여 얼굴 이미지의 특징을 추출함
- 임베딩 차원:
- 보통 128차원에서 512차원 사이의 벡터로 얼굴을 표현함
- 학습 방법:
- 트리플렛 손실(Triplet Loss) 또는 대조 손실(Contrastive Loss)을 사용하여 같은 사람의 얼굴은 가깝게, 다른 사람의 얼굴은 멀게 위치 시킴
- 데이터 증강:
- 회전, 크기 조정, 밝기 조절 등을 통해 다양한 변형을 학습
- L2 정규화:
- 최종 임베딩 벡터를 L2 정규화하여 유클리디안 거리 계산을 용이함
- 미세 조정:
- 대규모 얼굴 데이터셋으로 사전 학습된 모델을 사용하고, 특정 도메인에 맞게 미세 조정
이러한 방식으로 CNN은 얼굴 이미지를 고정 길이의 벡터로 변환하며, 이 벡터는 얼굴의 고유한 특징을 효과적으로 표현함
트리플렛 손실(Triplet Loss) 또는 대조 손실(Contrastive Loss)을 사용하여 같은 사람의 얼굴은 가깝게, 다른 사람의 얼굴은 멀게 위치하도록 임베딩 한다구?
트리플렛 손실(Triplet Loss)과 대조 손실(Contrastive Loss)은 얼굴 인식을 위한 임베딩 학습에 널리 사용되는 방법임
대조 손실(Contrastive Loss)
대조 손실은 두 샘플 간의 유사성을 학습하는 데 사용됨 .
- 같은 사람의 얼굴 쌍(positive pair)은 임베딩 공간에서 가깝게 위치 시킴
- 다른 사람의 얼굴 쌍(negative pair)은 임베딩 공간에서 멀리 위치 시킴
수식:
$L_{contrastive}=y\cdot d^2+(1-y)\cdot \max(margin-d,0)^2$ 여기서:
- $d$: 두 샘플 간의 유클리디안 거리
- $y$: 같은 사람이면 1, 다른 사람이면 0
- $margin$: 다른 사람 얼굴 간 최소 거리
구현:
def contrastive_loss(y_true, y_pred, margin=1.0):
square_pred = K.square(y_pred)
margin_square = K.square(K.maximum(margin - y_pred, 0))
return K.mean(y_true * square_pred + (1 - y_true) * margin_square)
트리플렛 손실(Triplet Loss)
트리플렛 손실은 세 개의 샘플(앵커, 양성, 음성)을 동시에 고려함
- 앵커와 양성 샘플(같은 사람) 간의 거리를 최소화
- 앵커와 음성 샘플(다른 사람) 간의 거리를 최대화
수식:
$L_{triplet}=\max(d(a,p)-d(a,n)+margin,0)$ 여기서:
- $a$: 앵커 샘플
- $p$: 양성 샘플 (앵커와 같은 사람)
- $n$: 음성 샘플 (앵커와 다른 사람)
- $d$: 거리 함수
- $margin$: 최소 거리 차이
구현:
def triplet_loss(y_true, y_pred, alpha=0.2):
anchor, positive, negative = y_pred[:3], y_pred[3:6], y_pred[6:]
pos_dist = K.sum(K.square(anchor - positive), axis=-1)
neg_dist = K.sum(K.square(anchor - negative), axis=-1)
basic_loss = pos_dist - neg_dist + alpha
loss = K.maximum(basic_loss, 0.0)
return K.mean(loss)
학습 과정:
- 데이터 준비:
- 대조 손실: 얼굴 이미지 쌍과 레이블(같은 사람/다른 사람)
- 트리플렛 손실: 앵커, 양성, 음성 이미지 트리플렛
- CNN 모델 구성:
- 일반적으로 ResNet, Inception 등의 아키텍처 사용
- 마지막 층을 제거하고 임베딩 층 추가 (예: 128 또는 256 차원)
- 손실 함수 적용:
- 선택한 손실 함수(대조 또는 트리플렛)를 사용하여 모델 학습
- 학습 최적화:
- 어려운 샘플에 집중: 어려운 네거티브 샘플을 더 자주 사용
- 배치 구성: 다양한 신원의 얼굴을 포함하도록 배치 구성
- 추론:
- 새로운 얼굴 이미지의 임베딩을 생성하고 기존 데이터베이스와 비교
이러한 방법을 통해 CNN은 얼굴의 고유한 특징을 효과적으로 학습하고, 임베딩 공간에서 같은 사람의 얼굴은 가깝게, 다른 사람의 얼굴은 멀게 위치시킬 수 있음
임베딩을 학습시키기 위한 ground truth (label)는 주로 단어의 문맥 정보나 단어 간의 관계를 나타내는 데이터임. 구체적으로:
- Word2Vec의 경우:
- CBOW 모델: 주변 단어들이 입력이고, 중심 단어가 ground truth임
- Skip-gram 모델: 중심 단어가 입력이고, 주변 단어들이 ground truth임
- GloVe의 경우:
- 단어 쌍의 동시 출현 횟수가 ground truth로 사용
- 실제 내적값과 ground truth similarity(동시 출현 횟수의 로그값)의 차이를 최소화하는 방향으로 학습
- 트리플렛 손실을 사용하는 경우:
- 앵커 단어와 양성 예제(유사한 단어), 음성 예제(다른 단어)의 관계가 ground truth
- 대조 손실을 사용하는 경우:
- 두 단어가 유사한지(1) 아닌지(0)를 나타내는 이진 레이블이 ground truth가 됨
이러한 방식들은 단어의 의미적, 문법적 관계를 벡터 공간에 반영하도록 학습시킴. 예를 들어, "왕 - 남자 + 여자 = 여왕"과 같은 관계를 포착할 수 있게 됨 임베딩 학습의 핵심은 단어의 실제 사용 맥락과 관계를 ground truth로 활용하여, 이를 벡터 공간에 효과적으로 매핑하는 것임. 이를 통해 단어 간의 복잡한 의미적, 구문적 관계를 수치적으로 표현할 수 있게 됨.
sumanheun-saram-eolguleul-hags-dlvDbZAZRJaTO.F7rnlFQw?login-source=oneTapThread
댓글