코딩뚠뚠

[머신러닝 공부] 딥러닝/YOLO V1 (object detection) 본문

공부/ML&DL

[머신러닝 공부] 딥러닝/YOLO V1 (object detection)

로디네로 2021. 4. 21. 23:58
반응형

 

저번 Faster-RCNN에 이어 이번에는 YOLO V1에 대해 알아보고자 한다.

 

dbstndi6316.tistory.com/273?category=957031

 

[머신러닝 공부] 딥러닝/Fast RCNN (object detection)

이번에는 저번 글에 이어 Object Detection model의 발전과정에 대해 계속 짚어나가도록 한다. RCNN -> SPP-Net -> ?? dbstndi6316.tistory.com/272 [머신러닝 공부] 딥러닝/SPP Net (object detection) 앞선 포스..

dbstndi6316.tistory.com

 

YOLO V1은 Faster RCNN의 어떤점을 보완해 나온 모델일까?

 

지금까지의 RCNN Fast-RCNN Faster-RCNN과는 다른.. 즉 RCNN모델이 아닌가?

 

 


 

 

1. 배경

 

  • 실시간성능

Faster-RCNN까지 발전하면서 FPS가 많이 발전했지만 아직 실시간 서비스를 구현할 정도는 아니었다. 따라서 이에 대한 보완이 필요했다.

 

Faster-RCNN은 사실 높은 수준의 mAP를 보였기 때문에 이의(detection) 성능을 조금 떨어뜨리더라도 실시간성을 강화할 수는 없을까 생각했다. (내가한건 아니고요..)

 

Classification을 수행하려면 우선적으로 ROI를 찾는 과정이 선행되어야 했는데 이 과정을 어떻게 간추릴 수 있을까 생각했다.

 

이와같이 YOLO는 Faster-RCNN과는 다르게 bounding box를 선택하는 localization과정과, classification작업을 동시에 수행하여 결과를 내보이는 것을 알 수 있다.

 

이로써 YOLO는 추론의 속도를 높일 수 있었다.

 

 


 

 

2. 구조

 

1) Feature map extraction

CNN 모델을 통해 feature map을 추출한다.

 

아래에서는 7x7 size로 map을 추출해냈다.

 

또한 GoogLeNet에서 영감을 받아 1x1 conv filter를 이용하여 channel reduction을 수행하여 연산의 효율성을 증가시켰다.

 

 

2) Bounding Box + Classification (7x7x30 Grid cell)

 

우선 Grid cell 이란 YOLO에서 feature map을 부르는 것이다.

 

YOLO v1에서는 각각의 Grid cell에서 2개씩 bounding box를 생성한다. (ROI를 만든다.)

 

만드는 중 bounding box(x,y,높이,넓이)의 정보와 confidence score(bounding box에 객체가 포함되어있는지)를 생성한다.

 

동시에 각 cell이 어떤 class에 속해있는지에 대한 classification 작업을 한다.


아래 그림을 보면 각각의 셀은 30개의 정보를 담고 있다는 것을 알 수 있다.

 

x, y, w, h 정보와 confidence 정보, classification 확률값 이다.

 

이해를 돕기위한 그림이다.

 

3) NMS (Non Maximum Suppression)

 

각 셀마다 30개의 정보를 담게 되었으니 이를 이용해 detection 작업을 수행해야 할 것이다.

 

7x7 의 Grid cell (feature map)은 각각에 대해 2개의 bounding box정보와 20개의 classification 정보가 있다.


이를 어떻게 이용할까?

 

우선 첫번째 셀을 예시로 들면 이를 통해 얻고자 하는 결과는 20x1 tensor이다. (bbox가 두개니깐 두개가나올것)

 

이 tensor는 해당 cell에서 20개 class에 대한 score를 알려준다.

 

모든 셀(7x7)에 대해서 작업을 진행하면 각 셀 별 class 의 score를 알 수 있을 것이다.


모든셀에서 20x1 tensor를 추출 한 이후에는 detection을 진행할 수 있다.

 

7x7 개의 셀에서 총 98개의 20x1 tensor가 추출되었을 것이다.

 

