공부/AIFFEL

Exploration 7 : 나랑 닮은 연예인은 누구?

dong_dong_2 2021. 1. 28. 20:37

1. 임베딩은 무엇일까
    - 고차원 정보를 저차원으로 변환하면서 필요한 정보를 보존하는 것
    - 임베딩 기법을 활용하여 표현할 수 있는 데이터 유형
       1) 텍스트(단어, 문장, 전체 문서), 이미지, 오디오 등과 같은 구조화되지 않은 데이터
       2) 사용자가 시청한 영화 목록 및 사용자 ID와 같이 상호 작용 컨텍스트만 있고 입력 특성이 없는 항목
       3) 그래프 및 네트워크와 같은 복잡한 구조 데이터. ex) 소셜 네트워크 및 생화학 화합물
       4) 텍스트 설명을 사용한 이미지 검색 및 이미지 캡션 작성과 같은 다중 모달 변환
       5) 위치 및 점유와 같은 희소 특성 (이를 밀집 특성으로 변환)
       6) 인구통계, 사회, 금융, 행동 속성이 300개 이상 포함된 고객 레코드와 같은 고차원 항목(이러한 항목을 보다 간결한 표현으로 변환)
2. 얼굴임베딩 만들기 (1) 얼굴인식
    - 이미지 속의 두 얼굴이 얼마나 닮았는지 알아보기 위해 먼저 해결해야 할 문제가 있다.
    - 이미지 속에서 얼굴 영역만을 정확하게 인식해서 추출해 내는 작업이다.
    - Face Recohnition 라이브러리를 이용한다.

       1) github.com/ageitgey/face_recognition/blob/master/README_Korean.md 를 참고

    - import face_recognition, face_recognition.load_image_file, face_recognition.face_locations
3. 얼굴임베딩 만들기 (2) FaceNet
    - 2015년에 구글에서 발표한 것임.
    - 우리가 봐왔던 딥러닝 모델과 크게 다른 것은 없지만 네트워크 뒤에 L2 Normalization을 거쳐 임베딩을 만들어 내고 여기에 Triplet loss를 사용한다.
    - L2 Normalization은 모델 결과물의 L2 Distance를 구한 후에 이것으로 결과물을 나눠주어 Normalizetion을 해주는 과정이다
    - Triplet Loss는 세 개의 데이터 쌍을 이용해 계산하는 손실함수로 네트워크를 학습시킬 수 있다.
4. 얼굴임베딩 사이의 거리측정
    - 얼굴임베딩의 벡터(128차원 벡터)의 거리는 L2 Norm Distance로 계산한다.
    - L2 Norm Distance는 각 차원의 차이를 제곱한 뒤 합한 후 제곱근을 구한 값을 말한다.
    - 2차원 유클리디안 거리를 다차원으로 확장시킨 것으로 이해하면 될 것 같다.
5. 얼굴임베딩 공간의 시각화
    - 이 128차원의 벡터를 우리가 눈으로 볼 수 있도록 시각화를 할 수 없다.
    - 고차원 데이터를 저차원으로 바꾼 임베딩처럼 이런 다차원 벡터를 시각화하기 위해서 차원 축소를 하는 방법들이 있다. 예를 들어 PCA. T-SNE 등
    - PCA(주성분 분석) : 모든 차원의 축에 따른 값의 변화도인 분산을 확인한 뒤 그 중 변화가 가장 큰 주요한 축을 남기는 방법
    - T-SNE : 고차원 상에서 먼 거리를 저차원 상에서도 멀리 배치되도록 차원을 축소하는 방식
6. 가장 닮은꼴 얼굴 찾아보기
    - 이번 노드에서 구현한 함수 정리 (여긴 없지만 실습을 통해 코드로 구현해본 함수)
       1) def get_gropped_face(image_file) : 이미지 파일에서 얼굴 영역을 가져오는 함수
       2) def get_face_embedding(face) : 얼굴영역으로부터 얼굴 임베딩 벡터를 구하는 함수
       3) def get_face_embedding_dict(dir_path) : 디렉토리 안에 있는 모든 이미지의 임베딩 딕셔너리를 구하는 함수
       4) def get_distance(name1, name2) : 두 이미지(사람 이름) 사이의 임베딩 벡터 거리를 구하는 함수
       5) def get_nearest_face(name, top = 5) : name의 임베딩과 다른 이름들의 거리를 측정해서 가까운 거리순으로 정렬해준다.
7. 프로젝트 : 나랑 닮은 연예인을 찾아보자
    - 사진 모으기 : 비교하고 싶은 사진과 비교할 많은 연예인 사진을 모아서 하나의 폴더에 넣는다
    - 얼굴 영역 자르기 : 모은 사진들의 정보를 컴퓨터에 입력하고 얼굴 영역을 찾아서 자른다.
    - 얼굴 영역의 임베딩 추출하기 : 얼굴 영역을 불러오고 임베딩을 한다
    - 모은 연예인들과 비교하기 : 이렇게 추출한 임베딩 벡터들 간의 거리를 비교해보고 닮은 연예인을 찾는다.
    - 사진을 모으는 것만 사람이 할 뿐 나머지는 코드로 구현하여 컴퓨터가 알아서 한다.