페이지

2021년 8월 17일 화요일

소규모 데이터로 딥러닝을 이용한 이미지 분류를 시도할 때 고려할 점 – 2편

 사전 훈련 모델 이용

사전훈련 모델이란 ImageNet 과 같은 대용량 데이터세트의 이미지 분류 작업을 사전에 훈련시켜 놓은 모델을 뜻한다. 누군가가 이미 훈련시킨 가중치를 사용함으로써 소규모 데이터세트로도 좋은 성능을 낼 수 있다. 예를 들어, ImageNet 은 이미지들이 동물들이나 우리가 일상에서 볼 수 있는 자전거, 가구, 자동차 같은 1,000 가지 종류 class 로 구성된 백사십만개의 레이블 된 이미지들을 가지고 있는데, 여기에서 훈련된 모델을 목적을 달리하여, 가구 이미지를 분류하는 데 사용할 수 있다는 뜻이다. 만약 사전 훈련에 사용된 데이터가 상당히 크고 일반적인 이미지들이라면 (반드시 사전 훈련 데이터 규모가 충분히 커야 한다. 거꾸로 사전 훈련 모델의 훈련된 데이터세트가 작고 이를 다른 목적에 사용하는 모델의 데이터세트가 크다면 전이학습은 시도할 의미가 없다), 새로운 목적으로 구축할 모델 데이터 class 가 사전 훈련된 것과 다르다 하더라도 유용하게 이미지 분류 문제를 해결할 수 있다는 뜻이다. 1편에서 설명한 합성곱(convolutional) 신경망의 특징의 하나인, 사전 학습된 모델에서 학습된 패턴의 공간 계층성(spatial hierarchy)이 영상 인식의 일반화된 모델로서 효과적으로 작용한다.

ImageNet이 개와 고양이 등을 포함한 여러 동물 class 들을 포함하고 있는 것을 고려할 때, 개와 고양이 분류 문제에서 잘 동작할 것이라는 기대를 해볼 수 있다.

 

전이학습 절차

사전 학습된 모델을 통한 전이 학습을 고려할 때 아래와 같은 절차를 염두에 두는 것이 필요하다.

1.    사전 훈련 모델 선정: 우선 당면하고 있는 문제에 적당한 사전 훈련 모델을 선별하는 것이 필요하다. Keras 의 경우, VGG, Resnet, Inception, Mobilenet 등의 모델들을 사용할 수 있다. 여기를 눌러 Keras 에서 가능한 모델들을 살펴본다.

2.    데이터세트 크기와 유사도에 따른 전략 수립: 아래 그림1과 같이 데이터세트 크기와 유사도에 따라 4개의 전략이 가능하다. Class 당 약 1000~2000 개 이미지샘플은 소규모 데이터세트 크기에 속한다. 개와 고양이를 분류하는 것이라면 ImageNet 의 데이터세트와 유사한 데이터세트로 볼 수 있다. 만약 현미경 데이터나 암세포 이미지를 분류하는 경우에는 ImageNet 과 유사한 데이터세트로 보기 어렵다[1].

 



<그림 1. 데이터세트 크기와 유사도에 따른 분류>

 

3.    모델 파인 튜닝: 크기와 유사도에 따른 전략에 따라 어느 분면에 해당하는지에 따라, 아래 그림 2와 같은 파인 튜닝 접근법을 택할 수 있다.

대규모 데이터, 사전 훈련 데이터와 다름: 대규모 데이터를 보유하고 있다면, 처음부터 전체를 합성곱 신경망에 훈련할 수 있다. 사전 훈련 모델 데이터세트와 다르지만, 사전 훈련 모델을 활용하는 것이 유용하다.

대규모 데이터, 사전 훈련 데이터와 유사함: 대규모 데이터라 과적합 이슈는 없다. 데이터세트가 유사하므로 사전 훈련된 가중치를 이용하여 합성곱 층의 상층부 일부와 classifier 부분을 훈련시킨다.

소규모 데이터, 사전 훈련 데이터와 다름: 가장 곤란한 경우다. 합성곱의 훈련 층을 늘리면 과적합이 일어나고 훈련 층을 줄이면 학습이 불충분 해진다. 2사분면의 경우보다 합성곱 층의 훈련을 늘리고 데이터증식(Data Augmentation)을 고려해보는 것이 필요하다.

소규모 데이터, 사전 훈련 데이터와 유사함: 사전 학습 모델의 가중치를 그대로 사용하고 (훈련을 freeze 하고) 마지막 완전연결층의 훈련된 classifier를 제거하고 대신 새로운 classifier 로 교체한다.

 



<그림2. 사전 훈련 모델 파인 튜닝 유형>

 

사전 훈련 모델 선정

