[CV 논문 리뷰 스터디 / 1주차 / 공도웅] You Only Look Once: Unified, Real-Time Object Detection
어떤 물체가 어디에 존재하는지(localization) 그리고 해당 물체가 어떤 물체인지 분류(classification)하는 두가지의 작업을 의미
<single object>
Classification : Single object의 종류 (class, label이라고도 함) 가 무엇인지 구분하는 것 (*output : class probability)
Localization : Single object의 위치를 Bounding box로 지정하여 찾는 것 (*output : (x,y,w,h) )
<multiple objects>
Object Detection : Multiple object의 위치를 위치를 Bounding box로 지정하여 찾는 것 (*output : class probabilities + (x,y,w,h) )
Segmentation : Object Detection보다 더 발전된 형태로 Pixel 레벨의 Detection을 수행
기존방식의 문제점과 YOLO가 지닌 장점을 소개한다.
기존 방식 1) DPM (Deformable Parts Models)
Systems like deformable parts models (DPM) use a sliding window approach where the classifier is run at evenly spaced locations over the entire image [10].
DPM과 같은 시스템은 sliding window기법을 사용하기 때문에, 분류기가 object의 location의 탐지할 때, 이미지 전체 공간에 대해서 탐색을 수행해야 하는 비효율성을 지닌다.
기존 방식 2) R-CNN
More recent approaches like R-CNN use region proposal methods to first generate potential bounding boxes in an im- age and then run a classifier on these proposed boxes. After classification, post-processing is used to refine the bound- ing boxes, eliminate duplicate detections, and rescore the boxes based on other objects in the scene [13].
R-CNN의 경우도 마찬가지로, 먼저 region proposal을 사용하여 잠재적 bouding box를 찾아낸 뒤, 해당 box에 대해서 classifier가 연산과정을 거친다. 즉, object의 location을 먼저 찾고, 탐지된 object의 class에 대한 확률을 계산하는 두번의 연산과정을 거치는 비효율성을 지닌다.
한줄 요약)
These complex pipelines are slow and hard to optimize because each individual component must be trained separately.
location, classification 각각이 따로 훈련되어 작동하는 구조는 복잡할 뿐더러, 느리고 최적화되기 어렵다.
YOLO의 장점)
We reframe object detection as a single regression problem, straight from image pixels to bounding box coordinates and class probabilities. Using our system, you only look once (YOLO) at an image to predict what objects are present and where they are.
YOLO는 한번의 연산과정을 통해, object localization과 classification을 해낸다. (you only look once : 우리가 한번 물체를 힐긋 보고서는 어떠한 물체인지, 어디에 위치한지 알 수 있듯이 YOLO는 사람의 능력에 기인해서 지어진 이름)
① First, YOLO is extremely fast. (간단한 처리과정으로 인한 빠른 속도 + 기존 Real-Time Detection 시스템들과 비교해 2배 가량 높은 mAP)
② Second, YOLO reasons globally about the image when making predictions. (모델이 이미지의 전역적인 특징을 잘 이용해서 추론할 수 있습니다. 이미지 전체를 한번에 바라보기 때문에 background error가 낮음)
③ Third, YOLO learns generalizable representations of objects. (다른 도메인에도 적용가능하여 일반화 성능이 높다)
Our network architecture is inspired by the GoogLeNet model for image classification [34]. Our network has 24 convolutional layers followed by 2 fully connected layers. Instead of the inception modules used by GoogLeNet, we simply use 1 × 1 reduction layers followed by 3 × 3 convolutional layers, similar to Lin et al [22].
- 기본적으로 YOLO 모델은 GoogLeNet 기반으로 network가 설계되었다. 기존 구글넷의 경우 20개의 conv layer를 갖고 있지만, 이에 더하여 4개의 conv layer와 2개의 FC layer를 추가한 것이 YOLO v1 모델의 구조이다. GoogLeNet의 경우, inception module이라는 합성곱 신경망들의 집합을 층 사이사이에 갖고 있는데, YOLO에서는 이를 1X1 conv layer로 대체하였다고 한다.
Q) 1 X 1 conv layer 를 쓰는 이유?
Answer ① - # of Parameters decrease : Dimension Reduction
Answer ② - # of Parameters decrease : Prevent Overfitting
Channel의 수를 바꿈으로써, 파라미터의 개수를 줄일 수 있는데, 이때 만약 input tensor의 channel(A)이 conv layer의 channel(B)보다 개수가 많다면 (A>B) dimension reduction effect를 얻을 수 있다. 또한, 파라미터의 개수 자체가 줄어들기 때문에 연산량이 낮아지고 과적합 또한 방지할 수 있다.
직접 파라미터의 개수를 계산해보자.
- conv (5 x 5, 64) layer 만 적용시켰을 때
#param
= (입력 텐서의 size) x (conv layer channel) x (conv filter kernel size) x (입력 텐서의 channel)
= 28 x 28 x 64 x 5 x 5 x 128
= 약 160M (10^6)
- conv (1 x 1, 32) layer 적용 후, conv (5 x 5, 64) layer 적용시켰을 때
#param
= (입력 텐서의 size) x (conv layer channel) x (conv filter kernel size) x (입력 텐서의 channel)
= 28 x 28 x 32 x 1 x 1 x 32 + 28 x 28 x 64 x 5 x 5 x 32
= 약 43.2M (10^6)
약 160M (10^6) -> 약 43.2M (10^6)
parameter의 개수가 약 4분에 1 수준으로 줄어든것을 확인할 수 있다.
Answer ③ - 비선형성 증가
1번의 conv filter를 거친 것을 2번의 conv filter를 거친 것으로 바꾸었을 때, 비선형성을 줄 수 있는데 비선형성이 증가한다는 의미는 복잡한 패턴의 인식에 대한 성능을 높인 것이라고 이해할 수 있다.
다시 YOLO Network의 Architecture로 돌아가보자.
YOLO Network Design- 위쪽 그림의 하늘색 영역으로 표시한 층들은 기존 GoogLeNet 기반 층들로서, imagnet을 활용하여 전이학습을 진행하는 층이다. 노란색 영역으로 표시한 층들은 GoogLeNet에 새롭게 추가된 층들로 object detection의 기능을 수행한다.
- 마지막의 output값이 7 x 7 x 30 텐서가 나온것이 보이는 데, 왜 해당 차원을 가진 텐서가 출력이 된지는 조금 뒤에 알아보도록 하겠다.
Our network uses features from the entire image to predict each bounding box. It also predicts all bounding boxes across all classes for an im- age simultaneously.
Unified Detection이라는 용어 그대로 YOLO는 bounding box regression과 multi-class classification을 동시에 수행한다. 즉, YOLO 모델을 이해하는데 핵심적인 개념이라고 할 수 있다. 개괄적으로 unified detection에 대해서 살펴보자.
① S x S grid cell로 나누기
Our system divides the input image into an S × S grid. If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object.
우선, input으로 들어온 이미지에 대해서 S x S grid로 이미지를 분할한다. YOLO는 7 x 7 grid로 분할하여 학습을 진행했다고 한다.
② Bounding Box Regression
Each grid cell predicts B bounding boxes and confidence scores for those boxes. Pr(Object) ∗ IOU_truth_pred
앞서 Unified Detection의 의미는 bounding box regression과 multi-class classification을 동시에 수행하는 것이라고 언급하였는데, 우선 bounding box regression에 대해 알아보자. 먼저 각 grid cell 하나당 B개의 bounding box를 예측한다. (YOLO에서는 B=2, 즉 grid cell 하나당 2개의 bbox를 그렸다) 아래(왼쪽)의 그림을 보면, 하늘색으로 표시된 grid cell에 대하여 노란색과 초록색 2개의 Bbox가 그려진 것을 확인할 수 있다. 또한, YOLO는 각 Bbox에 대한 confidence score도 산출하게 되는데, 이는 아래(오른쪽)과 같이 나타낼 수 있다.
These confidence scores reflect how confident the model is that the box contains an object and also how accurate it thinks the box is that it predicts.
confidence score의 의미는 모델이 그려낸 bbox에 object가 포함되었을 확률( Pr(Object) )과 실제 gt와 비교하였을 때 얼마나 정확한 box를 그려냈는가의 (IOU_truth_pred) 곱으로 이해할 수 있다.
Each bounding box consists of 5 predictions: x, y, w, h, and confidence.
정리하면, YOLO는 각 셀에서 2개의 bbox를 그려내고 각 bbox에 대해서 5개의 predictions값을 도출해낸다. (x,y) width, height, confidence prediction 이다. x와 y값은 각 grid cell의 경계 위치를 기준으로 각 bbox의 중심점의 좌표이고 width, height는 말 그대로 bbox의 너비와 높이, confidence score는 앞서 알아보았던 값을 의미한다.
Output : box의 중심 x,y 좌표 + box의 높이 h, 너비 w + confidence score
③ multi-class classification
Each grid cell also predicts C conditional class proba- bilities, Pr(Classi |Object). These probabilities are condi- tioned on the grid cell containing an object.
앞단에서는 각 grid cell에 대해 B개의 Bounding Box를 그리고 해당 bbox내에서의 confidence score를 계산하는 방법에 대해 알아보았다. YOLO는 각 grid cell 자체에서도 C conditional class probabilities를 계산한다. bounding box에서는 물체가 있는지 없는지 유무에 대한 확률을 따졌다면, 해당 cell 단위에서는 만약 object가 있다면, 해당 object가 데이터셋에 존재하는 여러 클래스 중 어떤 클래스에 속하는지에 대한 확률 값을 나타낸다. YOLO에서는 20가지 label에 대한 분류 task를 수행하는데, 그렇다면 각 grid cell에는 길이가 20인 multi class probability값이 할당되게 된다. 위 그림에서 보듯이, 가장 높은 확률값을 가지는 라벨 하나에 대응하는 색상이 grid cell에 채워져있다.
Output : Conditional Probability Pr(Classi |Object)
④ YOLO Output tensor의 shape
It divides the image into an S × S grid and for each grid cell predicts B bounding boxes, confidence for those boxes, and C class probabilities. These predictions are encoded as an S × S × (B ∗ 5 + C) tensor.
마지막의 output값이 7 x 7 x 30 텐서가 나온 이유에 대해서 알아보자. 1 x 1 x 30 tensor를 떼어내서 살펴보면 bbox1의 output 값 5개, bbox2의 output 값 5개 그리고 마지막으로 해당 그리드의 class 20개에 대한 확률로 구성되어있는것을 볼 수 있다. 총 7 x 7 grid cell이 존재하므로, 1 x 30 tensor가 7 x 7개 있는 것으로 이해할 수 있기 때문에 YOLO의 마지막 output 값의 shape은 7 x 7 x 30 이 나온다. (class가 20개인 이유는 YOLO가 예측에 사용한 데이터셋인 PASCAL VOC dataset이 20개의 label을 가지고 있었기 때문)
1) Train 환경 setting
①
we add four convolutional layers and two fully connected layers with randomly initialized weights. Detection often requires fine-grained visual infor- mation so we increase the input resolution of the network from 224 × 224 to 448 × 448.
앞서 설명했던 것처럼 4개의 conv layer와 2개의 fc layer를 추가하였고, 이미지의 크기를 448 x 448로 조정하여 입력시켰다고 한다.
②
We normalize the bounding box width and height by the image width and height so that they fall between 0 and 1.
추가적으로 bbox의 높 낮이를 이미지 전체 높낮이 448로 나누어주어 normalize를 했고,
③
We parametrize the bounding box x and y coordinates to be offsets of a particular grid cell loca- tion so they are also bounded between 0 and 1.
x와 y 좌표값 또한, grid cell을 기준으로 normalize를 진행했다고 한다.
④
We use a linear activation function for the final layer and all other layers use the following leaky rectified linear acti- vation
모든 activation function으로는 leaky ReLU를 사용했다고 한다.
2) Loss Function
Loss Function에 대해서 알아보자.
We use sum-squared error because it is easy to op- timize, however it does not perfectly align with our goal of maximizing average precision.
기본적으로 SSE를 사용했다고 한다. 하지만, 중요한 요소에 대해서는 가중치를 주었다고 한다.
①
Also, in every image many grid cells do not contain any object. This pushes the “confidence” scores of those cells towards zero, often overpowering the gradient from cells that do contain objects. This can lead to model instability, causing training to diverge early on. To remedy this, we increase the loss from bounding box coordinate predictions and decrease the loss from confi- dence predictions for boxes that don’t contain objects. We use two parameters, λcoord and λnoobj to accomplish this. We set λ coord = 5 and λ noobj = .5.
②
where 1i denotes if object appears in cell i and 1ij de- notes that the jth bounding box predictor in cell i is “responsible” for that prediction.
③
Sum-squared error also equally weights errors in large boxes and small boxes. Our error metric should reflect that small deviations in large boxes matter less than in small boxes. To partially address this we predict the square root of the bounding box width and height instead of the width and height directly.
Test time에서는 조건부 클래스 확률과 각 바운딩 박스는 confidence score를 곱해주며 이는 다음과 같이 나타낼 수 있다.
Pr(Classi|Object) ∗ Pr(Object) ∗ IOUtruth pred = Pr(Classi) ∗ IOUtruth pred
바운딩 박스마다 sclass-specific confidence scores를 얻을 수 있다. 이 스코어는 해당 바운딩 박스에서 특정 클래스 객체가 나타날 확률과 객체에 맞게 바운딩 박스를 올바르게 예측했는지를 나타낸다.
YOLO makes far fewer background mistakes than Fast R-CNN. By using YOLO to eliminate background detec- tions from Fast R-CNN we get a significant boost in perfor- mance. For every bounding box that R-CNN predicts we check to see if YOLO predicts a similar box. If it does, we give that prediction a boost based on the probability pre- dicted by YOLO and the overlap between the two boxes.
loss function을 잘 세우면 합성곱 신경망층을 내가 원하는 방식으로 가동시킬 수 있다는 점을 알 수 있었던 것 같다.
댓글 영역