Deep Learning study

You Only Look Once: Unified, Real-Time Object Detection (YOLO) 본문

AI/papers

You Only Look Once: Unified, Real-Time Object Detection (YOLO)

HwaniL.choi 2018. 5. 10. 15:35
반응형


You Only Look Once: Unified, Real-Time Object Detection


오늘 정리할 것은 YOLO ~ 


YOLO 는 you only live once 라는 말로 잘 알고 있을 것 이지만, 여기서는 you only look once ! 


뛰어난 작명 센스 ...


기존의 R-CNN에서는 region proposal 을 따로 찾고 bounding box 를 찾고 class 분류를 했다. 그러므로 region proposal 과정에서의 오버헤드가 컸기 때문에 성능향상에 어려움이 있었다.


하지만 YOLO는 grid방식을 이용하여 region proposal 의 오버헤드를 없앴다. grid 방식을 사용하면 그 grid cell 하나하나가 proposal 이 되기 때문에 오버헤드가 없어지는 것이다. 당연하게 속도측면에서 많은 향상을 이루어냈다.



위의 그림에서 보는것과 같이 input을 7*7 grid 로 나누게 된다.  (아마 YOLOv2에서는 13*13이였던것 같다.)


그다음 YOLO네트워크를 통과하면 2가지의 정보를 담아 출력하게 되는데 한가지는 bounding box와 confidence(object가 있는지 없는지의 확률)이고 다른 하나는 각 grid cell의 proposal 이 어떤 class를 담고 있는지를 갖게 된다.


중간의 위쪽그림이 각 grid cell 에서 제안한 bounding box의 정보들이다. 하나의 grid cell에서 2개의 bounding box를 예측하게 되어서 총 98(7*7 * 2)개의 bounding box 들이 있게된다.


중간의 아래쪽그림은 각 grid cell에서 제안한 bounding box가 어떤 class 에 속하는지에 대한 정보를 담고있는것을 보여주는 것이다. (클래스별로 해당하는 색이 정해져있고, 그것을 bounding box를 그려줄때 사용한다. )


그렇게해서 맨 오른쪽의 output이 나오게 되는 것 이다.



YOLO의 네트워크 구조이다. 이것을 보아하니 왜 you only look once 인지 알것 같다. 이전에 다른 모델들과는 다르게 하나의 네트워크 경로를 통해서 end-to-end로 학습이 되도록 이루어져 있다.


구조를 보면 input으로 RGB이미지가 들어가고 24개의 conv레이어를 거치고 2개의 FC레이어가 붙어있다. (conv 레이어는 ImageNet classification 데이터로 pretrain 시켰다고 한다. 후에 detection을 위한 네트워크로 바꾸었다.)


마지막의 output은 reshape을 통해 7 * 7 * 30 으로 나오게 된다. 이제 이 Tensor에 위에서 말한 모든 정보들이 다 담겨있는 것이다. bounding box에한 정보, confidence에대한 정보, 그리고 각 bounding box에 있는 object가 어떤 class에 속할지의 확률값이 들어있다.


제일 궁금했던 것인데 이 자료에서 정말 잘 설명해 주고있다. 하나씩 살펴보도록 하자.



output을 7*7 의 30 개의 channel을 가진 텐서로 만들었을때 이미 감을 잡았을 것이다.  7*7로 만든 이유는 7*7 grid에 대한 정보를 얻기 위함이다. 그러면 이제 30개의 channel들은 무엇을 의미하는지 알아보도록 하자.


처음 5개의 channel에는 해당 grid cell에서 제안한 첫번째 bounding box에대한 정보를 담고있다. 

차례대로 bounding box의 중점 위치에대한 정보 2개(x값, y값), bounding box의 가로, 세로 길이, 마지막으로 confidence의 값이 들어있다. 

노란색 박스가 현재의 grid cell에서 예측한 첫번째 bounding box 가 되는것이다.


마찬가지로 다음 5개의 channel에는 해당 grid cell에서 제안한 두번째의 bounding box에대한 정보를 가지고 있을 것이다.


