일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Segmentation
- pytorch
- 논문
- cnn
- 코딩테스트
- Semantic Segmentation
- optimizer
- 옵티마이저
- 인공지능
- Self-supervised
- 논문구현
- 논문 리뷰
- 알고리즘
- Ai
- transformer
- 파이토치
- ViT
- 논문리뷰
- 파이썬
- object detection
- programmers
- Computer Vision
- 프로그래머스
- 딥러닝
- 코드구현
- Python
- 머신러닝
- opencv
- Convolution
- Paper Review
- Today
- Total
Attention please
[논문 리뷰] YOLO: You Only Look Once:Unified, Real-Time Object Detection(2016) 본문
[논문 리뷰] YOLO: You Only Look Once:Unified, Real-Time Object Detection(2016)
Seongmin.C 2023. 7. 17. 00:22이번에 리뷰할 논문은 You Only Look Once: Unified, Real-Time Object Detection 입니다.
https://paperswithcode.com/paper/you-only-look-once-unified-real-time-object
object detection은 image 내에 object의 위치를 예측함과 동시에 해당 object의 class를 분류해야하는 task입니다. 이미 R-CNN과 같은 모델들이 좋은 성능을 보여주었지만 지금까지의 모델들은 위치 탐지와 class 분류를 나누어 진행한다는 점에 있어서 속도가 느리고 최적화가 힘들다는 단점이 존재했습니다.
R-CNN과 같은 전통적인 object detection 모델들은 여러개의 bounding box들을 추출하고 해당 box에 대해 CNN모델을 거치게 하여 진행하였기 때문에 각각의 요소들이 따로 훈련되어야했고 이런 복잡한 방식은 optimize하기 어려웠으며 속도 또한 느렸습니다.
하지만 YOLO 모델의 경우 단일 신경망에서 bounding box와 class 확률을 예측하기 때문에 감지 성능에 대해 end-to-end로 최적화하는 방법을 제안합니다. 이런 YOLO는 기존의 object detection에 대해 제안된 다른 모델에 비해 훨씬 빠른 속도를 보여주었으며 초당 45frame를 처리하는 성능을 보여주었습니다. 추가로 Fast YOLO 모델의 경우 초당 155 frame을 처리하는 어마어마한 속도를 보여주었죠.
또한 YOLO는 이미지 픽셀에서 bounding box와 class 확률까지 한번에 예측하기 때문에 한번만 보고도 이미지의 위치에 대한 정보와 어떤 것인지 예측할 수 있었습니다. 이런 특징때문에 논문의 제목이 You Only Look Once 것이겠죠.
YOLO의 진행방식은 아주 간단합니다.
input image를 448x448 의 size로 resize를 한 후 단일 convolution network를 거치게 됩니다. 그 후에 Non-max suppression 알고리즘을 통해 최종 bounding box가 결정됩니다.
Benefits
localize와 classification이 통합된 YOLO 모델은 전통 object detection 모델에 비해 몇가지 장점을 지닙니다.
- Extremely fast
detection을 regression 문제로 구성하기 때문에 아주 빠른 속도를 보여줍니다. 위에서 언급했듯 45 fps 의 속도를 보여줍니다. 또한 다른 실시간 system에 비해 두배 이상의 mAP 성능을 보여준다고 합니다.
- Reason globally
YOLO는 predict할 때 이미지를 전체적으로 이해합니다. 기존의 detection 기법인 sliding window나 region proposal-based technique와 달리 전체 이미지를 보기 때문에 contextual information과 appearance를 암시적으로 인코딩한다는 장점이 있습니다.
Fast R-CNN의 경우 background patch를 object라고 오인하곤합니다. 이는 넓은 context를 보지 않기 때문이라고 할 수 있겠죠. 실제로 YOLO는 Fast R-CNN에 비해 background error를 2배 이상 줄였다고 말합니다.
- generalization
YOLO는 object의 일반화된 표현을 학습합니다. 본 논문에서는 자연 이미지로 train한 모델을 예술 작품에서 test하였을 때 DPM, R-CNN에 비해 YOLO의 성능이 훨씬 앞선다고 말합니다.
Unified Detection
본 논문은 object detection을 수행하기 위한 여러 요소들을 하나의 single neural network로 합칩니다. 전체 이미지로부터 추출한 feature들을 사용하여 각각의 bounding box를 예측하죠.
위 figure는 YOLO의 전체적인 process를 보여줍니다.
우선 input image에 대해 SxS grid로 분할합니다. 이렇게 분할된 각각의 grid cell들은 B개의 bounding box와 confidnece socre를 구합니다.
이 confidence socre는 해당 box가 얼마나 object를 포함하고 해당 box가 얼마나 정확한지를 반영합니다.
본 논문은 confidence를 위 식과 같이 정의합니다. $ Pr(Object) $는 특정 bounding box안에 object가 있을 확률에 대한 예측값이며, $ IOU^{truth}_{pred} $는 predicted box와 ground truth의 IoU값 입니다.
만약 cell안에 object가 존재하지 않는다면 $ Pr(Object) $값은 0이 될테니 confidence score 값 역시 0 이 될겁니다. 만약 모델이 해당 bounding box 내에 객체가 존재할 확률이 1이라면 confidence score = IoU 가 되는 가장 이상적인 형태가 될겁니다.
각각의 bounding box는 5개의 예측값을 가집니다.
- x, y : bouding box의 중심 좌표
- w, h : 전체 이미지의 상대적인 bounding box의 width, height 길이 (0 ~ 1 값을 지님)
- confidence : 위에서 다룬 confidence score와 동일
각각의 grid cell들은 C 개의 conditional class probability 를 예측합니다.
당연하게도 이 값은 grid cell이 특정 object를 지닌다는 조건을 가집니다. 또한 각 grid cell 마다 하나의 class probabilities를 지닙니다. 위에서 언급했듯이 grid cell은 B 개의 bounding box를 지닌다고 하였지만 이에 상관없이 하나의 grid cell은 하나의 class probabilities를 가진다는 것을 의미합니다.
Test 시에는 conditional class probabilities 값과 각각의 box confidence prediction 값을 곱하여 class-specific confidence 를 계산합니다.
Pr(Object)가 같이 곱해지기 때문에 bounding box 내에 object가 포함되지 않다면 해당 box의 class-specific confidence score 값은 0 이 됩니다.
그럼 다시 위에서 보여주었던 figure를 보면서 정리해봅시다
input image가 들어오면 위와 같이 S x S 크기의 grid로 이미지를 나누어줍니다.
다음으로는 각 grid cell에 대해 B개의 bounding box를 예측합니다. 해당 bounding box에는 box의 중심 좌표, width, height, confidence score에 대한 정보를 담게 되죠.
또한 각 grid cell에 대해 conditional class probabilites 값을 가지게 됩니다.
최종적으로 각 bounding box에 대해 box가 있는 grid cell의 conditional class probabilities 값과 해당 box의 confidence 값을 곱하여 각 box에 대한 class-specific confidence score를 계산할 수 있습니다.
이 score값은 box내의 class에 대한 확률값과 object에 대해 얼마나 잘 fit 된 predicted box를 생성했는지에 대한 정보를 담게 됩니다. 이런 score값을 기준으로 Non-Maximum Suppression (NMS) 를 진행하여 최종 bounding box를 예측하게 됩니다.
최종적으로 모델의 output은 S x S x (B*5 + C) tensor를 출력합니다.
- S x S : grid cell의 크기
- B : bounding box의 개수
- 5 : bounding box의 요소 (x, y, w, h, confidence)
- C : 클래스 개수
참고로 본 논문에서는 S = 7, B = 2 로 설정하였다고 합니다. 또한 train을 하기 위해 PASCAL VOC 데이터셋을 사용하였기 때문에 C = 20 으로 설정됩니다. 최종 output은 7 x 7 x 30 tensor가 되겠죠. (7 x 7 x (2 x 5 + 20) = 7 x 7 x 30)
Network Design
YOLO는 CNN 기반 모델입니다.
network의 초반에는 24개의 convolution layer로 구성되어 있으며 이를 통해 input image의 feature를 추출합니다. 그 후에는 2개의 fully-connected layer를 사용하여 class에 대한 확률값과 bounding box의 coordinates를 예측합니다.
해당 network는 GoogLeNet에서 영감을 받았다고 말합니다. 물론 해당 network의 inception module을 사용하는 것은 아니지만 1x1 convolution 과 3x3 convolution을 결합하여 사용합니다.
최종적으로는 fc-layer를 통해 7x7x30 의 tensor가 출력됩니다.
Training
detection에 대해 학습하기 전 ImageNet 데이터셋을 사용하여 convolutional layer를 pretrain합니다. 우선 20개의 convolutional layer와 average-pooling layer, fully connected layer로 구성된 network를 pretrain 한 후 detection을 수행할 수 있도록 model을 변환합니다.
detection을 수행할 수 있도록 변환하는 과정에서 4개의 convolutional layer와 2개의 fully connected layer를 random한 가중치로 초기화하여 추가합니다. 추가로 detection은 미세한 시각 정보가 필요하기 때문에 input image의 resolution을 224x224 에서 448x448 로 증가시킵니다.
이렇게 구성한 마지막 layer는 class probabilities 값과 bounding box의 coordinates 값을 예측합니다. 물론 network의 출력값 중 coordinates 역시 input image의 width, height 값이 1이 되도록 normalize 합니다. (좌표값은 0 ~ 1 값으로 출력)
또한 마지막 layer에서는 linear activation function을 사용하였으며, 마지막 층 외에 나머지 layer에서는 leaky rectified linear activation function을 사용합니다.
아무래도 마지막 layer의 출력값은 bounding box의 좌표와 크기를 구해야하기 때문에 activation function을 선형함수로 사용한 것 같습니다. 또한 나머지 layer에 대해서는 leaky ReLU 함수를 activation function으로 사용하였는데 이는 ReLU function의 Dying ReLU 문제를 보완하고자 사용한 것 같습니다. detection의 경우 미세한 시각정보를 필요로 하기 때문에 특정 뉴런의 gradient값이 0으로 수렴하는 문제를 해결하고자 leaky ReLU를 사용한게 아닌가 싶네요.
다음으로 YOLO는 쉬운 최적화를 위해 sum-squared error를 사용합니다. 하지만 SSE는 localization error와 classification error의 가중치를 동등하게 두기 때문에 AP를 극대화하는 goal과는 일치하지 않습니다.
만약 많은 grid cell이 object를 포함하지 않는다면 해당 cell의 confidence score는 0이 되며 이는 object를 포함하는 cell 로부터 gradient를 압도하는 현상이 발생하게 됩니다. 이런 점은 모델의 불안정성을 초래하며 훈련이 초기에 발산하게 되는 문제가 발생할 수 있다고 합니다.
위와 같은 문제를 해결하기 위해 bounding box의 좌표를 예측하는 loss값은 증가시키며, object를 포함하지 않는 box의 confidence prediction의 loss 값은 감소시킵니다. 이를 위해 두가지 파라미터를 도입합니다.
- $ \lambda_{coord} $ : 논문에서는 5 로 설정
- $ \lambda_{noobj} $ : 논문에서는 0.5 로 설정
또한 SSE에는 한가지 문제가 더 있는데 작은 box와 큰 box에 대한 오차를 동등하게 둔다는 것입니다. 만약 100x100 크기의 box에서 5 pixel의 편차는 5% 정도의 오차를 의미하지만 10x10 크기의 box에서 5 pixel의 편차는 50%의 오차를 의미합니다. 이 문제를 해결하기 위해 본 논문에서는 너비와 높이의 제곱근을 예측하도록 loss function을 구성합니다. 너비와 높이의 제곱근을 취해주면 너비와 높이가 커짐에 따라 그 증가율이 감소해 loss에 대한 가중치를 감소시키는 효과가 있기 때문입니다.
YOLO는 각 grid cell 당 여러개의 bounding box를 예측합니다. 하지만 최종적으로 하나의 object는 하나의 bounding box로 예측되어야합니다. 즉, 1개의 object에 대해 예측된 bounding box가 중복되기 때문에 여러개의 bounding box들 중 IoU값이 가장 높은 bounding box를 "responsible" bounding box로 결정합니다.
훈련하는 동안 최적화를 하기 위해 다음과 같은 loss function을 사용합니다.
- $ 1^{obj}_{ij} $ : i 번째 grid cell의 j 번째 bounding box가 "responsible" 이면 1, 아니면 0을 반환
- $ 1^{obj}_{i} $ : i 번째 grid cell에 object가 존재하면 1, 아니면 0을 반환
- $ 1^{noobj}_{ij} $ : i 번째 grid cell의 j 번재 bounding box가 "responsible" 이면 0, 아니면 1을 반환
- $ C_{i} $ : 해당 bounding box가 object를 포함하면 1, 아니면 0을 반환
위의 loss function은 총 3가지로 분류됩니다.
localization loss
- object가 존재하는 i 번째 grid cell의 j 번째 bounding box에 대해 중심 좌표 x 와 y 의 loss 값 계산
- object가 존재하는 i 번째 grid cell의 j 번째 bounding box에 대해 width와 height 의 loss 값을 계산하며, 큰 box의 경우 작은 box에 비해 같은 loss값이여도 상대적으로 IoU값에 적은 영향을 주기 때문에 제곱근을 취한 후 SSE 계산
confidence loss
- object가 존재하는 grid cell의 j 번째 bounding box에 대해 confidence score의 loss값 계산 ($ C_{i}=1 $)
- object가 존재하지 않는 grid cell의 j 번째 bounding box에 대해 confidence score의 loss값 계산 ($ C_{i}=0 $)
classification loss
- object가 존재하는 grid cell에 대해 conditional class probability 의 loss값 계산
- $ p_{i}(c)=1 $이라면 class c가 correct임을 의미
- $ p_{i}(c)=0 $이라면 class c가 incorrect임을 의미
본 논문의 저자는 PASCAL VOC 2007, 2012의 train 및 validation datasets을 사용하여 135 epochs로 YOLO 모델을 훈련시켰습니다. 이때 batch size=64, momentum=0.9, decay=0.0005 으로 설정하였습니다. learning rate의 경우 처음부터 너무 크게 잡으면 gradient explosion이 발생하기 때문에 초반에는 0.001에서 0.01로 천천히 증가시켰습니다. 75 epoch 까지는 0.01로 설정하였으며, 이후 30 epoch 동안은 0.001 값으로, 마지막 30 epoch동안은 0.001 값으로 learning rate를 설정하였습니다.
추가로 overfitting을 보완하기 위해 dropout과 data augmentation을 진행했습니다. dropout의 비율은 0.5로 설정하였으며, data augmentation으로는 원본 이미지의 20%에 대해 random scailing과 random translation을 적용하였습니다.
Limitations
- 각각의 grid cell은 오직 2개의 bounding box만을 예측하며, 각 box에 대해 1개의 class만을 예측합니다. 만약 object가 겹쳐있다면 제대로 예측을 하지 못하는 공간적 제약(spatial constraints)을 야기하게 됩니다.
- 새로운 형태의 bounding box의 경우 정확히 예측하는 것이 어렵습니다. 예를 들어 1:1과 2:2 비율의 bounding box에 대해서만 학습이 된 경우 새로운 3:4 비율의 bounding box에 대한 예측이 어렵다는 한계가 존재합니다. 이는 bounding box가 data로 학습되어있기 때문이기도 합니다.
- 작은 bounding box의 loss값이 IoU에 더 큰 영향을 줍니다. 이는 손실함수인 SSE가 bounding box의 크기에 상관없이 동일한 가중치를 주기 때문입니다. 큰 bounding box는 위치가 약간 달라져도 성능적으로 큰 영향을 주진 않지만 작은 bounding box의 경우 위치가 약간만 달라져도 성능적으로 큰 영향을 주어 IoU값의 변화가 더 심하게 됩니다.
'논문 리뷰 > Object detection' 카테고리의 다른 글
[논문 리뷰] A Method for Detection of Small Moving Objects in UAV Videos(2021) (0) | 2023.07.14 |
---|---|
[논문 리뷰] SPP: Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition(2015) (0) | 2023.07.06 |
[논문 리뷰] YOLO v1(2016) 리뷰 (0) | 2023.01.10 |
[논문 리뷰] R-CNN(2014) (0) | 2022.12.30 |