[WearMask] E01. Object Detection
2021-05-31 # WearMask

Capstone Software Project



들어가기에 앞서

지난 시간에 마스크 Detector를 만들기 위해 cvlib에 있는 detect_face 모듈을 사용하고 Image Classification을 하는 2-Stage Detector를 만들어 보았었다.

그 때도 알았지만, 2-stage Detector에는 다음과 같은 문제가 있었다.


  1. 속도 측면에서 1-stage에 비해 느릴 수 밖에 없다.
  2. cvlibdetect_face모듈은 작은 얼굴을 찾지못했다.

우선 2.의 문제는 해결할 수 있는 방법이 없었다. 애초에 detector의 알고리즘을 몰랐으므로 수정할 수 있는 모델이 아니었다. 따라서, MTCNN과 같은 모듈을 사용함으로써 작은 얼굴을 감지하는 시스템을 만들려했으나 이것 또한 문제가 있었다. 바로 속도다. MTCNN모델만 통과하는데 엄청난 시간을 소요했다. (실제로 측정하진 않았지만 CPU환경에서 체감상 10배는 난 것 같았다.)

그리고 1.의 문제는 YOLO알고리즘을 알게되며 느릴 수 밖에 없다는 것을 알게 되었다. 따라서, 실시간 서비스를 만들어본다는 측면에서 FPS가 높은 YOLO 알고리즘을 채택하기로 했다.



WHAT IS YOLO?

YOLO라 하면 You Only Live Once 를 생각할 수 있지만 Object Detection에서는 다른 의미로 쓰인다.

YOLO = You Only Look Once!



위의 loss function을 이해하면 `YOLO`의 뜻을 이해하게 된다. [다크넷](https://pjreddie.com/darknet/yolo/)에 들어가보면 논문이 있으니 살펴보면 좋고 Loss function을 이해하기 위해서는 다양한 블로그 글을 살펴보는게 좋다.
  1. 논문 리뷰 - YOLO(You Only Look Once) 톺아보기

  2. You Only Look Once — 다.. 단지 한 번만 보았을 뿐이라구!

  3. [분석] YOLO

위와 같은 블로그글을 참조하면 loss function, grid-cell, anchor box의 개념 등을 찾아볼 수 있다.


Why YOLO?

YOLO를 사용하게 된 이유는 다음과 같다.


  1. Grid cell과 anchor box를 이용한다면 MTCNN과 같이 작은 얼굴을 detect하는 것이 가능해질 것이다.
  2. 높은 FPS와 적절한 mAP를 가진 YOLO모델로써 적절한 trade-off관계를 가지고 감지하는 것이 가능해질 것이다.


다크넷 홈페이지나 YOLO v3논문을 살펴보면 위와같은 그래프가 있는 것을 볼 수 있는데 여기서 주목할 점은 당시의 SOTA였던 RetinaNet에 비해 mAP와 inference time측면에서 모두 상회함을 알 수 있다.

그래서 저자가 굳이 그래프를 확장시키지 않고 그래프의 왼쪽에 점을 찍어놓은 것 같기도하다. (대부분의 논문을 읽으면 굉장히 딱딱한 어투에 재미없는 경우가 많은데 YOLO논문은 뭔가 친근한 아저씨가 써놓은듯한 글같았다.)


출처 : [4K] 대한민국거리+강남 휴일 낮 거리풍경 서울거리 강남거리


YOLO v3로 학습을 시켰을 때 결과물은 위와 같습니다.

은근히 높은 성능을 가지고 있는 것을 확인했습니다. 하지만, 위와같은 성능일 경우 1.을 해결하지 못했습니다.



위와 같은 전체적인 structure에서 <Predict one, Predict two, Predict three> 으로 총 3개의 grid cell에서 anchor box를 regression하는 것을 알 수 있습니다.

즉, layer를 통과시키면서 13x13, 26x26, 52x52grid cell에서 각각 3개의 anchor box를 regression하게 되는데 이 때 가장 작은 anchor box의 크기는 11, 21이다. 412x412사이즈에서 11,21이란 다음과 같습니다.



위와 같이 보면 충분히 작아보이지만, 우리는 보통 Threshold를 줌으로써 confidence가 0.5 이상인 것들로만 출력을 하는데 confidence가 충분히 높지 않아 위의 gif파일에서도 볼 수 있듯이 모든 얼굴들을 prediction할 수 없게 되는 것이다.

따라서 우리는 그 뒤에 레이어를 추가하면서 grid cell을 더 촘촘하게 만들고 anchor box를 더 작게 생성하여 충분히 작은 얼굴도 prediction할 수 있게 할 것입니다. (놀랍게도 AlexeyAB의 github에 가보면 yolov3 5Layer에 대한 configuration 파일이 있는 것을 확인할 수 있습니다.) (진행중)

그리고 또한 2.도 해결해야 합니다. 우선, 성능을 최대화하기 위해 5 layer로 학습을 시켜보고 차차 경량화를 진행해 나갈 것입니다.

기획하려는 프로젝트의 목표는 카페나 공공장소같이 많은 사람이 밀집해있는 환경에서의 마스크 탐지이기 때문에 대부분의 사람들의 얼굴 크기는 작을 것입니다.

또한, CCTV나 멀리서 찍을 얼굴들이기 때문에 anchor box가 373,326와 같이 큰 것들은 필요가 없습니다. 따라서, 적절한 grid cell, 적절한 anchor box를 경험적으로 확인하면서 layer수, 궁극적으로 weight params들을 줄일 것입니다.


Reference

  1. https://ctkim.tistory.com/81
  2. Joseph Redmon, Santosh Divvala, Ross Girshick, and Ali Farhadi. You only look once: Unified, real-time object detection. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR), pages 779– 788, 2016.
  3. Joseph Redmon and Ali Farhadi. YOLO9000: better, faster, stronger. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR), pages 7263– 7271, 2017
  4. Joseph Redmon and Ali Farhadi. YOLOv3: An incremental improvement. arXiv preprint arXiv:1804.02767, 2018.