페이지

2022년 4월 27일 수요일

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

 이전 뉴스레터11편에서 안면 인식시스템을 설명하면서 샴(siamese) 신경망 네트워크, 3(Triplet) 손실 함수, 유사도 함수 등을 다룬 바 있다. 본 프로젝트에서는 Kaggle Flowers Recognition 데이터세트에 있는 600 개 꽃들의 라벨 없는 영상데이터들을 3중 손실함수를 이용하여 샴 네트워크상에서 훈련한다. 통상 딥러닝을 통한 영상 분류에 있어서 수백, 수천 이상의 훈련 샘플/이미지와 매우 큰 데이터세트가 필요하다는 인식과는 다르게 수백 건의 라벨 없는 이미지 데이터들로 3중 손실을 통한 훈련을 시행하여 임베딩끼리의 cosine 유사도로 이미지 유사도 검색이 가능한 지 살펴본다.


비지도 유사 이미지 검색 처리 절차

 3중 손실함수를 통한 비지도 유사 이미지 검색 처리 절차는 아래 그림 1과 같다. 프로젝트 환경은 Nvidia A100 GPU 140GB 메모리와 30GB CEPH 타입 디스크를 사용하였고 Tensorflow 2.6.0, Keras 2.6.0, cuda 11.3, 그리고 python3.8 환경에서 개발하였다.


<그림 1. 유사 이미지 검색 처리절차>


데이터 준비

본 프로젝트에 사용된 데이터세트는 이곳 에서 다운로드 받을 수 있다. 데이터세트 240 X 240 픽셀 크기의 데이지, 민들레, 장미, 해바라기, 튤립의 5가지 종류의 총 4242 개의 꽃 이미지를 보유한다. 본 시스템에서는 각 종류당 120 개만 사용하여 데이지 꽃부터 일련번호를 1번부터 부여하여 튤립까지 총 600번까지의 .jpg 파일을 anchor 디렉토리에 위치시키고 시작한다.

아래 섹션에서 설명하는 3중 손실함수로 훈련하기위해서 우선 anchor600개의 이미지들을 위치시키고, positiveanchor 이미지와 쌍을 이루도록 증식 및 변환을 가하여 위치시키고 negative 이미지들은 임의로(random) 생성된 anchor positive 이미지를 더해서 생성한다. 아래 그림 2anchor 이미지 들로부터 positive image 들을 생성하는 함수이다. ①은 이미지의 중앙 50%를 잘라내는 것이고 ②는 2번에 1번꼴로 이미지를 왼쪽에서 오른쪽으로 뒤집는다. ③은 임의 대비(contrast) 요소의 lower_bound=0.2, upper_bound1.8 로 설정. 이러한 이미지 증식방식은 이전 뉴스레터인 대조학습에서 효과적인 방법으로 언급된 방식을 차용하였다.


<그림 2. positive 이미지 생성 함수>


Data pipeline을 준비하기위해 아래 그림 3과 같이 anchor positive 이미지들을 sort 된 순서로 불러와서 서로 match 되도록 한다.

 


 <그림 3. Anchor, positive 준비>

 

 Negative 이미지들은 아래 그림 4와 같이 anchor positive를 임의로 섞은 다음에 이 둘을 ③과 같이 concatenate 하여 생성한다. 이러한 이미지 들로부터 dataset을 생성한다.


<그림 4. Negative 이미지 생성>


  anchor, positive, negative3가지 이미지가 같은 구조의 샴 네트워크에 입력되므로 이 세가지 dataset zip 한 이후에 shuffle 하고 resize dataset으로 변환한다. 그리고 아래 그림 5와 같이 train valid dataset을 분할한다. ①은 train을 전체 80%로 할당하고 valid 는 그 나머지. ②는 batch 크기를 8로 설정했다.


<그림 5. Train, valid dataset 분할>


 아래 그림 6과 같이 train_dataset을 출력해보니 첫번째가 anchor, 두번째가 positive, 세번째로 negative 이미지가 출력된다.



<그림 6. Triplet 데이터 확인>


 ResNet50 기반 임베딩 준비

 아래 그림 7과 같이 ResNet50 모델 weight를 기반으로 customer layer3개의 dense layer를 추가하여 임베딩 layer 를 만든다. ①에 include_top=False로하고 우리가 원하는 customer layer를 추가한다. ②에 256 벡터크기의 dense2 layer output 이 된다. ③에 inputsbase_cnn.input , outputs=output 으로 embedding을 생성한다. ④와 같이 함으로써, ResNet50 layer155번째인 conv5_block1_out부터 trainable=True, 그 이전 층들은 False 로 선언한다. 전이학습을 통한 파인튜닝에 대한 내용은 이전 뉴스레터를 참고.



<그림 7. 임베딩 준비>


Siamese 네트워크 모델 준비

3중 손실의 훈련을 위한 모델을 수립하는 단계를 살펴보자. (siamese) 네트워크에 관해서는, 이전 뉴스레터논문을 참고하기 바란다. 이를 위하여 anchor, positive, negative의 입력을 받는 3embedding 이 포함된 샴(Siamese) 네트워크를 아래 그림 8과 같이 구성한다. ①은 ResNet50 전이학습을 통한 encoder 파트. ②는 커스텀 layer로 추가한 파인튜닝 층. ③은 각각의 embedding layer. ap_distanceanchor positive 사이의 거리를 나타내고, an_distanceanchornegative 사이의 거리를 출력.

이러한 ap_distance an_distancetuple 로 출력하는 DistanceLayer를 사용한다


<그림 8. Siamese 네트워크>

 

 DistanceLayer 클래스안에 아래 그림 9와 같은 ap_distanceap_distance 값을 tuple return 하는 함수를 사용하여 모델에 [anchor_input, positive_input, negative_input]이 입력되고 output ap_distance an_distance 의 거리가 출력되도록 정의함으로써 Siamese_network 을 구성한다. 이 거리들이 이후 loss 산출에 사용된다.



<그림 9. 거리 측정 layer>


  지금까지 비지도 유사 이미지 검색 절차 중 데이터준비, ResNet50 기반 임베딩 준비, Siamese 네트워크 모델 준비등에 대해서 살펴보았다. 다음 2편에서는 3중 손실을 통한 훈련 시행, 이미지 검색을 위한 특징 추출, 유사 이미지 검색 모듈에 대해서 살펴보겠다.



댓글 없음:

댓글 쓰기