안녕하세요~
지난번 글까지는 RCNN 계열 (RCNN - Fast RCNN - Faster RCNN)에 대해서 알아보았어요.
이번글부터는 새로운 object detection 방식인 YOLO에 대해서 알아보도록할게요. 자세히 보시고 Faster RCNN과 어떤차이가 있는지 살펴보시면 좋을거 같아요!
<1. Motivation>
1) Low FPS
Faster RCNN 논문에서 언급된 fps 성능은 5fps에요. Detection 성능인 mAP는 높은 수준을 유지하고 있지만 낮은 fps 성능 때문에 real-time (30fps) 수준에 한참 미치지 못하는 결과를 볼 수 있었어요.
Faster RCNN의 순서도를 보면 아래와 같다고 할 수 있는데요. classification을 하려면 RoI를 먼저 선행되어야 한다는 단점이 있어요. 그러다보니 'detection 성능은 조금 떨어뜨리더라도 높은 fps 성능을 갖는 object detection 모델을 구현해볼 수 없을까?'라는 질문을 하게 됩니다.
그래서 만든 object detection 모델이 YOLO에요. YOLO의 architecture를 먼저 간단하게 보시면 아래와 같은데요. Faster RCNN과 달리 Bounding box를 선별하는 localization 작업과, classification 작업이 동시에 수행되어 최종 detection 결과를 보여주는걸 보실 수 있어요.
결과적으로 아래와 같은 구조차이로 인해 YOLO의 fps가 더 높게 나올 수 있게 됩니다.
그럼 지금부터 YOLO가 어떻게 동작하는지 디테일하게 알아보겠습니다.
<2. Architecture>
Step1 - Feature map(Grid Cell) extraction
다른 Object detection 모델처럼 CNN을 통해 feature map (=SxS)을 추출합니다. 논문에서는 7x7의 feature map을 추출했고, feature map을 grid cell이라는 용어를 사용하여 표현합니다. 왜 7x7이냐라는 질문에는 명확한 답을 내놓을것 같지는 않고 단지 empirical result일거라는 생각이 드는데요.
Grid cell의 기준을 홀 수 (=7) size로 선정한 이유는 대부분 이미지에서 물체들이 중앙에 위치할 확률이 높기 때문인거 같고, 7x7 보다 크거나 작은 홀 수 size로 설정한 수 있지만 7x7보다 크면 더 많은 bounding box가 생성되기 때문에 fps성능이 떨어질것이고, 7x7보다 작으면 더 적은 bounding box가 생성되기 때문에 mAP 성능이 낮아질것이라고 추측되기 때문에 실험적으로 제일 적당한 사이즈를 찾은게 아닌가 싶어요.
<사진1>
또한 YOLO는 Conv layer를 적용시킬 때, 1x1 conv filter를 이용하여 channel reduction을 수행하였고, 이를 통해 연산의 효율성도 증가시키게됩니다. GoogLeNet의 아이디어에서 영감을 받았다고 하네요. (아래 filter notation이 혼동이 될 수 있는데, 첫 번째 layer를 보면 실제로 7x7x3 filter를 64개 적용한 모습이라고 한다면 그 다음 layer의 filter notation을 이해하실 수 있으실거에요)
한 가지 의아한점은 x4, x2로 반복되는 구조가 있는데 이 부분을 쓴이유는 대게 non-linearity를 증가시키기 위해서일텐데, 이게 과연 얼만큼의 효과를 내고 있는건지는 모르겠네요. 오히려 불필요한 반복으로 parameter가 많아진거면 overfitting의 역효과를 불러 일으킬 수 있을거 같기도 하거든요 (뭐 제가 제기하고 있는 질문들도 충분히 고려해서 여러 실험을 진행한거라고 믿고 있습니다만.) 그리고, FC layer도 굳이 두어야 했나라는 의문도 들게 되는데요. SSD라는 모델은 나중에 FC layer제거한 object detection 모델을 만들게 됩니다 (이 부분은 SSD모델을 다룰때 더 자세히 설명드릴게요!)
Step2 - Bounding box & Classification information 구축 (7x7x30 Grid cell)
YOLO V1에서는 각각의 Grid cell에서 2개씩 bounding box를 생성 (= predicted bounding box = RoI)시켜요. 이과정에서 bounding box 정보(x,y,w,h)와 confidence score정보를 생성하게되는데요.
x,y: 각각의 cell 안에서의 위치
(cell 위치내에서 가운데에 있을수도 있고, 약간 오른쪽으로 이동할 수 있음, 아래그림에서 초록색 점이 cell위치 x,y를 의미)
w,h: bounding box의 높이와 넓이
confidence score: bounding box에서 object가 포함되어 있을 확률 (어떤 class에 속하는지를 말해주는것이 아닌 단지 bounding box내에 객체가 포함되어 있는지 아닌지 추론)
(Training시에 predicted bounding box와 입력데이터에 포함되어 있는 ground truth들의 IoU에 따라 학습이 진행되는데요. 이렇게 학습하다보면 neural network가 object라고 하는 녀석들의 특성을 파악하게 될거에요. 그렇게 학습된 neural network가 test시에 적용되어 bounding box내에서 object가 있는지 없는지에 대한 확률값을 생성하게 됩니다 -> 학습 과정은 뒤에서 자세히 설명할게요~)
동시에 각 cell이 어느 classes(categories)에 속해있는지 classification 작업을 해줍니다. 이때 각 cell의 확률값은 조건부 확률로 주어지는데 즉, 객체가 있을 확률에 대해 어떤 클래스일지 판단하는 확률값입니다 (극단적으로 이야기하자면 객체가 있을때 그 객체가 어떤 클래스인지 판단하는 조건부 확률이라고 보시면 되겠네요)
이러한 과정을 하나의 그림으로 설명할 수 있는데요. 아래와 같이 각각의 cell에는 총 30개의 정보가 담겨져 있어요. 앞에서 말했듯이 하나의 bounding box에 대한 좌표정보(=x,y,w,h)와 confidence(=P(object))정보가 총 2개 (=2x5) 들어있고 (bounding box는 각 cell마다 2개씩 생성되기 때문에), 나머지 20개의 정보는 Pascal VOC challenge가 20개 class에 대해서 detection작업을 하는것이기 때문에, 20개의 class에 대한 classification 확률값을 담게 됩니다.
<사진2>
<사진3>
Step3 - NMS (Non Maximum Suppression)
Bounding box정보((x,y,w,h), P(object))와 classification 정보(P(class|object))를 담고있는 grid cell을 구축했으니 grid cell을 이용한 최종 detection 작업순서를 설명드릴게요.
7x7 grid cell 각각에 대해서 2개의 bounding box 정보와 20개의 classification 정보가 담겨있어요. 그리고 두 개의 정보가 어떻게 이용되는건지 아래와 같이 나와있어요.
먼저, 첫 번째 cell에서 얻고자하는 결과는 20x1 tensor에요. 20x1 tensor에는 해당 cell에서 20개의 class에 대한 score(확률값)을 알려줍니다. Class에 대한 score(확률값)은 아래와 같은 과정을 통해 얻을 수 있어요.
<사진4>
각 cell에 대해서 위와같은 작업을 모두 진행하면 아래와 같은 결과를 얻을 수 있게 됩니다.
<사진5>
위에서 얻은 정보를 통해 detection하는 과정에 대한 설명을 아래의 그림으로 대체하겠습니다.
<사진6>
위와 같은 작업이 끝났다면 최종 마무리 작업을 하게 됩니다.
- 특정 cell 위치에 해당하는 하나의 bounding box에서 가장 높은 score(확률값)을 갖는 class를 골라줍니다.
- 특정 cell 위치에 해당하는 하나의 bounding box에서 가장 높은 score(확률값)이 0이 넘는다면 선택된 class와 매칭되는 color와 score를 그려줍니다.
<사진7>
아래 그림은 최종 detection 결과입니다.
<사진8>
<3. Training>
YOLO의 cost(loss) function은 아래와 같이 여러 요소들에 대한 regression 문제들을 전부 더하기 연산으로 통합시킨것을 볼 수 있을거에요. 즉, localization문제(=localization regression)와 classification문제(=classification regression)를 하나로 통합한 하나의 regression 모델을 만들었다고 볼 수 있는데, 이때문에 'You Only Look Once (for detection)'이라는 명칭이 붙여졌습니다.
위의 여러 regression에 대해서 알아보기 전에 기본적인 hyperparameter에 대해서 알아보도록 할게요.
1이라고 표기된 부분은 ground truth와 predicted bounding box (RoI)의 IoU를 기점으로 객체가 포함되어 있는지 여부를 알려주는 함수라고 생각하시면되고, 람다라고 표기된 부분은 객체가 포함되어 있다면 5라는 learning rate을 주는 개념으로 알고있으면 될 것 같습니다. 이렇게 5, 0.5로 구성한 이유는 대게 7x7 cell 중에 객체가 아니라고 하는 cell이 더 많을 텐데 이러한 cell들에 대해 학습을 진행하다보면 negative example에 대해서만 neural network가 학습할 가능성이 큽니다. 즉, 우리가 원하는건 해당 객체 (positive example)에 대한 detection이지 negative example에 대한 detection이 아니기 때문에 아래와 같이 learning rate 값을 다르게 주게 됩니다.
1) Regression of bounding box
1-1) Regression of bounding box coordinate in a cell
먼저 bounding box의 중점이 되는 좌표값에 대한 regression 식이에요. 결과부터 말씀드리자면 학습을 통해 아래 그림처럼 빨간색 좌표에서 초록색 좌표로 이동하는 것을 볼 수 있어요.
아래식을 해석하자면 i번째 cell에 속하는 j번째 bounding box에서 ground truth가 존재한다고 했을때 (존재 여부는 predicted bounding box와 ground truth의 IoU가 기준이 됩니다), ground truth의 x,y좌표와 predicted bounding box의 x,y좌표에 대해 regression을 진행합니다.
1-2) Regression of bounding box width and height in a cell
위와 동일한 개념이지만 루트를 씌워준 이유는 아래와 같습니다.
하나의 cell 안에서 ground truth와 predicted bounding box의 차이가 많이 나봤자 하나 cell 영역범위에 제한적이다보니 차이값이 크게 나지 않습니다.
논문에서는 small deviation in large boxes 라고 표현했는데요. 명확하게 이해되지 않는 부분이 있어서 아래와 같이 제 생각을 정리해봤어요. (설명이 틀릴수 있으니 주의해주세요!)
하지만 bounding box의 width, height의 넓이는 cell의 범위와 다르게 다양하게 형성될 수 있어요. 즉, 생성된 predicted bounding box가 큰 객체의 ground truth와 비교했을때는 굉장히 큰 error값이나오고, 작은 객체의 ground truth와 비교했을때는 상대적으로 작은 error 값이 나올 수 있어요. 그러다보면 큰 object 위주로 학습을 할 가능성이 있기 때문에, 루트를 씌워죠 이러한 문제를 피하고자 한거같아요.
2) Regression of bounding box score prediction
2-1) Regression of bounding box score prediction when there is object in a cell
Predicted bounding box가 학습에 따라 변하면 ground truth와 비교해가면서 특정 cell에 bounding box가 존재하는지 (confidence score)를 학습하게 될거에요.
아래와같은 cost function으로 인해 점점 bounding box는 ground truth에 근접하게 이동하도록 유도 될거에요.
2-2) Regression of bounding box score prediction when there isn't object in a cell
각각의 cell에 대해서 predicted bounding box와 ground truth를 비교하다보면 IoU가 현저하게 낮게 나오는 경우가 있어요. 이럴때는 보통 해당 cell에 객체가 없다고 판단하는데요. 이러한 negative example에 대해서는 learning rate를 굉장히 낮게주어 positive example 위주로 학습이 되도록 방햐을 설정해줘요.
3) Class score prediction
마지막으로는 classification 작업에 대한 regression이에요. Training 이미지 데이터에는 특정 cell에 어떤 class가 있는지 알 수 있어요. 만약 학습 이미지를 입력받았을때, i번째 cell에서 20개의 클래스 중 j번째 클래스에 속해 있다고 하면 아래와 같이 표현할 수 있을거에요.
CNN이 학습이 잘되었다면 해당 cell에서 ground truth가 아닌 class에 대해서는 0과 가까운 값을 도출할거에요. 그래서 해당 cell에서 ground truth인 class에 대해서는 p^값을 점점 높여주는 방향으로 학습할거고, ground truth가 아닌 class에 대해서는 점점 낮은 방향으로 p^값을 업데이트 해줄거에요.
지금까지 설명드린 내용을 요약하면 아래의 그림으로 보여드릴 수 있을 것 같아요.
<4. Result>
YOLO V1은 Real-time을 실현시켰다는 획기적인 성과가 있었지만, 정확도 (mAP) 측면에서는 기존 object detection model (Faster RCNN) 보다는 낮게 나오기 때문에 문제가 되었습니다.
다음장에서는 이러한 문제점을 개선한 YOLO V2에 대해서 알아보도록 하겠습니다.
[논문 래퍼런스]
You Only Look Once: Unified, Real-Time Object Detection/ Joseph. R/ 2016/ https://arxiv.org/abs/1506.02640
[글 래퍼런스]
https://curt-park.github.io/2017-03-26/yolo/
[사진 래퍼런스]
사진1
사진2,4
https://www.slideshare.net/xavigiro/object-detection-d2l4-2017-upc-deep-learning-for-computer-vision
사진3
http://openresearch.ai/t/yolo-you-only-look-once-unifed-real-time-object-detection/67
사진4
https://pylessons.com/YOLOv3-introduction/
사진5,6,7
http://blog.naver.com/PostView.nhn?blogId=sogangori&logNo=220993971883
사진8
https://sandipanweb.wordpress.com/2018/03/11/autonomous-driving-car-detection-with-yolo-in-python/
'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글
11. SSD (3) | 2020.02.06 |
---|---|
10. YOLO V2 (4) | 2020.02.06 |
8. Faster RCNN (1) | 2020.02.06 |
7. Fast RCNN (2) | 2020.02.06 |
6. SPP Net (2) | 2020.02.05 |