본문 바로가기

머신러닝/[논문으로 짚어보는 딥러닝의 맥]

Image Detection 방법론: AttentionNet, SSD, YOLO, YOLOv2

학습목표

 앞 강의에 이어 이번 강의에서도 Detection 방법론들을 알아보도록 하겠습니다. 이번 강의에서는 앞서 배운 R-CNN 계열의 방법들과는 다르고 새로운 방법들로, YOLO, SSD, YOLOv2는 굉장히 중요한 방법론이며 AttentionNet 역시 실용적으로 색다른 곳에 사용될 수 있기 때문에 관심과 흥미를 가지고 집중하여 학습하시길 바랍니다.

핵심 키워드

  • AttentionNet
  • SSD (Single Shot MultiBox Detector)
  • YOLO (You Only Look Once)

학습하기

 이번에는 Detection 방법론, 그러니까 이미지 안에서 어떤 Object의 Bounding box를 찾는 개념을 공부할 텐데, 앞에서 봤던 R-CNN 시리즈와는 다르게, 새로운 내용들이 많습니다. YOLO는 현재 최고라고 생각하며, AttentionNet은 다른 곳에도 적용이 가능하기에, 잘 들어주시면 좋을 것 같습니다.

 자 첫번째는 AttentionNet: Aggregating Weak Directions for Accurate Object Detection입니다. 제목이 인상적이죠. 자랑스럽게도 KAIST 연구진들이 낸 논문입니다. 이 논문의 Main coutribution이 뭐냐면, 우리가 이제까지 봐왔던 Detection 문제를 좀 다른 문제로 바꿔서 풀었다는 거죠. 여태는 어떤 네모를 만들어내고, 그 네모를 분류하는 느낌이었는데, 여기서는 네모의 크기를 바꾸는 문제로 바꿨습니다. "Cast an object detection problem as an iterative calssification problem" 우리가 물체를 찾는 것을, 어떤 바운딩 박스의 크기를 순차적으로 바꿔서, 바뀐 바운딩 박스의 크기가, 결과적으로 이미지의 물체와 만나게되도록 한다. 라는 거죠. 이게 되려면, 이미지 속에 물체가 하나 있다는 가정이 필요합니다. 당연히 뭐 2개 이상 있으면 바운딩 박스가 연속적으로 움직이다가 혼동이 오겠죠. 그래서 어느정도 한계가 있긴 합니다만, 실제로, Single object detection 문제에서는 state-of-the-art 를 기록했던 알고리즘입니다. 

 "Proposed a novel detection method, which estimates an exact bounding box by aggregating weak predictions", 이 새로운 방법론은 Exact bounding box 를 얻어낼 수 있습니다. 기존의 R-CNN은 여러 Bounding box를 생성해서 거기서 좋은걸 찾는다는 느낌이어서, 미세한 조절은 힘들었는데, 이 알고리즘은 박스가 연속적으로 움직이면서 탐색하니까, 더 정확한 바운딩 박스를 얻어낼 수 있습니다.

 "Dose not seperate object proposal, classifiers, post bounding box regressions", 앞에서 이 3가지 모듈을 나눴던 것을 생각하면, 이번 알고리즘은 그런거 안나누고 바운딩 박스만 움직여서 정확한 위치를 찾는 문제로 바꿨습니다.

 "State-of-the-art on single class object detection tasks", 단일 물체 디텍션 문제에서는 최고였습니다.

 이미지가 들어가면, Resize를 한 다음에, Conv 통과시키면 Output이 10개가 나오는데 이걸 5(Top Left) / 5(Botteom Right) 로 나눕니다. 이 두개가 컨트롤러 역활을 하게되는셈인데, Top Left Bottom Right를 조금 조정했더니 좋지 않았다면 Reject, 조정 안하는거고, 조금 좋아졌다면 Detected, 그렇게 조정하는 거죠. 이걸 끝날때까지 반복하는거에요.

 본래 해당 알고리즘은 단일 물체를 찾기 위해 만들어졌다보니, Multiple detection을 위해서는 조금 흐름이 지저분해집니다. 한 이미지에 3명의 사람이 있었다면, 해당 사람들의 초기 바운딩 박스를 설정하고, 이 값들을 합병한 뒤, 조금 사이즈를 키워서, 모델에 학습시켜 최적의 값으로 찾아가고, 다시 최종적으로 합병하는 이런 방식을 사용합니다.

 여담으로 원래 이 방법론은 이미지 대회에 나가서 1등을 하고 이런 걸 목표로 만들어진게 아니라, 오로지 하나의 물체가 정확히 어디있는지 파악하기 위해 만들어졌었다고 합니다.

 이제 YOLO, You Only Look Once. 이게 되게 멋지죠. 기존 Detection의 단점은 여러 개의 바운딩 박스를 만들고, 다시 CNN에 들어가는 거죠. 그런데 얘는, 그런게 없어요. 그냥 End to end 처럼 이미지 넣으면, 바운딩 박스가 나와요. 깔끔하죠. YOLO는 그래서, 굉장히 빠릅니다. 성능 자체는 R-CNN과 비슷한데 실시간으로 가능할 정도로 빨라요. 이 모델은 이미지를 넣으면, 이미지 속 물체가 무엇인지에 대한 Classification과, Bounding box의 위치를, 동시에 찾습니다.

 자 과정을 보죠. 이미지가 들어가면 이걸 뭐 예를들어 7x7 Feature map으로 변환합니다. Maxpooling 등을 적용하면 할 수 있겠죠. 그럼 이 7x7의 각 픽셀마다, Bounding box를 두(=B) 개씩 배당합니다. 그리고 각각의 Box는 Class probabilites를 갖습니다. 이 때, 각각의 Bounding box는 Box의 위치 정보를 위해 x,y,width,height값과 해당 Box를 쓸지 안쓸지에 대한 conf값을 저장합니다. 그리고 Class prob이 얼마나 좋은지에 대한 정보는 각 Cell에 들어있겠죠. 

 이렇게, YOLO는 Multiple bounding box per grid cell을 예측합니다. 그래서 Loss도, center pos loss, width and height loss, confidence loss, class prob loss가 있죠.

 그럼 이런 모델의 한계는 뭘까요?

 "Each grid cell can predict only B(=2) bounding boxes and one class probability" (7x7중에서) 각각의 그리드 셀은 2개의 Bounding box를 활용하니까, 한 셀 안에 여러 물체가 있다면, 이런건 잡기가 힘들겠죠. 너무 작은 것들.

 "Uses relatively coarse features" 굵직한 특성들만을 사용하다보니까, Bounding box의 위치가 정확하지 않을 수 있고,

 "Loss function treats errors in small Bounding box and big Bounding box equally" Loss function이 큰 박스와 작은 박스를 똑같이 보니까, 실제 적용과는 별개로, 점수를 매길 때는 별로 좋지않다는 겁니다.

 자 이제는 SSD: Single Shot MultiBox Detector. 이건 YOLO와 R-CNN을 합친 겁니다. Sing shot이라는 건, YOLO에서 가져온 개념인데, No object proposals. 바운딩 박스를 잔뜩 만들어내지 않겠다. MultiBox는 There exists a set of default boxes over different aspect ratios and scales. R-CNN에서 Anchors를 만들어 냈던 개념입니다. 이건 7FPS의 R-CCNN, 45FPS의 YOLO를 넘어 59FPS를 달성합니다. 재밌는건 다음 논문에서 YOLO가 더 빠른걸 만들었어요. SSD의 개념을 채용해서.

 쨋든, SSD의 핵심이 뭐냐면, 1. predicting category scroes(YOLO) and box offsets sfor a fixed set of default boxes(anchors in Faster R-CNN), 2. from each cell of multiple convolutional feature 입니다.

 짜집기 했다는게 아니라, 좋은 컨셉을 잘 믹스했다는 말입니다. 1. The size of an input image is different. YOLO는 Input size를 448x448으로 했던 것에 비해, SSD는 300x300이에요. 아마 속도를 빠르게 하기 위해 선별한 값 같습니다. 2. SSD uses multiple feature maps. 어떤 Image가 들어가면, 다양한 스케일을 갖는 Feature map을 활용하게 됩니다. 3. While YOLO outputs box positions, SSD outputs box offsets of six default boxes. YOLO가 박스를 처음부터 찾아 갔던 것에 비해, SSD는 디폴트 박스를 주고 offset을 찾아가는 방법을 채택했습니다. 당연히 이게 더 빠를 수 밖에 없겠죠. 그래서 YOLOv2에서는 offset을 찾습니다.

 이제 YOLO9000: Better, Faster, Stronger 입니다. SSD를 이기기 위해 어떤 테크닉을 썼던 점들을 보시면 좋을 것 같습니다. 그전에 Precision과 Recall을 떠올려봅시다. Precision은, 내가 참이라고 예측한 경우 중에서 실제로도 참인 것의 비율이고, Recall은, 실제 참인 경우 중에서 내가 참이라고 예측한 것의 비율이었죠. 예를 하나 들어봅시다. 암환자를 분류해야되는데, 전체 환자가 100에 실제 암환자가 50입니다. 내가 모든 환자(100)를 암환자)라고 예측해버리면, Precision은 50/100=0.5지만, Recall은 볼것도없이 1이겠죠. 100%. 암을 맞추고 싶은데 모두 암이라고 해버렸으니. 그러니까 결국 Recall이라는 건, 내가 얼마나 자주 값을 부르는가 에 의존하는 문제입니다. 내가 박스를 미친듯이 많이 뽑으면 당연히 실제 바운딩 박스가 걸릴 수 밖에 없어요. 그런데 YOLO는 7x7로 나누고 각 픽셀당 2개 박스를 만드니까 98개 박스밖에 안만들어요. R-CNN은 2000개를 뽑았는데, 당연히 YOLO가 Recall이 낮겠죠. 쨋든

 Faster 라는 측면에서 들어간 테크닉은 1. BatchNormalization. 약 2% 개선. 2. High resolution. 기존의 224x224 Input size를 448x448로 바꿨더니 좋아졌답니다. 3. Anchor boxes. 원래는 Output을 그냥 뽑았는데, 바운딩 박스 사이즈를 어느정도 잡아놓고 offset을 학습시켰더니 좋아졌습니다. 4. Dimension clusters.  Anchor box size를 정할 때, 그냥 정한게 아니라, 학습 데이터에 있는 바운딩 박스들을 가져와서, 클러스터링 한 뒤 그 결과를 보고 Initial size를 정했습니다. 5. Location prediction. 박스의 위치를 예측하는 대신에, box offset과 scale을 예측하죠 여기서는. 6. Fine grained Features. 이건 최종적으로 나온 Feature map(이미 어느정도의 정보가 사리진)만을 사용하는게 아니라, 그 앞단의 Feature map도 함께 사용했다는 말입니다. 7. Multi-Scale Training. YOLO가 Conv와 Pooling을 활용해 만들어졌기 때문에, 다양한 Size의 Input을 사용할 수 있다는 말입니다.

 Stronger 라는 측면에서는 1. Hierarchical classification. 

이런 식으로 하나의 이미지에 대해 여러 개의 계층 라벨을 달아 주는 거죠. YOLO9000은 9000개의 라벨을 학습시켜서 YOLO9000이라는 이름이 붙었습니다. 이상입니다.