앞에서 살펴본 바와 같이, 개와 고양이 이미지를 약 2,000개 이미지샘플을 가지고 딥러닝으로 시도하려는 경우는 그림14사분면에 해당한다. Class 당 약 1000~2000 개 이미지샘플은 소규모에 해당하고, 개와 고양이를 분류하는 것이라면 ImageNet의 데이터세트는 유사한 데이터세트로 볼 수 있다.

사전 훈련 모델로는 2014ImageNet 데이터세트를 기반으로 개발된 VGG16 구조를 선정한다. 비교적 오래된 구조지만 모델 크기도 크지 않고 새로운 구조적 발전에 대한 설명 없이도 단순해서 이해가 용이하다. 이러한 이유에서 ResNet, Inception, Xception 등이 있지만 교육용으로 많이 소개된다. 아래 그림3과 같이, VGG165개의 합성곱(Conv) 신경망과 5개의 max pooling 그리고 3개의 fully connected layer 로 이루어져 있고 모든 활성화함수는 ReLU 를 사용한다.

 



<그림 3. VGG16 구조>[2]

모델 파인 튜닝

  개와 고양이를 분류하는 우리의 경우는, 소규모 데이터에 사전학습 데이터세트와 유사한 유형인 4분면의 파인 튜닝으로 이 경우, 사전 학습 모델의 가중치를 그대로 사용하고 (훈련을 freeze 하고) 마지막 완전연결층의 훈련된 classifier를 제거하고 대신 새로운 classifier 로 교체한다.

이미지분류에 사용되는 합성곱 신경망(convnet)은 위의 그림3과 같이 일련의 pooling convolution 층으로 이루어지고 마지막으로 완전 연결된 분류기 층으로 구성된다. 아래 그림 4와 같이, 사전에 잘 훈련되어 가중치가 보존된 convolutional base 는 그대로 두고 여기에 연결 되어있는 기존 분류기 fc6, fc7, fc8 층은 사용하지 않는다. 대신 ① 과 같이 새로운 분류기로 대체한다. 이렇게 하는 이유는, convolutional base 에서 학습된 표현(representation)이 보다 일반적이고(generic) 따라서 재사용이 가능해서이다. 이렇게 학습된 표현을 특징 추출(feature extraction)이라고 한다. 반면 마지막 층의 분류자들 (classifiers)로부터 학습된 표현은 모델이 훈련된 해당 class에 대해서만 특별히 구체적이다. 전체 이미지들의 각각의 class들에 대한 존재여부의 확률분포 정보 만을 가지고 있어 입력 이미지의 물체가 어디에 위치하는가에 대한 정보가 없다.    



<그림 4. 합성곱 기반 위의 분류기 교체>

 

  합성곱(conv)층 들로부터 추출된 표현의 일반화 정도는 모델의 층(layer)의 깊이와 관계가 있다. 합성곱 층의 모델 초반에는 모서리, 색상, 질감과 같은 매우 일반적인 특성맵을 추출하고, 층이 위로 올라갈수록 고양이 귀 혹은 개의 눈과 같은 보다 요약된 개념을 추출한다. 따라서 현재 시도하려는 소규모 이미지 데이터세트가 사전 학습된 데이터세트와 class 가 많이 다르다면 특성 추출을 위해 사전 학습 모델의 처음 몇 개 층만 훈련을 시키는 것이 좋다.

우리의 개와 고양이 분류의 경우로 돌아와서, ImageNet이 여러 개의 개와 고양이 데이터세트들을 포함하고 있어서, 사전 훈련된 모델의 완전 연결층을 재사용해도 된다. 그러나 보다 일반적인 경우가 사전 훈련된 모델의 데이터세트가 소규모 데이터세트로 분류를 시도하려는 class와 다른 경우라고 보고, 이 경우를 중심으로 살펴보도록 한다.

 

사전 학습 모델을 통한 특성 추출

선정한 VGG16 사전 훈련 모델은 다른 모델들과 함께 Keras 라이브러리에 사전 패키지된 형태[3]로 제공된다. keras.application import 하여 사용한다. 우선 아래 그림5와 같이 VGG16 사전훈련 모델 호출 예시를 보자.



<그림 5. VGG16 사전 훈련 모델 convolutional base 정의>

 

우선 첫번쨰 argument weights 는 어느 모델로부터 weight checkpoint 할 것인가를 명시하므로 imagenet 이라고 적고, include_top 은 사전 훈련모델(VGG16)top fully connected layer 가 있는 분류기 층을 포함할까를 묻는 것임. True 를 하면(default) ImageNet1,000class 를 그대로 사용하는 것이 되기 때문에, 우리는 우리의 소규모 데이터세트 class 를 위한 새로운 classifier 를 쓸 예정이므로 False 로 입력. input_shape 는 심층네트워크에 입력할 이미지 텐서의 모양. 이 내용은 선택적이다(optional). 만약 입력하지 않으면, 네트워크가 알아서 임의의 크기로 처리한다. 우리는 우리가 입력한 이미지가 어떻게 convolution pooling layer 를 통하면서 요약되는지를 관찰하기위해 180x180 즉 가로 180 픽셀, 세로 180 픽셀 그리고 RGB 3 채널 값으로 입력한다.

