AI/YOLO

YOLO(You-Only-Look-Once)

김 정 환 2020. 2. 16. 20:45
반응형

본 글은 아래 링크를 참조하여 본인에게 맞게 정리했습니다. 

 

 

WHAT

YOLO는 real-time이 가능한 물체 탐지 프로그램(?)입니다. 구버전 YOLO부터 YOLOv2, YOLOv3, YOLO9000 등 업그레이드 된 버전들이 있습니다. 여러 버전이 있지만 가장 기초인 YOLO를 주로하여 글을 작성하겠습니다.

 

 

 

HOW

Grid cell

YOLO를 이해하기 위해서는 가장 먼저 grid cell을 알아야 합니다. 왜냐하면, grid cell로 물체를 예측하기 때문입니다. YOLO는 input 이미지를 S x S grid로 나눕니다. 각 cell은 오직 1개의 물체만 탐지합니다. 각 grid cell은 타겟 물체가 있다고 예상되는 지점에 bounding boxes를 그립니다. 그리고 아래 오른쪽 그림과 같이 각 bounding box는 예상된 물체의 정도인 confidence score를 가집니다.

 

 

이제 grid cell의 parameter를 알아보겠습니다. YOLO는 1개의 grid cell에 30개의 parameters를 가집니다. 여기서 말하는 grid cell은 CNN network에서 마지막 7 X 7 X 30 인 층을 말합니다.

(위 이미지은 FC가 2개 있는 것을 보여줄 수 있고, 아래 이미지는 층이 어떻게 구성되는지 보여줄 수 있습니다. 같은 network입니다.)

 

 

아래와 같이 parameters가 나열됩니다. 

x와 y는 cell안에 bounding box의 중심을 나타냅니다. w와 h는 bounding box의 넓이와 높이를 나타냅니다. 그리고 c는 box confidence score를 나타냅니다. 그리고 20개의 conditional class probability가 있습니다. conditional class probability는 탐지된 물체가 어떤 클래스에 속할지 나타내는 정도입니다.

 

2개의 bounding box를 만들기 위해서 YOLO는 2개의 fully connected layeres를 이용합니다. 그러면 모든 cells에 2개의 bounding boxes가 생기고 아래 중간 이미지처럼 엄청 많은 박스들이 생성됩니다.(아래 그림은 YOLOv2이다. 그래서 grid가 13 X 13이고 각 cell은 5개의 boxes를 예측한다. 그래서 박스가 엄청 많은 것이다. YOLO가 없어서 YOLOv2로 가져왔다.) 최종 예측을 하기 위해서 box confidence score에 threshold(0.25)를 적용하면, 아래의 오른쪽 그림처럼 높은 class confidence score를 갖는 박스만 남습니다. class confidence score는 box confidence score * confitional class probability로 계산됩니다.

 

 

 

 

Network design

YOLO는 24개의 convolutional layers와 2개의 fully connected layers(FC)로 구성됩니다. 몇몇 convolutional layers는 1 X 1 reduction layers를 사용합니다. 왜냐하면 layer의 깊이를 변화시키기 위해서 입니다. 마지막 convolutional layer의 tensor(7, 7, 1024)는 fully connected layers(linear regression)의 도움으로 7 X 7 X 30 tensor를 만들어 냅니다. 

 

 

 

Loss function

YOLO는 각 cell에서 2개의 bounding box를 만듭니다. 많이 생성된 bounding boxes에서 가장 합리적인 bounding boxes를 찾아야 합니다. 그래서 가장 높은 IoU(intersection over union)를 이용할 것입니다. 

 

YOLO는 예측 값과 ground truth값을 이용해서 SSE(sum-squared error)를 구하고 loss를 계산합니다. loss function은 3개의 loss들로 구성됩니다. 

- the classification loss

- the localization loss(error between the predicted bounding box and the ground truth)

- the confidence loss(the objectness of the box)

 

 

 

Classification loss

Classification loss는 cell에서 물체가 검출되면 각 class에 class conditional probabilities의 squared error입니다. (머리속에 그리기 쉽도록 아래 이미지를 다시 가져왔습니다.)

그래서 식은 아래와 같습니다. (S는 격자의 수. Classification loss에서만 B(bounding box의 수), 왜냐하면 파란색은 공유되고 있기 때문입니다. 노란색은 각 bounding boxes 입니다.)

(Pi_hat(c)은 예측된 conditional class probaility(파란색)이고 Pi(c)는 학습되어 있는 class probabilty입니다.)

 

 

 

