안녕하세요! M_AI 입니다.
( 네이버 블로그로 운영하다가 그냥 티스토리로 넘어왔습니다! 그래서 그냥 내용만 복붙해서 올리도록 하겠습니다! )
제 블로그 첫 글인데요, 이전까지 Image Processing이나 Deep Learning 중에서는 간단한 Classification을 통한 prediction과 segmentation 등을 진행하였지만 혼자서 문서로 남겨두고는 온라인으로 올리지 않았습니다.
그러다가 제가 Object detection 프로젝트를 위해 개인적으로 RetinaNet과 이를 Backbone으로 하는 Resnet paper를 읽어보아도, 막상 코딩을 어떻게 해야 할지 너무나도 막막하더라고요.
모델을 Custom 해본 경험도 없고, Object detection의 정확한 작동 원리도, Anchor box는 또 무엇인지, 이 녀석들에 대한 Regression은 또 어떻게 진행하고, label은 또 어떻게 하는지....
정말 하나부터 끝까지 이해가 가질 않았습니다.
그래서 혹여나 저와 같은 분들이 있을까, 제가 논문을 읽고 이해하고 해당 이론이 tensorflow 2.x와 keras로는 어떻게 구현되는지에 대해 처음부터 끝까지(Start-to-End) 설명을 드리도록 하겠습니다.
이 글을 읽으면 좋을 것 같은 사람들!
- 기본적인 분류(classfication) 모델을 Tensorflow 2.x 버전으로 구현할 줄 아는 사람
- Clssification을 넘어서 Object detection을 하길 원하는데 오픈 소스를 봐도 이해가 가질 않는 사람.
- 오픈 소스를 이해하더라도 입맛대로 수정하는 방법을 모르는 사람.
본 게시글의 목적
※ 본 게시글은 딥러닝 모델의 상세한 이론적 설명보다는 모델 구조를 바탕으로 코드 분석하고 이해하는 데에 목적에 있습니다!
※ 상세한 이론을 원하면 다른 곳에서 찾아보시길 바랍니다!
본 게시글의 특징
① Framework : Tensorflow 2.x
② 학습 환경
- OS : Ubuntu
- GPU : RX570 (AMD)
③ Batch size = 1
④ Kaggle의 RSNA Pneumonia Detection Challenge 데이터셋 사용하여 Chest X-ray에서 폐렴 검출 (Pneumonia detection) 목적.
https://www.kaggle.com/c/rsna-pneumonia-detection-challenge
⑤ 게시글에서는 반말
첫 글인 만큼 서론이 매우 길었습니다!
자! 그럼 이제 RetinaNet에 대한 설명 본격적으로 들어가 보도록 하겠습니다!
RetinaNet 개요
RetinaNet = ResNet + Feature Pyramid Net
RetinaNet은 분류의 모델인 ResNet을 backbone으로 하여 Feature Pyramid Network(FPN)가 결합된 대표적인 single-stage object detection 모델 중 하나이다.
기본적으로 detection을 하는 방식으로는 특정 영역에 대해서 객체의 포함 여부를 판별하며, RetinaNet에서는 앵커 박스를 이용한 Region Proposal 방식을 사용한다.
여기서 앵커 박스란, 샘플링된 feature map에 해당하는 입력 영상 좌표 위에 생성한 임의의 박스를 의미하지만 이에 대한 설명은 1장에 다루도록 한다.
계속하여, object detection에서는 특정 영역이 배경인지 객체를 포함하는 영역인지 분류해야 하지만 배경이 객체를 포함하는 영역보다 더 많기 때문에 이를 해결하는 방법이 여기서 간단히 설명할 예정이다.
본 게시글에서는
- 데이터 전처리 방식
- 모델에서의 입력 데이터의 변화 모습
- 최종 feature map과 앵커 박스와의 관계
- loss function
을 중점으로 Keras에서 제공하는 RetinaNet의 예제 코드(https://keras.io/examples/vision/retinanet/)를 분석하고, 어떻게 모델을 커스텀(model custom) 하는지에 대한 설명을 다룬다.
목차는 총 5장으로 구성되며 다음과 같다.
1장 앵커 박스의 개념과 생성 방법
2장 RetinaNet 모델과 작동 원리에 대한 전반적인 설명
3장 데이터셋 준비 방법
4장 Loss function
5장은 모델 학습 세팅과 학습 결과
로 해서 설명하도록 한다.
1. Anchor Box
현대 Object detection에서는 Region Proposal 방식을 사용한다. 이는 객체가 있을 법한 영역을 미리 찾는 방식으로, 기존의 sliding window 방식보다 연산량이 적은 동시에, 효과적으로 객체를 탐지한다.
그렇다면 앵커 박스는 무엇인가.
앵커 박스는 입력 영상에 대해서 객체가 있을 법한 곳에 설정한 박스이며, 특정 영역을 포괄하는 박스에 객체가 있는지 없는지를 네트워크 학습을 통해 판단하게 된다. 입력 영상에 앵커 박스가 생성되는 위치는 샘플링된 feature map으로 인해 결정된다.
예시로 크기가 8x8인 입력 영상으로 설명하면, stride=2인 convolution으로 2번 샘플링이 된다면 4x4 feature map과 2x2 feature map 2가지가 생성된다.
4x4와 2x2 feature map이 입력 영상에 해당하는 좌표에 표기하면 각각 (Figure 1, 2)이다.
앵커 박스는 feature map의 한 부분이 입력 영상에 포괄하는 영역의 정중앙을 기준으로 생성되며, 서로 다른 3개의 넓이와 3개의 종횡비로 구성된 총 9개의 서로 다른 박스가 (Figure 3)과 같이 생성된다. (Figure 3에서 같은 색상의 앵커 박스는 넓이가 같다.)
(Figure 1)를 예로 들어, 4x4 feature map의 한 부분인 1이 입력 영상에서 포괄하는 영역은 (0, 0), (0, 1), (1, 0), (1, 1)이므로, 정중앙인 (0.5, 0.5)를 기준으로 9개의 앵커 박스 생성된다.
조금 더 설명하자면,
(Figure 2)에서 2x2 feature map의 한 부분인 1이 입력 영상에서 포괄하는 영역은 (0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3)이므로, 정중앙인 (1.5, 1.5)를 기준으로 9개의 앵커 박스가 생성된다. (하지만 실제 코드에서 좌푯값은 정수이므로, 이에 대한 처리 방법은 2장에서 앵커 박스 생성 코드 분석할 때 다룰 예정이다.)
이를 비교해보면 더 작은 feature map이 입력 영상에 대해서 더 넓은 영역을 포괄하므로, feature map이 작을수록 크기가 큰 객체를 탐지하는 데에 용이하다는 것을 직관적으로 알 수 있다.
이렇게 일반화하자면 feature map 크기가 작을수록 앵커 박스의 넓이를 크게 설정해야 한다는 점인데, 여기서 앵커 박스의 넓이는 사용자가 임의로 설정할 수 있되, 이는 데이터셋이 가지는 객체의 크기와 입력 영상의 크기를 고려하여 설정해야만 한다.
더 나아가, 생성되는 앵커 박수 수는 (feature map 높이 x 너비)x9만큼 생성된다.
예를 들어, 2x2 feature map에서는 (2x2)x9=36개, 4x4 feature map에서는 (4x4)x9=144개가 각각 생성된다.
RetinaNet에서 생성되는 앵커 박수의 수와 앵커 박스 생성 코드는 2장에서 전체적인 모델을 설명 후에 언급할 예정이다.
요 약
앵커 박스란?
- 피쳐 맵의 한 부분이 입력 영상에 포괄하는 중심점에 만든 임의의 9개 박스
앵커 박스 특징
- 작은 피쳐 맵의 한 부분은 입력 영상에 포괄하는 영역이 넓으므로, 큰 객체를 탐지하는 데 용이
끝
'1. 모델 분석 > Object Detection' 카테고리의 다른 글
[RetinaNet] 5. Training the Model and Result (0) | 2021.05.31 |
---|---|
[RetinaNet] 4. Loss Function (0) | 2021.05.31 |
[RetinaNet] 3. Prepare the Dataset (0) | 2021.05.31 |
[RetinaNet] 2. Explaining overall RetinaNet model and Code analysis (1) | 2021.05.31 |