conv_base VGG16으로 훈련된 모델의 convolutional base 만의 가중치를 활용하는 것으로서 2 가지 접근법으로 사용될 수 있다.

첫째, conv_base output 을 디스크에 Numpy 배열로 저장하여 별도의 완전연결층의 분류자에 입력으로 사용하는 방식이다. 이 방식은 모든 형태의 입력 이미지에 대해 가장 값비싼 convolutional base 만을 사용하는 방식이라는 점에서 빠르고 저렴한 방식이다. 그러나 데이터증식을 고려할 수 없다는 점이 단점이다.

둘째, 앞의 그림4와 같이, conv_base 에 더해서 상층부에 새로운 데이터를 위한 완전연결층의 분류자를 교체하고 사전 학습된 convolutional base 의 가중치는 훈련되지 않도록 동결하는 방식이다. 이렇게 동결하지 않으면, 어렵사리 사전 훈련된 가중치가 같이 훈련된다. 상층부에 교체한 완전연결층의 분류자는 임의값으로 초기화되기 때문에 매우 큰 가중치 변경이 네트워크를 통해 전파되고 사전에 힘들게 훈련되었던 표현들이 파괴되는 우를 범하게 된다.  

  이렇게 사전훈련학습을 통한 특성 추출과 데이터증식을 함께 사용한 경우의validated accuracy는 아래 그림6과 같이 95.6% 임을 확인. 1편에서 데이터증식과 dropout 을 통해 80~85% 의 정확도를 보이는 것에 비해 많은 향상을 이뤘다.



<그림 6. VGG16 conv base 에 새 분류자 추가한 경우의 val_accuracy>

 

Convolutional 층의 파인 튜닝

  또다른 파인 튜닝 방법은 합성곱 층 상층부 일부와 새롭게 교체하는 classifier 를 훈련시키는 것이다. 아래 그림 8과 같이 VGG16 4번째 합성곱 신경망 구역까지 trainable = False 로 하여 훈련을 freeze 시키고 ①번의 5번째 합성곱 구역을 trainable = True 로 훈련에 참여시키고 ②번의 완전연결층의 분류자 구역도 함께 훈련하는 것이다.

신경망을 파인 튜닝하는 절차는 다시 정리하면 아래와 같다.

1.    사전 훈련된 모델 상단에 새로운 분류자 추가

2.    합성곱 base 는 동결

3.    새로 추가한 부분을 포함해서 훈련 시행

4.    합성곱 기반의 일부 층을 훈련에 참여 (만약 batch normalization 층이 있으면 제외)

5.    훈련을 허용한 일부 합성곱 층과 함께 새로 추가한 부분을 같이 훈련 시행

지금까지 앞의 3단계까지 완료된 상태. 4단계인 일부 층을 훈련에 참여시키기 위해 5번째 합성곱 구역을 훈련에 참여시킨다 (trainable = True). 앞에서 설명한 바와 같이, 합성곱 신경망 기반 중 초기 층은 보다 일반적이고 재사용이 가능한 특성을 가지는 반면 상층부는 보다 구체적 특성을 인코딩하기에, 새로운 데이터세트를 통해 보다 구체적인 특성을 다루는 부분을 파인 튜닝하는 것이 유용하다 또 다른 고려사항은, 소규모 데이터 기반에서 더 많은 합성곱 구역을 훈련할수록 파라미터가 증가하여 과적합(overfitting)이 일어날 위험이 증가한다.



<그림 8. VGG16 Convolution base의 파인튜닝>

 

이 경우, 옵티마이저를 사용할 때 매우 낮은 학습률로 설정해 줘야한다.  이렇게 하는 이유는 파인 튜닝하는 합성곱 상단의 3개 층의 표현의 변동 폭을 제한하기 위함이다. 합성곱 층의 파인튜닝을 한 결과, 아래 그림 9와 같이 validation accuracy 96~97% 범위를 나타낸다.



<그림 9. 훈련 및 검증 정확도 및 손실>

 

결언

  2,000 개의 개와 고양이 이미지샘플을 가지고 딥러닝 이미지 분류를 수행할 경우의 고려할 점을 살펴보기 위해 1편에서 처음부터 Keras 라이브러리를 사용하여 모델을 작성해보았고75% 수준의 validation 정확도를 보였다. 데이터증식으로 85% 수준까지, 그리고 2편에서 데이터증식과 특성 추출을 통하여 95.6%, 그리고 합성곱 층 일부 파인 튜닝 과 데이터증식을 통하여 97% validation 정확도 성능을 확인하였다.