Localization loss

Localization loss는 예측된 bounding box 위치들과 크기들 사이의 errors를 계산합니다. 물체 감지를 한 박스에서만 계산합니다. 식의 첫 줄은 위치 error를 두 번째 줄은 크기 error를 계산합니다.  (S는 격자의 수, B는 anchor box의 수)

식의 두 번째에서 width와 height에 root를 씌웠습니다. 만일 root를 하지 않는다면, 큰 bounding boxes에서 미분값은 크게, 작은 bounding boxes는 작은 미분값을 가지게 될 것입니다. 같은 크기의 오류라도 다른 미분값을 갖게 된다. 따라서 root를 사용하여 그 차이를 줄여준 것입니다. 또한 위에서 밑줄 친 '물체 감지를 한 박스에서만'의 의미를 풀자면, 물체가 있으면 오차를 계산하고 그 값을 더욱 강조하려고 합니다. 그래서 λcoord(default: 5)를 곱해서 5배 중요하게 만들어 줍니다. 다음 loss인 confidence loss에서는 물체가 검출되지 않으면 0.5를 곱해서 중요치를 낮춥니다.

 

 

 

Confidence loss

Confidence loss는 cell에서 물체가 검출되면, 물체의 objectness(객관성)을 계산합니다. (S는 격자의 수, B는 bounding box의 수)

(Ci_hat은 예측된 box confidence score입니다.(노란색의 c))

 

만일 cell에서 물체가 검출되지 않으면, 

식은 이전과 비슷합니다. 하나 차이점은 λnoobj (default: 0.5)이 곱해진다는 것입니다. 이전에도 말씀했듯이, 물체가 없으니 중요도를 낮추는 작업입니다. 많은 bounding boxes는 물체를 검출하지 않습니다. 만일 λnoobj 를 사용하지 않는다면, 모델을 학습시키는 단계에서 물체보다는 물체가 없는 배경을 더 잘 탐지하도록 학습시키는 꼴이 됩니다. (참고로, YOLO는 각 cell에 학습시킨다.)

 

 

최종 Loss function은 아래와 같습니다. 위 losses를 모두 더한 것 입니다.

 

 

 

 

 

Non-maximal-suppresion(NMS)

 그러면 이미지가 24의 convolutional layers와 2개의 fully connected layers를 지나고 loss function을 거쳐 threshold를 넘으면 아래 오른쪽 그림과 같이 깔끔하게 bounding boxes가 나올까요? 그렇지 않습니다. 

실제로 나온 결과는 보면 아래와 같습니다.

아직도 굉장히 많은 bounding boxes가 보여집니다. 물체는 1개인데 많은 boxes가 있습니다. 우리는 1개의 box만 있으면 될 것 같습니다. 그래서 필요한 방법이 non-maximal-suppression입니다.

(의견: bounding boxes의 수를 줄이기 위해서 box confidence score에 threshold를 0.25보다 높이면 개수를 줄어들겠지만, 우리에게는 최적의 유의미한 bounding box가 1개 필요하기 때문에 non-maximal-suppression을 사용하는 것 같습니다.)

 

방법은 다음 차례입니다.

 

1. class confidence scores에 threshold를 적용합니다. (너무 작은 값은 버려서 계산 속도 증가)

2. 내림차순으로 나열합니다.

3. NMS를 적용하여 threshold 이하의 모든 class confidence scores는 0으로 만듭니다.

4. 모든 classes에 적용합니다.

 

개 class

 

고양이 class

대부분의 boxes에 class confidence scores는 0일 것입니다. 물체보다 배경이 크기 때문입니다. 

이렇게 NMS가 끝난 후에, bounding box를 그릴 차례입니다. score가 0보다 크면 box를 그려줍니다.

 

 

 

Beneifts 

1. 빠릅니다. 따라서 실시간 처리가 가능합니다. 

2. 하나의 네트워크만 사용하고 있어서 물체의 위치와 종류를 예측하는 정확도가 높습니다. 그리고 end-to-end 학습을 하면 정확도가 높게 나온다.

3. YOLO는 1개의 cell 당 1개의 물체를 탐지합니다. 

 

 

 

Risks

1. 7 X 7로 분할되어서 작은 물체가 모여 있으면 1개만 검출된다. => 개선된 YOLOv2가 나온다.

반응형

'AI > YOLO' 카테고리의 다른 글

YOLO Train  (0) 2020.02.17