이번 포스팅부터는 one-stage detector에 해당하는 YOLO를 버전별로 설명하도록 하겠습니다. YOLO는 현재 (2024년 3월 19일 기준) 9번째 버전까지 나올 만큼 자주 사용되고 활발히 개발되면서 실시간 Object Detection의 대명사로 자리잡게 되었습니다.
YOLOv1의 구조 및 동작 방식
YOLOv1의 전체적인 모델 구조는 다음과 같습니다.
YOLOv1의 모델은 GoogLeNet으로부터 많은 영감을 받았으며 이를 일부 수정하여 DarkNet이라는 독자적인 Convolutional Network을 만들어 사용했습니다. 24개의 Convolutional Layer(Conv Layer)와 2개의 Fully-Connected Layer(FC Layer)로 연결된 구조이며, GoogleNet에 사용되는 inception model 대신 1 x 1 convolution layer을 사용한다고 합니다.
Convolutional layer로 이미지로부터 특징을 추출하고, FC layer로 Bounding Box와 Class 확률을 예측하며 최종적으로 네트워크의 출력으로는 7 x 7 x 30 크기의 예측 텐서(Prediction Tensor)가 나오게 됩니다
그렇다면 이 예측 텐서에 object의 Bounding Box와 Class 확률이 어떤 식으로 저장되어 있는지 YOLOv1의 동장 방식과 함께 설명하도록 하겠습니다.
입력 이미지에 대해서 YOLOv1이 최종 detection을 도출하는 동작 방식은 다음과 같습니다.
1. 입력 이미지를 S x S Grid로 나눔
2. 만약 물체의 중심이 Grid cell 안에 들어가면 해당 Grid cell이 물체를 detect했다고 판단
3. 각 Grid cell은 B개의 Bounding Box 후보를 기반으로 Object의 Bounding Box와 Confidence score를 예측
4. B개의 Bounding Box 중 Confidence score가 더 큰 Bounding Box에 대해서만 C개의 각 클래스 확률이 저장
5. 예측 Bounding Box에 대해서 NMS(Non-Max Suppression)로 필터링하여 최종 Bounding Box 선택
논문에서는 S = 7, B = 2, C = 20의 값을 사용했습니다. 즉 입력된 이미지를 7 x 7 Grid를 나누고 각 Grid Cell 당 2개의 Bounding Box 후보를 만들며 IoU가 더 큰 Bounding Box에 대해서만 20개의 클래스의 확률이 저장되는 것이죠.
따라서 7 x 7 x 30 크기의 예측 텐서(Prediction Tensor)는 위 그림과 같이 각 Grid Cell 별로 1 x 1 x 30 크기의 예측 값에 대한 정보를 저장하고 있고 이는 다음과 같은 값들로 이루어져 있습니다.
1. 2개의 Bounding Box 후보의 좌표와 해당 Box 별 Confidence Score
- x, y, w, h : 정규화된 Bounding Box의 중심좌표와 너비/높이
- Confidence Score: 해당 Bounding Box가 오브젝트일 확률 x Ground Truth와의 IoU 값
2. 클래스 확률, Pascal VOC 기준 20개 클래스의 확률
이때 클래스 확률은 Confidence score가 더 큰 Bounding Box에 대해서만 20개의 각 클래스 확률이 저장되기 때문에 각 Grid Cell 별로 2(Bounding Box 개수) x 5(Bounding Box의 좌표와 Confidence Score) + 20(Confidence score가 더 큰 Bounding Box의 각 클래스 별 확률) = 30개의 예측 값을 가지게 되고 최종적으로 입력 이미지에 대해서 7 x 7 x 30 크기의 예측값을 가지게 되는 것입니다.
각 Grid Cell 별로 하나의 Bounding Box에 대한 Class 확률만 저장되어 있기 때문에 이는 개별 Grid Cell 안에 여러 Object가 있더라도 하나의 Object만 detect할 수 있다는 뜻이 됩니다. 이는 YOLOv1의 단점이라 할 수 있겠죠.
※ NMS, IoU에 대한 개념을 처음 접하신다면 아래 링크를 참고하시면 되겠습니다.
https://developer-lionhong.tistory.com/33
<참고>
각 Grid Cell의 예측 Bounding Box의 Confidence Score는 해당 Bounding Box가 오브젝트일 확률 x Ground Truth와의 IoU 값으로 계산된다고 했습니다. 그렇다면 Ground Truth 정보가 없는 새로운 이미지에 대해서 predict을 진행할 때 Confidence Score는 계산될 수 없는게 아닌가에 대한 의문이 생길 수 있습니다. (사실 제가 헷갈렸었습니다 ^ . ^)
하지만 Confidence Score를 계산하는 식(오브젝트일 확률 x Ground Truth와의 IoU)은 confidence score를 만들기 위한 모델 예측 식(가중치 기반의 식)을 학습시키기 위해서 사용된 것입니다. 이렇게 모델에서 가중치 기반의 예측식이 학습을 통해 만들어진 후, 모델의 입력으로 이미지가 입력되면 이 예측 식에 기반하여 confidence score를 계산해 주는 것이죠.
Loss Function (손실 함수)
Loss Function을 살펴보기 전에 먼저 책임(responsible) bounding box에 대한 개념부터 알고 갈 필요가 있습니다. 저희는 입력 이미지에 대해서 YOLO가 98개의 bounding box를 예측한다는 것을 배웠습니다. 하지만 모델 학습에 ground truth에 가까운 예측값을 사용해야지 모든 예측 값을 사용해서는 원하는 학습 결과를 얻을 수 없을 것입니다. 따라서 YOLOv1은 객체의 수에 대응하는 책임 bounding box를 정하고 이에 대해서만 Localization Loss, Classification Loss를 계산하며 Object Confidence Loss의 경우에만 배경을 detect할 경우를 막기 위해 책임 bounding box가 아닌 예측값도 이용하여 loss를 계산해 줍니다.
책임(responsible) bounding box는 객체의 center가 속해있는 grid cell에서 예측한 2개의 bounding box 중 ground truth와의 IoU값이 더 큰 bounding box로 결정됩니다. 그러면 본격적으로 YOLOv1의 Loss Function에 대해서 살펴보도록 합시다.
YOLOv1의 전체 손실 함수는 위 그림과 같습니다. SSE(Sum of Squared Error)를 사용한 것을 확인할 수 있고 아래와 같이 4부분으로 나눌 수 있습니다.
BBox 중심 x, y 좌표 Loss
- 모든 Cell의 BBox(98개) 중에 책임 BBox만을 이용해 예측 x, y 값과 Ground Truth 좌표 x, y 값의 오차 제곱을 기반으로 Loss를 계산
- $1_{ij}^{obj}$은 책임 BBox에 대해서만 1 나머지는 0 값으로 설정됨
- $\lambda_{coord}$는 Bounding Box 좌표 손실에 대한 Loss를 늘리기 위한 파라미터로 논문에서는 5로 설정
※ YOLOv1의 Loss 함수의 형태는 Localization Loss와 Classification Loss를 동일하게 취급하는 형태입니다. 또한 많은 Cell이 물체를 포함하지 않을 (주로 배경) 경우 Grid cell의 Confidence Score가 0으로 수렴할 수도 있고, 이 점수가 다른 cell의 gradient를 압도하게 되면 error가 발생하여 모델이 불안정해지고 train도 발산할 수가 있습니다. 이를 해결하기 위해서 Bouding box에 대한 Loss는 늘리고, 물체를 포함하지 않는 Grid cell의 Confidence score의 Loss는 줄이는 방법을 도입했다고 합니다. (YOLOv1 paper에서 발췌)
BBox 너비 w, 높이 h Loss
- 예측 Bounding Box의 너비, 높이값과 Ground Truth 너비, 높이 값의 오차 제곱을 기반으로 Loss 계산
- 큰 Object의 경우 작은 Object에 비해 Bounding Box가 조금만 바껴도 오류가 상대적으로 커지기 때문에 이를 제약하기 위해서 제곱근을 취함
- 위와 마찬가지로 책임 BBox에 대해서만 Loss를 계산하고 동일한 파라미터 사용( $1_{ij}^{obj}, \lambda_{coord}$ 사용)
Object Confidence Loss
- 책임 BBox에 대해서 예측된 Object Confidence Score과 Ground Truth와의 IoU값의 오차를 기반으로 Loss 계산
- 나머지 BBox에 대해서는 물체를 포함하지 않는다고 예측해야 하므로 예측된 Object Confidence Score과 0과의 오차로 Loss 계산
- $\lambda_{noobj}$는 물체를 포함하지 않는 grid cell의 Confidence score의 Loss를 줄이기 위한 파라미터로 논문에서는 0.5로 설정
Classification Loss
- 책임 Bounding Box에 대해서 예측 Classification 확률 오차의 제곱으로 Loss 계산
YOLOv1의 장점과 한계점
YOLOv1의 장점으로 논문에서는 다음 3가지를 내세우고 있습니다.
1. 빠른 detect 속도
먼저 one-stage detector인 만큼 당연히 빠른 detect 속도를 장점으로 들 수 있습니다. Fast YOLO의 경우 FPS가 155나 나온다고 하니 Realtime Object Detection을 수행하기에 충분하고도 넘치는 속도가 나오는 것이죠.
2. Background error가 Fast R-CNN에 비해 2배 이상 적다
이미지 전체를 이용하여 prediction을 수행하기 때문에 배경 이미지에 객체가 있다고 탐지하는 오류를 많이 줄였다고 합니다.
3. 객체의 일반화된 representations를 학습하여 다른 도메인에서 좋은 성능을 보인다.
아래 그림과 같이 학습시킨 이미지 데이터셋과 다른 맥락의 미술작품(artwork)에서도 좋은 성능을 보여주면서 일반화된 특징을 잘 학습한다는 것을 입증했습니다. 이미지의 특징만을 학습하는 것이 아니라 전체 이미지를 이용하여 학습하기 때문임을 유추할 수 있습니다.
하지만 YOLOv1은 위에서 언급했듯이 각 Grid Cell 별로 하나의 Object만을 detect할 수 있기에 크기가 작은 Object에 대한 detect 성능이 떨어지고 Bounding Box 형태가 data를 통해 학습되므로 새로운 형태의 Bounding Box의 경우 정확히 예측하지 못한다는 단점이 있습니다.
사실 YOLOv1은 one-stage detector의 시작을 연 모델로 SSD보다 먼저 나온 모델입니다. 하지만 155FPS라는 빠른 속도에 비해 낮은 detection 성능을 보였고, 빠른 속도와 좋은 detection 성능 모두를 갖춘 SSD가 6개월 뒤에 나와 빛을 보지 못한 모델이었죠.
이후 여러가지 최신 기술들을 취합하면서 만들어진 YOLOv2는 수행 시간과 성능을 모두 대폭 개선되게 됩니다. YOLOv2에 대해서는 다음 포스팅에서 설명하도록 하겠습니다.
Reference
● https://www.inflearn.com/course/딥러닝-컴퓨터비전-완벽가이드/dashboard - 인프런 강의
● https://velog.io/@joon10266/Object-Detection-YOLOv1
● https://dacon.io/forum/406114
● https://arxiv.org/pdf/1506.02640.pdf
'Perception > Object Detection' 카테고리의 다른 글
[Object Detection] YOLOv3: An Incremental Improvement (0) | 2024.04.06 |
---|---|
[Object Detection] YOLOv2 (YOLO9000:Better, Faster, Stronger) (0) | 2024.03.29 |
[Object Detection] SSD(Single Shot Multibox Detector) (1) | 2023.07.12 |
[Object Detection] Faster R-CNN (0) | 2023.07.01 |
[Object Detection] Fast R-CNN (0) | 2023.05.23 |