[1] https://cs231n.github.io/transfer-learning/

[2] https://bit.ly/3hlerMJ

소규모 데이터로 딥러닝을 이용한 이미지 분류를 시도할 때 고려할 점 – 1편

 딥러닝 이미지 분류에서의 데이터 부족 문제

이미지 분류를 딥러닝을 이용해 시도하려 는데 데이터가 부족하면 제 성능을 발휘할 수 없다고 알고있다. 머신러닝과 달리 딥러닝은 이미지의 특성을 자동으로 추출하여서 데이터가 많을수록 모델이 커질(깊어질)수록 성능이 증가한다. 특별히 영상과 같이 매우 고차원의 입력 샘플들이 사용되는 경우에는 더욱이 많은 데이터를 통한 특성 자동추출이 필요하다. 하지만, 주위에 훈련하려는 관련 이미지가 수 만장 혹은 수 십 만장 준비되어 시작하는 경우는 쉽지 않은 것이 현실이다.

컴퓨터비전에서 딥러닝은 본질적으로 대상의 적용에 있어 다목적인 적용이 가능하다. 컴퓨터비전에서 놀라운 성능을 발휘하는 합성곱(convolutional) 신경망은 첫째, 이미지의 어느 한 부분에서 학습된 패턴을 이미지의 어디에서나 동일하게 인지하는 번역 불변(translation invariant) 특징 덕분에 적은 훈련 샘플로도 효율적인 인지 능력을 보여준다.  둘째, 합성곱 신경망은 첫번째 층에서 모서리와 같은 작은 지역 패턴을 학습하고, 두번째 층에서는 첫번째 패턴 들로부터 만들어진 보다 큰 패턴을 학습하는 것과 같은, 패턴의 공간 계층성(spatial hierarchies)을 학습하기 때문에, 완전연결층의 경우에는 전체 이미지로부터 특정 패턴을 인식하는 반면, 합성곱 신경망은 소규모 필터가 합성곱을 수행하는 국지적 지역의 학습을 통하여 완전연결층에 비해 훨씬 적은 파라미터로 이미지 분류가 수행되어 효율적이다.

 

소규모 데이터로 딥러닝을 시도할 때 고려할 점

수십개의 이미지 데이터 샘플로 복잡한 합성곱 신경망 훈련을 시도하는 것은 불가능할 것이지만, 만약 작업이 간단하고 모델이 작으며 일반화가 잘 되었다면 수백장의 이미지 데이터로도 가능할 수 있다. 예를 들어, 2,000 장 정도의 개와 고양이 사진 데이터들을 가지고 합성곱 신경망 훈련을 맨 처음부터 일반화(regularization)없이 시도한다고 하면, 70% 정도의 분류 정확도를 보여준다. 이 경우, 일반화 고려가 없었기 때문에 과적합(overfitting)이 발생한다. 데이터증식(data augmentation)을 통하여 정확도를 80-85% 정도까지 끌어 올릴 수 있다. 그 다음에 생각할 수 있는 방법이 대용량의 데이터를 기반으로 이미지분류에 사전 학습된 모델을 활용하는 전이학습(transfer learning)이다. 여기에는 사전 학습된 모델의 특징 추출(feature extraction)을 사용하는 방법과, 여기에 더해서 사전 학습된 모델을 미세 조정(fine-tuning)하는 방법이 있다. 전자의 feature extraction 방법을 통하여 97% 이상의 정확도를 나타낼 수 있고, fine-tuning을 통하여 98% 이상의 정확도를 나타낼 수 있다.

 

전이학습(transfer learning)

딥러닝에서 가장 강력한 아이디어 중에 하나는, 한 작업에 대해 학습을 이미 한 경우에, 그 지식을 다른 종류의 작업에 적용할 수 있는 것이다. 예를 들어, 신경망이 고양이와 같은 사물을 인식하도록 학습되었다면, 이 작업을 x-ray를 분류하는데 적용할 수 있다는 뜻이다. 마치 거인의 어깨위에서 세상을 보듯, 인터넷상에 공개된 대용량 데이터세트를 컴퓨터비전 전문가들이 그들의 알고리즘들을 통해 사전 훈련시켜 놓은 ImageNet, MS-COCO, Pascal 등과 같은 사전훈련 모델들을 다운로드 받아 사용할 수 있다고 생각해보자. 예를 들어, 2015 ImageNet 대회 ILSVRC에서 선보인 Resnet[1]의 경우 신경망의 층이 152개 층으로 이루어져 있다. ImageNet 대회는 약 1,000 개 카테고리(, 자전거 등의)의 이미지 140만개로 구성된 데이터 들로부터 이미지 분류 성능을 겨루는 대회이고 2015Resnet의 경우 정확도가 96.4%를 자랑한다. Resnet50 은 신경망 층이 50층으로 전이학습에 많이 사용되는 사전학습 모델이다. 이러한 사전학습 모델은 통상 훈련에 몇 주가 걸리기도 하며 수많은 GPU를 사용한다. 자 그럼, 개와 고양이 이미지 분류의 경우를 예로 들어 이러한 사전훈련 모델을 어떻게 사용한다는 것인지 살펴보자.

 

