☞ 문서의 내용은 가장 하단 참고문헌 및 사이트를 참고하여 필자가 보기 쉽도록 정리한 내용입니다.
☞ 틀린 내용 및 저작권 관련 문의가 있는 경우 문의하시면 수정 및 삭제 조치하겠습니다.
YOLO란?
YOLO는 You Only Look Once의 약자로 Object detection 분야에서 많이 알려진 모델이다. 처음으로 one-stage-detection방법을 고안해 실시간으로 Object Detection이 가능하게 만들었다. 현재 YOLO, YOLOv2, YOLOv3, YOLOv4, YOLOv5까지 나왔다.(YOLOv4, YOLOv5는 YOLO의 저자와 다른 개발자이다.) 모델마다 변화에 따른 장단점이 있다.
YOLO 특징 및 장단점
Yolo의 첫 번째 특징은 이미지 전체를 한번만 보는 것이다. YOLO 이전의 R-CNN은 이미지를 여러장으로 분할하고, CNN모델을 이용해 이미지를 분석했다. 그렇기 때문에 이미지 한장에서 Object Detection을 해도 실제로는 여러장의 이미지를 분석하는 것과 같았다. 하지만 YOLO는 이러한 과정 없이 이미지를 한 번만 보는 강력한 특징을 가지고 있다. 두 번째 특징은 통합된 모델을 사용하는 것이다. 기존 Object Detectin 모델은 다양한 전처리 모델과 인공 신경망을 결합해서 사용했다. 하지만 YOLO는 통합된 모델을 사용해 간단하다. 세 번째 특징은 실시간으로 객체를 탐지 할 수 있는 것이다. YOLO가 유명해진 이유는 높은 성능은 아니더라도 준수한 성능으로 실시간으로 Object Detection이 가능했기 때문이다. 기존의 Faster R-CNN보다 6배 빠른 성능을 보여준다.
YOLO는 기존의 Object Detection 모델과 비교 했을 때 다음과 같은 강점을 보인다. 첫 번째로 간단한 처리 과정으로 속도가 매우 빠르며 기존의 실시간 Object Detection 모델들과 비교하면 2배 정도 높은 mAP를 보인다. 두 번째는 이미지 전체를 한 번에 바라보는 방식을 이용하므로 class에 대한 맥락적 이해도가 다른 모델에 비해 높아 낮은 False-Positive를 보인다. 세 번째로 일반화된 Object 학습이 가능하여 자연 이미지로 학습하고 이를 그림과 같은 곳에 테스트 해도 다른 모델에 비해 훨씬 높은 성능을 보여준다. 하지만 다른 모델에 비해 낮은 정확도를 가지고 있다. 특히 작은 객체에 대해 정확도가 낮다.
YOLO Detection System
YOLO는 이미지 픽셀, bounding box, coordinate, class probabilit모두singleregressionproblem으로 재구성해 이미지를 한 번 보는 것으로 그 안에 어떤 물체들이 있는지, 어디에 있는지 파악할 수 있다. 아래 이미지와 같이 single convolutional network가 이미지 전체에서 multiple bounding box에 대한 class probability를 계산하는 통합된 모델을 사용한다.
Unified Detection
1. 먼저 입력 이미지를 S X S 그리드 영역으로 나눠 준다.
입력 이미지(1)가 네트워크를 통과화면 2개의 데이터(2, 3)를 얻는다.
논문에서는 7 X 7 그리드 영역으로 나눠준다.
2. 각각의 grid cell은 B개의 Bounding box와 각 Bounding box에 대한 confidence score를 갖는다. (만약 cell에 Object가 존재하지 않는다면 confidence score는 0이 된다.) confidence score는 이 시스템이 물체를 포함한다는 예측을 얼마나 확신하는지, 박스에 대한 예측이 얼마나 정확할지를 의미한다.
Confidence Score : $P _{r} (Object)*IOU _{pred}^{truth}$
※ IOU는 두 영역이 겹쳐져 있을때 두영역의 교집합을 합집합으로 나눈 것이다. 즉, (겹쳐진 넓이) / (전체 넓이)이다. 만약 두 영역이 완전히 겹쳐져 있다면 겹쳐진 넓이가 곧 전체 넓이라서 IOU = 1이 된다.
※Pr(Object)는 셀격자 내에 물체가 존재할 확률, 물체가 존재하지 않으면 confidence = 0 * IOU =0. 시스템은 pr(Object)를 1에 가깝게 만들고 싶어하고, 그럴 경우 confidence = IOU가 된다. 즉, confidence에 대한 오차 수정이 곧 IOU에 대한 오차 수정으로 되는 것이다.
각 그리드에서 중심을 그리드 안쪽으로 하면서 크기가 일정하지 않은 Bounding box 2개를 생성한다.(B = 2) 여기서 그리드 셀이 7x7 = 49이므로 Bounding box는 총98개가 만들어진다. 이 중 Bounding box 안쪽에 어떤 Object가 있을 것 같다고 확신(confidence score)할수록 박스를 굵게 그려진다.
3. 각각의 bounding box는 x, y , w, h와 confidence로 구성된다.
(x, y): Bounding box의 중심점을 의미하며, grid cell의 범위에 대한 상대값이 입력된다.
(w, h) : 전체 이미지의 width, height에 대한 상대값이 입력된다.
confidence : 예측 box와 실제 정답 사이의 IOU를 의미한다.
이 값들은 모두 (0,1)범위의 값으로 정규화
- 예 1: 만약 x가 grid cell의 가장 왼쪽에 있다면 x = 0, y가 grid cell의 중간에 있다면 y=0.5
- 예 2: bbox의 width가 이미지 widht의 절반이라면 w = 0.5
4. 각각의 grid cell은 C(conditional class probability)를 갖는다. 논문에서는 PASCAL VOC데이터셋을 사용하여 class개수는 20개이다. (C = 20)
Conditional Class probability : $P _{r} (class _{i} | Object)$
5. 평가할 때 conditional class probability와 각 박스의 class-specific confidence score를 주는 confidence prediction을 곱했다. 이 점수는 class가 박스안에 존재하는지와 박스가 물체에 얼마나 적합한가를 모두 포함한다.
$ClassSpecifiConfidenceScore$
$=ConditionalClassProbability * ConfidenceScore$
$=P _{r} (Class _{i} |Object) * P _{r} (Objects) * IOU _{pred}^{truth}$
$=P _{r} (Class _{i} ) * IOU _{pred}^{truth}$
따라서 우리의 최종 예측 결과는 7 * 7 * 30 tensor로 나타난다.
$OutputSize = S * S * (B * 5 +C) = 7 * 7 * 30$
※각 셀 격자는 (B * 5 +C)크기의 vector를 갖는다. 이미지 전체 (S * S * (B * 5 + C)크기의 tensor를 갖는다.
B * 5 : B개의 Bounding box 각각에 대해 x,y,w,h 그리고 confidence 까지 5개의 변수
C : class의 개수 - 셀격자에 포함된 물체가 각 Class에 해당될 확률들의 벡터의 크기
ex) 강아지일 확률, 고양이일 확률, 앵무새일 확률 ... / 확률 벡터의 크기는 class의 개수와 같다.
굵은 경계 박스들만 남기고 얇은 경계박스을 지운다. ROI혹은 오브젝트 후보라고 할 수 있는 이 경계박스들은 스레시 홀드(0.5)보다 작으면 지워진다. 스레시 홀드 값은 사용자가 선택할 수 있다. 남은 후보 경계 박스들을 NMS알고리즘을 선별하면 (4)이미지 처럼 3개만 남게 된다. 경계 박스의 색깔은 클래스를 의미한다.
Network Design
YOLO v1 논문에서는 CNN으로 모델을 구현하고 PASCAL VOC detecion dataset으로 평가했다. 초기 합성곱층(Convolutional layer)은 이미지로 부터 feature을 추출하고, 전결합층(Fully-connected layer, Dense layer)은 확률과 좌표를 예측한다.
신경망은 24개의 합성곱층과 2개의 전결합층으로 이루어져 있다. GoogleLeNet에서 사용된 인셉션 모듈을 대신하여, 단순한 1 * 1 reducation layer와 3 * 3 합성곱층을 사용했다.
YOLO 네트워크 구조는 직선이다.
마지막 특징 데이터 7 x 7 x 30가 바로 예측 결과이며 이 안에 경계박스와 클래스 정보 등 모든 것이 들어 있다.
아래 그림에서 왼쪽 빨간점으로 표시한 부분은 7x7 그리드셀중에 하나로 이미지에서 강아지의 중앙 부분에 해당한다.
그리고 빨간색 박스보다 큰 노란색박스가 빨간색 그리드셀에서 예측한 경계박스이다.
7x7은 영상을 7x7의 격자로 나눈 것이다.
30개의 채널은 (경계 박스의 정보 4개 , 경계 박스안에 오브젝트가 있을 확률(confidence)) x 2, 어떤 클래스일 확률 20개 로 구성된다.
논문에서는 PASCAL VOC데이터셋을 사용하여 class개수는 20개이다. (C = 20)
경계 박스 정보 x, y : 노란색 경계 박스의 중심이 빨간 격자 셀의 중심에서 어디에 있는가.
경계 박스 정보 w,h : 노란색 경계 박스의 가로 세로 길이가 전체 이미지 크기에 어느 정도 크기를 갖는가
만약 경계박스가 아래의 그림 처럼 경계박스가 만들어 졌다면 x, y는 0.5 정도이고 w, h는 각각 2/7, 4/7 정도가 될 것이다.
노란색 경계 박스는 반드시 그 중심이 빨간 그리드 셀 안에 있어야 하며, 가로와 세로길이는 빨간 그리드 셀보다 작을 수도 있고 그림처럼 클 수도 있다. 또한 정사각형일 필요도 없다. 빨간 그리드 셀 내부 어딘가를 중심으로 하여 근처에 있는 어떤 오브젝트를 둘러싸는 직사각형의 노란색 경계 박스를 그리는 것이 목표이다. 노란색 경계 박스가 바로 ROI , 오브젝트 후보이다. 이것을 2개 만든다.
30개의 채널 중에서 앞에 5개는 1번째 경계박스의 정보가 있으며 다음의 5개에는 2번째 경계박스의 정보를 가지고 있다. 2번째 경계 박스는 1번째 것과 모양이 비슷할 수도 있고 다를 수도 있다. 네트워크가 학습하는 것이기 때문에 크기나 모양이 어떻게 나올지 모른다.
30개의 채널의 뒷부분에는 해당 그리드 셀(빨간색 박스)에 오브젝트가 만약 있다면 그것이 어떤 클래스일지에 대한 확률이 저장되어 있다. 각 그리드 셀에는 셀의 주위 혹은 셀 안쪽에 어떤 오브젝트가 있을 거라고 예측한 2개의 경계박스가 있다. 각 경계박스는 오브젝트가 있을 확률(confidence) 을 가지고 있다. 이 스칼라 값(숫자 1개)을 그리드 셀의 클래스 분류 확률과 곱하면 경계박스의 클래스 분류 확률을 구할 수 있다. 이것이 위 그림의 긴 노란색 박스이다. bb1(bound box 1) 즉 첫번째 후보의 경계박스에 대한 클래스 점수표이다. 경계박스의 오브젝트가 있을 확률(confidence) 가 매우 낮다면(0에 가깝다면) 그곳에 어떠한 클래스가 있는지에 대한 정보도 매우 낮아 지게 된다.
- 그리드 셀 하나에 2개의 경계박스 후보가 있고 각 경계박스에 대한 클래스 분류 점수를 얻는다.
- 2번째 그리드 셀에서도 클래스 분류 점수 2개를 얻는다.
- 마지막 그리드 셀에서 클래스 분류 점수 2개를 얻는다.
- 경계 박스가 7x7이므로 클래스 분류 점수는 7x7x2개로 총 98개가 된다.
- 98개의 클래스 분류 점수중에서 스레시 홀드(0.2)보다 작은것은 전부 0으로 채워준다. 클래스 20개의 점수가 [0.1 , 0.1, 0.5 ,0 ,0 ,0.25, 0.1, 0, 0 ....]이렇게 나올 텐데 0.2보다 작으면 그것은 해당 클래스가 아닐거라고 판단한다.
스레시홀드를 사용하지 않으면 경계박스에서 가장 높은 확률을 갖는 클래스가 아래 그림과 같이 모두 나타난다.
클래스 첫 번째 자리는 Dog일 확률이다. Dog일 확률을 높은 값부터 낮은 값으로 정렬한다. 여기까지 하면 해당 경계박스의 클래스가 무엇인지 알 수 있다. 만약 위의 98개의 클래스 점수 표 중에서 97개가 0이고 1개가 0이 아니면 해당 오브젝트가 그 위치에 있다는 것을 간단하게 알 수 있다. 하지면 0이 아닌 노란 박스가 여러개 있을 수 있다. 특히 오브젝트의 크기가 큰 경우 더욱 그러하다.
이것들을 제거하기 위해서 NMS알고리즘을 사용하여 중복이 되는 경계박스들을 제거하여 하나의 경계박스만 남도록 한다. NMS는 여러 경계 박스들이 겹쳐있을 때에는 그중에서 최대값을 갖는 하나의 오브젝트만 빼고 나머지를 지운다(억제한다.) 그러나 여러 경계박스들이 겹쳐있지 않을 때에는 각 경계박스들은 서로 다른 오브젝트의 경계박스일 것이라고 생각하고 경계박스들을 그냥 둔다. 테스트 결과 NMS을 사용하면 mAP성능이 2-3%상승한다. NMS를 사용하지 않더라도 충분한 성능이 나오므로 NMS가 반드시 필요한 것은 아니라고 한다. NMS는 링크에서 확인 할 수 있다.
YOLO는 7*7개의 그리드 셀에서 각각 2개의 경계박스 후보를 예측한다. 그러므로 총98개의 경계박스를 예측한다. 20개의 클래스 중에서 우선 Dog만 살펴보자. 우선 클래스의 신뢰도 점수가 0.2보다 작은 것은 모두 0으로 셋팅한다. 경계박스의 신뢰도 점수가 어떤 클래스(예를 들어 Dog)에 대해서 신뢰점수가 낮다면 그 경계박스안에 뭐가 있는지는 아직 모르겠지만 최소한 그 클래스(Dog)는 아닐 것이라고 판단한다.
Dog에 대한 bbox confidence의 값을 큰것부터 작은것으로 내림차순 정렬하면 위와 같이 1x98크기의 배열을 얻게 된다. 신뢰도가 0.2보다 작은 것은 모두 지운 후에 Dog일 확률이 높은 경계박스가 3개 남았다. 아래 그림에서 개에 대해 가장 높은 경계박스 신뢰 점수를 갖는 그리드 셀은 bb47이다. 그 그리드 셀의 경계박스 예측 좌표를 오랜지 색으로 표시했다. bb20은 초록색 경계박스로 표시했으며 이때도 개를 어느정도 포착했다. 그러나 개의 다리와 엉덩이 부분은 포착하지 못했기 때문에 오랜지색 경계박스보다는 신뢰 점수가 낮다. bb15의 경우 파란 경계박스로 표시했으며 이때는 겨우 개의 앞발만 포착했다.
현재 경계박스 신뢰도가 가장 높은 첫번째 값 0.5가 bbox_max이다. 두번째 높은 신뢰도를 갖는 초론색 경계박스의 값은 원래 0.3이었다. 그런데 두 경계박스의 겹치는 부분이 50%가 넘는다. 이런 경우 둘 중 하나는 중복일 것이라고 판단, 둘 중 신뢰도가 낮은 것을 지워준다. 그래서 0.3의 신뢰도 값을 0으로 설정한다. 개에 대해서 3번째로 높은 신뢰도를 갖는 파란 경계 박스는 신뢰도가 가장 높은 오렌지색 경계박스와 겹치는 부분이 50%가 넘지 않는다. 그렇다면 파란색 경계 박스 안에는 좌측의 개가 아닌 또 다른 개가 있을 수도 있다고 판단한다. 이런 경우는 신뢰도 값을 건드리지 않고 그냥 건너 뛴다(continue).
지금 까지는 개에 대해서만 중복 경계 박스를 지웠다. 개에 대해 정렬한 1x20(첫번째 행)에서는 경계 박스 2개(오랜지색과 파란색)만 남고 나머지 18개는 모두 0이 되었다.
이제 남은 19개의 클래스(두번째 행 부터 마지막 행까지)에 대해서도 같은 작업을 해준다.그러면 대부분의 값은 0이 될 것이다.하지만 아직 한 단계가 더 남았다. 사진에서는 개가 1마리 뿐이 없었는데, 개에 대한 경계박스가 오랜지색, 파란색 2개가 남아있다. 파란색 경계 박스에는 개가 없었다. 이것을 지워주어야 한다.
bb3는 20개 클래스에 대한 신뢰점수를 가지고 있다. 20개 신뢰점수 중 가장 큰 값을 가지는 클래스가 바로 경계 박스의 컬러이다. 만약 가장 큰 값이 0인 경우, 즉 해당 그리드 셀에서의 클래스 신뢰도가 전부0이라면 bb3에는 오브젝트가 없는 것이다. 그러면 당연히 경계 박스를 그리지 않는다.(skip bbox) 이런 과정을 거쳐서 각 그리드 셀에서는 최대값을 갖는 클래스 하나와 또다른 클래스 하나 총 2개가 나타날 수 있다. 파란색 경계박스는 신뢰점수가 0.5이하이므로 나중에 지워진다. 최종적으로 3개의 경계박스만이 남는다.
Training
YOLO는 ImageNet의 1000-class competition dataset으로 pre-training(사전 훈련)을 했다. pre-training을 위해 20개의 합성곱층을 사용했고 average-pooling layer와 전결합층을 사용했다. pre-training이후 임의의 초기 변수를 갖는 4개의 합성곱층과 2개의 전결합층을 추가했다.
Bounding box의 width와 height를 이미지의 width와 height로 정규화하여 0과 1사이의 값으로 변경했다. Bounding box의 x,y좌표는 특정 grid cell 위치의 offset으로 설정하였다. 이 값은 0과 1 사이의 값을 가진다. 1개의 Object = 1개의 Boundig box를 위해 가장 높은 IOU를 갖는 grid cell에 "predictor"라는 이름을 붙인다.
$λ_{coord} = 5$ , $λ_{noobj} =0.5$
※ 49개의 그리드셀의 대부분은 오브젝트가 없다. 극단적으로 49개 중에서 1개에만 오브젝트가 나타날 수도 있다. 이 현상으로 인해 각 그리드 셀은 오브젝트가 있을 것 같다는 신뢰점수를 만들어야 하는데, 대부분의 셀에 오브젝트가 없기 때문에 신뢰 점수가 0에 가까워 진다. 이 문제를 해결하기 위해서 오브젝트가 있는 경우에 좌표 및 클래스 예측 로스는 키우고, 오브젝트가 없는 경우는 로스를 줄였다. 그것이 $λ_{coord} = 5$ , $λ_{noobj} =0.5$이다.
S : grid 크기
B : bounding box 개수
$λ_{coord}$ : cordinate(x,y,w,h)의 대한 loss의 균형을 위한 값
$λ_{noobj}$ : Object가 있는 box와 없는 box의 균형을 위한 값
$1 _{ij}^{obj}$ : Object가 존재하는 grid cell i의 IoU가 가장 높은 bounding box
$1 _{ij}^{noobj}$ : Object가 존재하지 않는 grid cell 의 bounding box
$1 _{i}^{obj}$ : Object가 존재하는 grid cell i
위 수식은 multi-loss function으로 모든 bounding box에 대해 얼마나 '오차가 큰지'계산한다.
- Object가 존재하는 grid cell i의 predictor bounding box j에 대해, x와 y의 loss를 계산.
- Object가 존재하는 grid cell i의 predictor bounding box j에 대해, w와 h의 loss를 계산. 큰 box에 대해서는 small deviation을 반영하기 위해 제곱근을 취한 후, sum-squared error를 한다. (같은 error라도 larger box의 경우 상대적으로 IOU에 영향을 적게 준다.)
- Object가 존재하는 grid cell i의 predictor bounding box j에 대해, confidence score의 loss를 계산. $(C_{i}=1)$
- Object가 존재하는 grid cell i에 대해, conditional class probabaility의 loss 계산. $(C_{i}=0)$
- Object가 존재하는 grid cell i에 대해, conditional class probability의 loss 계산. (Correct class c : $P_{i}(c)=1$, otherwise: $P_{i}(c)=0$)
$1 _{ij}^{obj},1 _{ij}^{noobj}$로 오브젝트가 있는 셀과 없는 셀을 구분한다. $1 _{ij}^{obj}$는 오브젝트가 있는 그리드셀 i이다. 경계박스와는 관계 없다. 그리고 물체가 있는 경우와 없는 경우에 각각 lamda_coord와 lamda_noobj로 나눠 비중을 달리했다.
참고자료