여기서 class0 에 해당하는, 각 텐서의 index 0번의 score를 가져와 0.5가 넘는다면 그곳에 위치함을 나타내준다.

 

그리고 중복된 박스를 지워주는 과정을 거친다.

https://89douner.tistory.com/92?category=878735


이후 진행과정은 아래와 같다.

 

  • 특정 셀의 위치에 해당하는 하나의 bounding box에서 가장 높은 score를 갖는 class를 고른다.
  • 특정 셀의 위치에 해당하는 하나의 bounding box에서 가장 높은 score가 0이 넘으면 선택된 class와 매칭되는 color와 score를 그려준다.

 

 


 

3. 학습과정

 

YOLO의 loss function은 여러 요소들에 대한 regression 문제들을 전부 더하기 연산으로 통합시켰다.

 

즉 localization regression과 classification regression을 통합한 loss function을 만들었다.

 

위에서부터 첫번째 ~ 맨 아래를 다섯번째 부분식으로 칭한다.

 


1) bounding box regression

 

  • Regression of bounding box coordinate in a cell

bounding box의 좌표값에 대한 regression 식으로 위의 수식에서 첫번째 부분식에 해당한다.

 

i번째 셀에 속하는 j번째 bounding box에서 GT(ground truth)가 존재할 때 GT의 x,y좌표와 prediction bounding box의 x,y좌표에 대해 regression을 진행한다.

 

 

  • Regression of bounding box width and height in a cell

위 사진의 두번째 부분식으로 첫번째 식에 루트를 씌운 것을 알 수 있다.

 

첫번째 식에서 GT와 predicted bounding box의 차이는 cell의 범위에의해 제한을 받을 수 밖에 없다.

 

하지만 bounding box의 width, height는 cell의 범위를 넘어서 다양하게 형성될 수 있고 만약 GT가 매우 크다면 굉장히 큰 error값이 나올 것이다. 

 

그렇다면 루트를 씌우지 않은 regression은 큰 object를 위주로 학습을 진행 할 수 있기때문에 루트를 씌워준 것이다.


2) Regression of bounding box score prediction

 

  • Regession of bounding box score prediction when there is object in a cell

예측한 bounding box를 GT와 비교하면서 특정 cell에 bounding box가 존재하는지를 학습하게 된다.

 

이어서 세 번째 cost function을 따라 bounding box는 점점 GT로 이동할 것이다.

 

 

  • Regression of bounding bos score prediction when there isn't object in a cell

각각의 cell에 대해 bounding box와 GT를 비교하면 IOU가 현저히 낮게 나오는 경우가 있으며 이는 cell에 해당 객체가 존재하지 않는다고 판단한다.

 

이러한 negative 한 example에 대해서는 lr을 낮게 주어 positive example을 위주로 학습하도록 방향을 설정해준다.

 


3) Class score prediction

 

Classification에 대한 regression으로 다섯번째 부분식에 대한 부분이다.

 

Training 이미지 데이터에는 특정 cell에 어떤 class가 존재하는지 알 수 있다.

 

Training 이미지를 입력받았을 때, i번째 cell에서 20개 클래스 중 j번째 클래스에 속해있는 것을 아래와 같이 표현한다.

CNN이 잘 학습되었다면 해당 cell에서 GT의 class가 아닌 다른 class에 대해서는 0을 도출할 것이다.

 

그래서 맞는 class에 대해서는 p^값을 높여주는 방향으로, 맞지 않는 class에 대해서는 낮은 방향으로 업데이트 할것이다.

 

 


 

4. 결과

 

YOLO V1은 이제 실시간 작동이 가능한 정도의 FPS를 보유할 수 있었지만 정확도를 나타내는 mAP는 Faster RCNN보다 낮은 문제가 있었다.

 

이를 과연 YOLO V2에서는 어떤 방법으로 해결했을까?

 

 


 

5. References

89douner.tistory.com/92?category=878735

curt-park.github.io/2017-03-26/yolo/?

arxiv.org/abs/1506.02640

 

 

 

 

 

 

반응형