2,000 장의 개와 고양이 이미지샘플로 시작하는 이미지 분류

 우선 2013Kaggle 컴퓨터비전 대회에서 사용된 Dogs vs. Cats[2] 데이터세트로부터 다운로드 받은 25,000개의 개와 고양이 사진을 다운로드 받는다. 이중 train 디렉토리 밑에 cat dog 밑에 해당되는 고양이와 개 이미지를 1,000 개씩 할당한다. valid 디렉토리와 test 디렉토리에도 밑에 cat dog 에 각각 500 개씩 이미지를 할당한다.

아래 그림1과 같이 Keras image_dataset_from_directory 를 이용하여 디렉토리에 있는 이미지들을 읽는다. train_dataset 2,000 개 파일이 고양이, 개의 2class 로 구성되어 있음을 알 수 있다. valid_dataset 1,000test_dataset1,000개를 보유함을 확인할 수 있다.

 


<그림 1. Kerasimage_dataset_from_directory를 이용한 image road>

 

baseline모델 구축

 아래 그림 2와 같이 Keras 를 이용하여 ① 텐서플로우의 분산훈련 전략인 tf.distribute.MirroedStrategy() 를 통한 분산훈련 사용 ② 180x180 픽셀의 3 채널(RGB) 이미지를 입력으로 정의 ③픽셀당 보유하고 있는 0~255 까지의 값들을 255로 나누어 줌으로써 0~1 사이의 값들을 가지도록 rescale 해준다. 그리고 이어서 5개의 Conv2D 층과 ’relu’ activation 그리고 MaxPooling2D가 이어지는 층이 180x180 특성맵(feature map)7x7 까지 줄여준다. 반면 특성맵의 깊이는 32에서 256으로 는다. Flatten을 통하여 2차원 특성들을 일차원으로 변환시킨 후, ⑤ 개 혹은 고양이를 분류하는 2분법 적인 분류(binary-classification)이기 때문에 1개의 unit을 갖는 Dense (1개의 unit 0 혹은 1을 담당)sigmoid 활성화함수를 쓴다.

 



<그림2. 개와 고양이를 분류하는 합성곱 신경망 모델>

 

아래 그림3과같이 training validation accuracy 를 보면, trainingepoch가 거듭될수록 99% 의 정확도로 수렴하는 한편, validation accuracy는 최고치 75%에 머무르고 있다. 이것이 정확히 training dataset에 모델이 과적합(overfitting)이 일어나고 있음을 보여준다. Validation loss10 epoch 에서 최저점을 찍은 후 반등하고 반면, training loss 는 훈련이 진행됨에 따라 선형으로 감소가 일어난다.

 



<그림3. Training and validation 정확도, 손실>

 

훈련에 2,000개의 비교적 작은 샘플을 사용하여 과적합이 제일 먼저 관심을 두고 지켜봐야하는 제약이다. 이러한 과적합을 피하는 기술로 dropout[3] 이나 weight dacay[4] 를 쓴다. 또다른 방법으로 데이터규모를 늘려서 과적합을 피하는 기술이다. 데이터증식 기술이다.

 

데이터증식(Data Augmentation)

데이터증식은 기존의 훈련 샘플 들로부터 그럴듯하게 보이는 이미지들을 임의의 몇 가지 변형을 가하여 훈련 데이터를 증식하는 방법을 말한다. 이를 통하여 훈련 기간 동안에 모델이 보다 다양한 데이터에 노출되고 과적합을 방지하는 보다 개선된 일반화에 기여한다.

아래 그림4와 같이, RandomFlip(“horizontal”)은 입력이미지의 50%를 수평으로 뒤집는다. RandomRotation(0.1) 은 입력이미지를 [-36,+36] 범위로 회전시킨다. RandomZoom(0.2)는 입력이미지를 [-20%, +20%] 범위내에서 임의의 비율로 줌인 혹은 줌아웃 한다.

 



<그림 4. 데이터증식 Keras 정의 예>

 

  아래 그림5는 훈련 이미지들 중에 데이터 증식이후의 임의의 9개 이미지를 표시한 것이다. 좌우가 대칭을 이루기도 하고 약간 회전 된 것들도 목격되며 줌 인 되고 줌 아웃 된 것들도 보인다.

 