다음엔 해당 영역들이 각 20개의 class에 속할 확률값들에 대한 정보를 가지고 있다. 이것은 조건부 확률이 되는데 bounding box에 object가 있을때의 object의 class 에대한 확률이다.


그렇다면 이제 object가 존재한다면 각각의 bounding box에 대한 class score들을 계산 할 수 있을것이다. 


각 bounding box들의 class score들은 bounding box의 confidence와 class score를 곱해준다. object가 있을 확률인 confidence가 낮아지게 된다면 당연히 class score들도 낮아지게 될것이다.


이렇게 해서 나온 class score들은 총 98개가 된다.


한 grid cell 당 bounding box를 2개씩 예측하므로 7 * 7 * 2 = 98 이다.



이런식으로 하나의 gird cell에서 2개의 bounding box에대한 class score들을 뽑아 낼 수 있다. 



짠! 이렇게 끝까지 쭉 다 뽑아내면 총 98개의 bounding box들에대한 class score표가 나온다.



그다음에는 score가 0.2 보다 작은 것들은 모두 0으로 만들어준다. score가 매우 낮기때문에 해당사항 없다고 생각하는 것이다. 그리고 난 후에는 내림차순 정렬을하고 NMS(non maximal supression) 을 사용하여 중복되는 bounding box들을 제거하고 하나만의 bounding box만을 남긴다. 


NMS가 어떻게 수행되는지에 대해서도 알아보자.



모든 bounding box의 class score에서 제일 위에있는 class인 개에대한 것들만 보자.


위에서 내림차순 정렬을 했기때문에 가장 왼쪽에는 가장 높은 값이 오게된다. 개일 확률이 가장 높다고하는 bounding box는 주황색 박스가 된다.







이런식으로 차례대로 해당하는 bounding box가 있다. 그러면 많은 bounding box들을 걸러내 보도록 한다.



가장 높은 score에 해당하는 bounding box를 bbox_max라고 하고, 그 다음의 차례대로 볼 score에 해당하는 bounding box들을 bbox_cur이라고 한다. 


bbox_maxbbox_cur의 IoU(intersection over union, 그냥 겹치는 부분의 비율이다.)가 0.5보다 크다면 bbox_cur의 score를 0으로 만들어 버린다. 


반 이상이 겹치니까 서로 같은 object를 가리키고 있다고 보는것이다. 



반대로 , bbox_maxbbox_cur의 IoU가 0.5보다 작다면 그대로 두고 진행하게 된다. 왜냐하면 겹치는 비율이 작기 때문에 또다른 object(개)가 있을 수 있다고 생각하기 때문이다.


그다음에는 다음 0이아닌 score를 가진 bounding box를 bbox_max로 잡고 똑같이 iteration을 돌린다.


이런 작업들을 모든 class에 대해서 수행을 한다.



그러면 이제 최종의 bounding box를 걸러내기 위해서 위와같은 작업을 하게 된다. 위의 NMS작업을 마친 각각의 bounding box의 class score에서 가장 높은 score를 가진 class만을 뽑아내게 된다. 그 max score가 0보다 크다면 해당 class의 색으로 bounding box를 그려주고 , 0보다 작게 된다면 해당 bounding box는 버린다.



그러고나면 이렇게 최종적인 결과물이 나오게 된다.


그뒤의 논문 내용인 loss function, limitation, comparison 등은 논문을 보면 더 자세히 나와있을거다.



정리를 마치면서, 정말 재미있는 주제고 흥미로운 연구인것같다. 또한 이러한 접근방식은 나에겐 무진장 새로운것 같다.  다음엔 YOLOv2인가.. 아. mask R-CNN이라는것도 있던데 이것도 한번 봐야겠다. 


그전에 이것도 구현을 해봐야 하는데 , 몇개 찾아서 다른분들이 작성한 코드를 보았는데 꽤나 어려운것같다 ㅠ . 여튼 해보긴 해봐야지 


그럼 이만.



Reference


[1] You Only Look Once: Unified, Real-Time Object Detection(Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi)

[2] https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.g137784ab86_4_2923

[3] YOLO CVPR 2016

[4] https://blog.naver.com/sogangori/220993971883

반응형
Comments