페이지

2022년 4월 27일 수요일

라벨 없는 영상 데이터 들로부터 딥러닝을 통해 유사 이미지 탐색해오기 – 2편

 1편에 이어서 3중 손실을 통한 훈련 시행, 이미지 검색을 위한 특징 추출, 유사 이미지 검색 모듈에 대해서 살펴보겠다


3중 손실함수(triplet loss)

실제 프로젝트에서 딥러닝을 통한 이미지 분류를 처리하고자 할 때, 라벨이 부여된 수천 건의 데이터를 준비하는 문제 혹은 분류되는 이미지 종류(class)가 너무 많은 (안면인식과 같은) 경우에 봉착하는 경우가 많다. 2015년 구글에서 발표한 안면인식 FaceNet  논문 에서 컨볼루션 네트워크에서 안면 이미지와 유사 이미지, 그리고 다른 이미지의 3중 손실로 훈련하는 방법이 발표되면서 훈련에 zero shot learning 과 같은 비지도학습 가능성이 소개되었다.


 아래 그림1과 같이 입력이 되는 이미지인 anchor 이미지 A 가 있고, 유사한 positive 이미지 P, 그리고 다른 negative 이미지 N 이 있다. 결국 목적하고자 하는 학습 목표는 그 아래 식 에 표시된 바와 같이, A P 간의 거리 d(A, P) A N 간의 거리 d(A, N) 보다 작아야 하는 것이다. 여기서 +α는 margin 이다. 결국 훈련을 통해 아래 그림의 왼쪽의 거리가 오른쪽의 거리로, 3중 손실 구조는 이미지 간의 유사도를 예측하도록 학습된다.




<그림 1. Triplet loss 함수>


Loss는 아래 그림2의 ①과 같이 Siamese 네트워크의 출력인 ap_distance an_distance 의 차이로 표시된다. ②와 같이 margin 을 두고 0.0 중에 최대치를 취하게 함으로써 음수 값을 갖지 않도록 한다.



<그림 2. 손실 산출>


3중 손실을 통한 훈련 시행

 3중 손실을 통한 훈련 시행은 아래 그림 3과 같이 옵티마이저는 Adam을 채용하고 learning_rate0.0001, 그리고 epoch40으로 하였을 때, validated loss 가 ①과 같이0.0374로 나타났다.



<그림 3. 훈련 시행>


이미지 검색을 위한 특징 추출

컨볼루션 심층망을 통과하여 feature vector 가 생성된 layer를 임베딩(embedding)이라고 칭한다면 비교하고자 하는 모든 이미지들이 이러한 같은(동일한 파라미터 조건하의) 컨볼루션 망을 통과하면 결국 같은 길이의 임베딩으로 이루어질 것이다. 만약 이러한 임베딩들을 고차원의 벡터 공간에 위치시킨다면 같은 구조를 가진 임베딩끼리는 같은 위치에 모일 것이고 다른 구조를 가진 임베딩끼리는 멀리 떨어지게 된다. 우리는 자연어처리에서 word2vec 묘사들을 PCA를 통해 2차원에 투영했을 때 이러한 묘사를 볼 수 있다.

 이전  1편 그림 7에서 정의한 embedding layer를 참고로 다시 보자.  아래 그림 4의 ①과 같이 layer.trainable 상태를 출력해본다. ② 이전 그림에서 설정한데로 154번째 layer 부터 trainable True 로 변경 되어있음을 확인할 수 있다.



<그림 4. layer.trainable 확인>


아래 그림 5와 같이 훈련된 siamese 모델로부터 특징 추출 모델을 생성한다. 3중 손실을 통한 훈련을 통해 생성된 Siamese 모델의 입력으로 embedding inputoutput embeddig,out 즉 그림 4에서 살펴본 256차원의 output 이다.


<그림 5. feature_model 생성>


Feature vector 추출

 아래 그림 6의 ①과 같이 생성된 모델의 model.predict 150 X 150 크기의 입력 값을 통하여 feature_vector 를 얻고 ②로 그 값을 return 한다.



<그림 6. Feature vector 추출>


   feature vector 추출 함수를 이용하여 비교할 대상인 전체 anchor 이미지들을 대상으로 한 데이터프레임 df 를 작성한다. 데이터프레임은 ‘file’‘features’를 컬럼으로 하며 각 row df[‘features’]feature vector가 담기도록 만든다.


유사도 함수

feature vector 를 가지고 유사도를 측정할 경우, cosine_similarity를 사용하며 공식은 아래 그림 7의 ①과 같다. 즉 두 feature vector (그 중 하나는 transpose)의 벡터 곱을 두 feature vector 정규화 값의 곱으로 나눈 것이다.



<그림 7. 코사인 유사도>


함수로 정의된 코드는 아래 그림 8과 같다.



<그림 8. 유사도 함수>


유사 이미지 검색 모듈

유사 이미지 검색 모듈은 아래 그림 9에서 찾고자 하는 입력 이미지 파일인 file, 유사한 이미지를 전체 anchor 이미지들의 feature vector 가 담긴 데이터프레임 feature_df, 그리고 feature_model model_name 을 매개 변수로 전달하여 ①에서 feature vectorimg_features 로 추출하고, ②에서 getCosineSimilarity함수에 img_features와 비교할 numpy array row[‘features’]를 행방향 원소들로 더해서(axis=1) featu_df[‘similarity’] 컬럼에 저장한다. ③에서 ‘similarity’ 컬럼을 내림차순으로 정렬. ④에서 유사도 순서로 5개의 파일을 출력하는 plotSimilarImages를 호출한다.



<그림 9. 유사 이미지 검색 및 출력>


이때 비교할 test 이미지도 순서대로 정렬하여 test_images_path 밑에 위치시킨 test_images 파일로 준비한다.  이러한 test_imagesanchor 이미지 중에 62.jpg 파일을 선택해서 test_images_path 밑에 위치시키고, 아래 그림 10과 같이 실행시키면 이미지 유사도 순서로 5개의 이미지가 출력된다.

 아래 그림 10의 ①에서 test_images에 여러 파일이 있다면 아래 그림과 같은 6개 이미지 블록이 그 수 만큼 표시된다. ②유사이미지 검색 모듈 호출, ③은 test_image 파일, ④는 기존 anchor 이미지들에도 62.jpg 가 있기 때문에 유사도 1.000 로 동일 파일이 나타난다.



<그림 10. 유사 이미지 출력>


결언

지금까지 1편에 이어서 3중 손실을 통한 훈련 시행, 이미지 검색을 위한 특징 추출, 유사 이미지 검색 모듈에 대해서 살펴보았다. 3중 손실을 통한 훈련에서 validated loss 0.037로 낮은 손실을 보여주었고 유사도 검색의 정확도가 높은 feature vector 간의 cosine 유사도 검색으로 라벨 없는 비지도방식으로 높은 유사도 정확도를 보여주었다.

 

댓글 없음:

댓글 쓰기