<그림 5. 데이터 증식된 훈련 이미지 일부 예>

 

 데이터증식은 소규모 데이터샘플로부터 변형을 가했기 때문에 과적합을 완전히 제거하기에는 부족하다. 아래 그림 5와 같이 ① rescaling 전에 data_augmentation 정의를 포함한다. Dense 층 전에 Dropout 을 추가하여 역부족인 과적합방지를 더욱 강화해본다. binary 분류여서 손실은 binary+crossentropy, 옵티마이저는 rmsprop, metrics accuracy 를 지정한다.

 



<그림 6. 데이터증식과 dropout 이 포함된 합성곱 신경망>

  데이터증식과 dropout 을 추가하였으므로 훈련중에 overfitting 이 훨씬 후반부에 일어날 것을 기대하면서 epoch 3배 늘려 100으로하여 훈련을 시킨다. 아래 그림 7과 같이, 데이터증식과 dropout 덕분에 과적합이 훨씬 뒤에 일어났다. 데이터증식과 dropout 이전에는 약 10 epoch에서 과적합이 일어나던 것이 60~70 epoch근방에서 발생했다. Validation accuracy80~85% 범위에서 일관되게 움직인다. 첫번째 시도 치고는 상당한 향상 (75%->85%) 이다.

 


<그림 7. 데이터증식 후의 훈련 및 검증 지표>

 

 지금까지 KaggleDogs vs Cats 데이터세트로부터 4,000 개의 이미지 샘플을 가지고 텐서플로우 Keras 라이브러리를 이용하여 처음부터 일반화없이 baseline 모델을 구축하여 75%validation_accuracy를 확인하였고 데이터증식과 dropout 등을 통해 80~85% 로 향상되는 것을 확인하였다. 소규모 데이터로 딥러닝 이미지분류의 정확도를 향상시키기 위한 다음 단계는, 앞에서 언급한 사전 훈련된 모델을 사용해야만 한다. 다음 2편에서는 이 부분에 대해서 다룰 것이다.



[2] www.kaggle.com/c/dogs-vs-cats/data

[3] https://bit.ly/3x8u5lg

[4] https://bit.ly/2U9tW2s

객체 탐지는 어떻게 작동하는 걸까? – 2편

 지역 제안(Region Proposal)

지난 1편에서 객체 탐지를 위하여 슬라이딩 윈도우 탐지라는 것을 사용한다는 것을 배웠다, 슬라이딩 윈도우 탐지 방식은 이미지 분류에 뛰어난 성능을 자랑하는 합성곱(Convolutional) 신경망을 사용하지만, 슬라이딩하며 움직이는 모든 윈도우에 대해서 합성곱 연산을 시행하기 때문에 연산자원도 많이 들고 당연히 속도가 느리다는 단점을 살펴보았다. 이를 극복하기 위하여 완전 연결층(Fully Connected Layer)를 합성곱으로 변환하여 객체 탐지의 전체 과정을 합성곱 계산을 하도록 변경함으로써 연산비용 측면에서 개선하는 구조를 갖게 하는 방법을 배웠다. 그러나 슬라이딩하며 움직이는 모든 윈도우를 합성곱 신경망 연산으로 수행한다는 그 자체가 엄청난 연산수행을 필요로 한다. 이것을 개선하는 방법은 없을까? 이를 개선하기 위하여 지역 제안이라는 방법을 제안하였다. 논문은 여기.

R-CNN이라는 방법을 제안하는데 이는 Region CNN(합성곱)의 결합을 의미하며 즉, 전체 윈도우를 합성곱 연산을 하는 대신, 물체가 있다고 생각되는 지역만 합성곱 신경망 수행을 하자는 생각이다. 아래 그림 1을 보면, 좌측의 영상 입력을 분할(segmentation) 알고리즘이라는 것을 사용하여 우측과 같은 결과를 얻고, 여기에서 ①,,③과 같이 관심을 가지지 않아도 되는 배경과 같은 윈도우는 건너뛰고 실제로 객체(물체)로 생각되는 지역만 합성곱 신경망 수행을 하자는 것이다.

 



<그림 1. 지역 제안을 위한 분할 알고리즘>

예를 들어, 위 그림1의 분할이 되어 보이는 영역의 약 2000개의 윈도우만 선택하여 지역화 분류를 수행해보자는 생각이다. 이는 모든 슬라이딩 윈도우를 연산하는 것에 비하면 훨씬 작은 숫자이다. 따라서 R-CNN은 지역을 제안하고 그 지역을 분류하여 한 번에 하나씩 물체의 레이블(사람, 휴지통 등과 같은)과 경계상자(bounding box)를 출력한다. 그러나 R-CNN 알고리즘의 약점은 아직도 속도가 꽤 느리다는 점이다.

 

개선된 지역 제안 알고리즘들

Fast R-CNN , R-CNN이 선택된 지역 윈도우의 분류 연산만을 수행하는 것을, 지난 뉴스레터 1편의 완전연결층을 합성곱 층으로 변환하여 연산 비용 측면에서의 개선을 꾀한 것과 유사하게, 슬라이딩 윈도우의 합성곱(convolutional) 연산으로 수행하여 개선을 도모한 것이다. 논문은 여기이 방법은 R-CNN의 성능을 한 단계 더 향상시킨다. Fast R-CNN의 단점은 지역 제안을 위한 클러스터링 단계가 여전히 꽤나 느리다는 점이다. 무슨 뜻 인가하면, 제안된 여러 지역의 경계박스 중에 실제로 객체를 중첩되지 않고 정확하게 감싸는 경계박스를 결정하는데 있어 속도가 느리다는 뜻이다.

Faster R-CNN, 지역 제안 네트워크(Region Proposal Network)이라는 신경망을 통하여 ROI(Region of Interest) 연산의 GPU 활용이 가능해져 Faster R-CNN 보다 더 높은 정확도를 달성했다는 정도로 이해하고 넘어가자.   논문은 여기. 하지만 Faster R-CNN 도 그 이후에 출현한 YOLO 알고리즘에 비해서는 아직 느리다. 지역 제안 기반의 알고리즘들은 먼저 지역을 제안하고 그리고 분류를 수행하는 2 단계를 거친다는 점에서 YOLO(You Look Only Once) 같은 한 번에 모든 것을 처리하는 알고리즘과 대별된다.

 

IOU(Intersection Over Union)

객체탐지에 있어서 경계박스가 정확히 객체 주위를 감싸고 있는지 어떻게 알 수 있을까? 또 다른 말로는, 어떻게 객체 탐지 지역화(localization)의 성능을 평가할 수 있을까? 이러한 경계박스(bounding box)의 유효성 검증에 IOU 함수가 사용된다. 아래 그림 2와 같이 객체를 탐지하는 경계박스 예상치가 얼마나 실측(ground truth) 경계방식과 겹치는 부분의 비율이 되는지를 산출하는 함수가 Intersection Over Union , IOU . 다시 말하면, Intersection over Union 즉 합집합 위의 교집합이라는 말이 의미하듯이 두 경계상자 면적의 합 (합집합)을 분모로 하고 그 위에 분자로 두 경계상자가 겹치는 부분(교집합) 즉 아래 그림 1의 ①로 표시된 면적을 분자로 하여 비율을 표시하는 것이다.

 



<그림 2. Intersection Over Union >

 

  예를 들어, 우선 실측(ground truth) 경계상자를 좌측의 bb1이라고 하고, 우측의 bb2를 예측하는 경계상자 값이라고 가정해보자. 만약 bb1 bb2 가 완벽하게 겹친다면, IOU 값은 1이 될 것이고 일반적으로 IOU 값이 0.5 보다 크거나 같으면 예측하는 경계상자 값이 비교적 정확한 범위로 간주한다. IOU 값이 1에 가까워질수록 예측하는 경계상자가 더 정확하다고 본다. , IOU는 두 경계상자의 겹침의 정도를 평가하는 척도다.

아래 그림 3, 그림2의 경계상자 좌표에 따른 IoU 값 산출 알고리즘이다.



<그림 3. 그림2에 대한 IoU 값 산출 알고리즘>

최대값 이외 억제 (Non-max suppression)

  위에 살펴본 경계상자의 IoU 값을 50%라고 설정했다고 치자. 문제는 IoU 값이 50% 이상이 되는 필요 이상의 경계박스가 표시된다는 것이다. 아래 그림 4와 같이 어떤 물체를 한번이 아니라 여러 번 감지할 수 있다는 것이다. Non-max suppression 은 알고리즘이 각 물체를 한 번씩만 감지하게 보장한다.

 



<그림 4. 필요이상의 경계박스 예>

 

최대값 이외 억제 알고리즘이 먼저 하는 일은 그림 4의 경계박스의 신뢰도 확률이 가장 높은 (이 경우에는 0.9의 빨간색 경계상자)를 먼저 선택하고 나머지 비교적 높은 IoU 를 표시하는 0.7 신뢰도의 보라색 그리고 0.6 신뢰도의 파란색 경계박스를 억제하는 것이다. 이는 지난 뉴스레터에서 목표 레이블 벡터라고 하는 곳의 값 P_C를 통해 최대값을 먼저 선택하여 물체를 찾았다고 경계박스를 강조하고 경계박스를 강조 표시한다. 그리고 나서, 최대값 이외 억제 알고리즘에 의해서 나머지 경계박스들을 검사해서 최대값의 경계박스와 겹치는 정도가 높은 것들(IoU 값이 높은 것들)을 억제한다. 위의 그림 4의 보라색 그리고 파란색 경계박스는 최대값 경계박스인 빨간색 경계박스와 많이 겹치므로 억제 대상이 된다.

 

Anchor Box

이제까지는 훈련세트 사진에 있는 각 물체들은 물체의 중심점에 해당하는 격자에 배정되었다. 아래 그림 5를 보면, 3 X 3 격자의 사진에 자동차와 사람이 겹쳐 있다. 그리고 사람과 자동차의 중심점도 거의 일치해 보인다. 이럴 경우, 만약 한 격자에서 여러 개의 물체를 감지하고 싶으면 어떻게 해야 할까? Anchor Box를 사용하면 된다.

 



<그림 5. Anchor Box>

 

 위의 그림 5와 같이 두개의 Anchor Box 를 통해 서 있는 사람에게는 Anchor Box 1을 그리고 자동차는 Anchor Box 2를 만들어 사용해본다. 격자안에 두 물체가 겹치는 예를 들어, 8번째 격차 같은 경우는, 아래 그림 6과 같이, ①번의 사람에 대한 내용이 들어있는 Anchor Box 1 값을, 이어서 아래에 ②번에 자동차에 대한 값을 넣어 사용한다.

 



<그림 6. Anchor Box 12의 결합>

 

이제 훈련세트 사진에 있는 각 물체들은 물체의 중심점과 가장 높은 IoU 를 갖는 anchor box 가 소속된 격자에 배정된다. 따라서, 위의 그림 5의 왼쪽 사진의 8번째 그리드의 경우에는, (grid cell, anchor box) 정보를 가지고 물체가 목표 레이블로 인코딩 된다.

 

YOLO(You Only Look Once) 알고리즘

 20165월 워싱턴대학의 레드몬은 You Look Only Once 라는 제목의 논문을 선보인다. 논문은 여기. 아래 그림 7과 같이 class는 보행자, 자동차, 오토바이로 3가지 이고, Anchor Box 는 ①과 ② 두개라면 y = 3 x 3 x 2 (anchor box) x 8 (한 개의 anchor box 당 목표 벡터 레이블 차원 수) 로 나타낼 수 있다. 왼쪽 훈련 이미지를 대상으로, 자동차는 anchor box ②에 모양이 좀 더 가깝다고 보고 (자동차는 넓이가 길쭉하니까) 그림 7의 ④번 행렬의 하반부 값 즉 anchor box 2 값을 갖게 된다. 이때 8개 차원중 class 를 나타내는 맨 마지막 3개의 차원은 010 으로 두번째 digit 1로 되어 자동차임을 알 수 있다. 왼쪽 훈련 이미지의 첫번째 격자의 배경은 물체가 없으므로 ③의 값을 취하게 된다.

 



<그림 7. YOLO 훈련>

 

 아래 그림 8과 같이 YOLO 신경망 구조는 24개의 합성곱 층과 2개의 완전 연결층으로 이루어져 있다. 맨 마지막의 output layer 가 우리가 예시에서 살펴본 것과 같은 (이 경우는, 3 grid 인 경우) 3 x 3 x 2 x 8 차원을 가진 벡터를 출력한다.



<그림 8. YOLO 구조>

 

YOLO 신경망에서 예측을 하는 방식

 아래 그림 9와 같이, YOLO 알고리즘으로 구현된 신경망이 예측을 하는 방식은 왼쪽의 입력 이미지에 대하여 3 X 3 의 격자를 설정하여 각 격자에 대해서 훈련을 진행하다가 8번째 격자를 만났을 때, ①과 같은 목표 레이블 벡터를 만들어 8번째 그리드에 anchor box 2의 값이 반영되어 bounding box 값과 물체 class 값을 벡터안에 남기게 된다.



<그림 9. 신경망이 예측을 하는 방식>

 

결언

  지금까지 2회에 걸쳐 객체 탐지가 작동하는 방식에 대해 살펴보았다. 초기 지역화와 분류로부터 슬라이딩 윈도우 방식, 완전 연결층을 합성곱 신경망으로 변환하는 개념, 지역제안과 개선된 지역제안 알고리즘들 그리고 IoU 와 최대값 이외 억제, Anchor Box의 개념 그리고 YOLO 알고리즘으로 객체 탐지와 관련된 기본적인 개념들을 살펴보았다. YOLO 알고리즘은 즉 객체가 있는 격자 셀에서만 훈련을 통해 y 벡터 행렬을 도출함으로써 이전의 모든 격자 셀에서 훈련을 감행했던 방식과 대조되며 효율성과 실시간 탐지의 가능성이 인정되어 이후 꾸준히 새로운 버전이 출시되고 있다