※ Notification
본 포스팅은 작성자가 이해한 내용을 바탕으로 작성된 글이기 때문에 틀린 부분이 있을 수 있습니다.
잘못된 부분이 있다면 댓글로 알려주시면 수정하도록 하겠습니다 :)
오늘은 Object detection 분야에서 유명한 모델인 YOLO에 대해 배웠다.
YOLO는 You Only Look Once의 약어로 당시의 다른 모델들보다 훨씬 빠른 FPS를 보여주며 등장했다.
당시에는 two-shot-detection 방식인 R-CNN(Regions with CNN)이 가장 좋은 성능을 내지만 최대 7 FPS(Frames Per Second)로 실시간 성이 매우 부족했다.
이 때 one-shot-detection 방식으로 동작하는 YOLO가 등장하여 평균 45 FPS를 보여주었고 Fast-YOLO의 경우 155 FPS을 기록하며 사람들을 놀라게 했다.
Two-shot이란 2단계에 걸쳐서 객체를 검출하는 것으로 Two-shot-detection의 선두주자인 R-CNN에 대해 알아보겠다.
R-CNN은 물체가 있을만한 공간인 Region을 각각의 CNN을 통해 feature를 추출, 최종적으로 SVM을 통해 물체가 어떤 물체인지 구별하는 것이다.
[이미지출처] Rich feature hierarchies for accurate object detection and semantic segmentation 논문
R-CNN은 2014년에 CNN을 object Detection 분야에 최초로 적용시킨 모델이며, CNN을 이용한 검출 방식이 Classification 뿐만 아닌 Object Detection 분야에도 높은 수준의 성능을 이끌어 낼 수 있다는 것을 보여준 모델이다.
위 그림에서도 볼 수 있듯이 다음과 같은 순서로 동작한다.
1. 입력 이미지를
2. Selective Search 알고리즘을 통해 2000개의 Region proposal을 추출해서
3. 이러한 2000개의 Region proposal을 순서대로 CNN 모델에 넣어주면
4. CNN 모델은 각각의 Region proposal에 대해서 classification을 수행해서 어떤 객체인지 예측을 한다.
※ Selective Search 알고리즘 : 객체와 주변 간의 색감(Color), 질감(Texture) 차이, 다른 물체에 둘러 쌓여 있는지(Enclosed) 등을 파악하여 물체의 위치를 파악하는 알고리즘
하지만 이러한 R-CNN은 이미지 한 장당 2000개의 region proposal을 추출하므로 학습 및 추론 속도가 상당히 느리다.
YOLO 연구진들은 R-CNN의 복잡한 과정을 해결하기 위해 이미지의 픽셀로부터 Bounding box의 위치(coordinates), 클래스 확률(Class probabilities)을 구하기까지의 일련의 절차를 하나의 회귀 문제로 재정의 했다.
[이미지 출처] https://youtu.be/L0tzmv--CGY
다음과 같이 입력 이미지에 대해서 물체의 위치를 나타내는 Bounding box와 Classification 작업을 동시에 수행한다.
[이미지 출처] You Only Look Once: Unified, Real-Time Object Detection 논문
YOLO는 입력 이미지를 S x S grid로 분할한다. (YOLO 논문에서는 7 x 7 grid로 분할)
이렇게 분할된 각각의 Grid cell은 B개의 Bounding box와 그 Bounding box에 대한 confidence score를 가진다.
Confidence score = Pr(Object) * IoU(truth pred)
Confidence score를 살펴보자면 해당 Grid cell에 물체가 존재할 확률인 Pr(Object)와 Bounding box에 대한 IoU를 곱한 것이다.
즉, Confidence score는 각 Bounding box에 대해 물체가 존재할 확률을 나타내는 지표이다.
[이미지 출처] https://pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/
여기서 IoU가 무엇인가 하면, Intersection over Union의 약어로 실측값(Ground truth)과 모델이 예측한 값이 얼마나 겹치는 지를 나타내는 지표이다.
IOU가 높을수록 잘 예측된 모델이라고 할 수 있다.
[이미지 출처] https://pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/
딥러닝에서 Ground-truth는 학습 데이터의 실제 값을 표현할 때 사용되는 개념으로 학습 데이터에서 주어지는 정답(label)으로 생각하면 편리하다.
이어서 설명하면, 각각의 Grid cell은 C개의 Conditional Class Probabilities를 가지는데 그 식은 다음과 같다.
Conditional Class Probabilities = Pr(|Object)
Conditional Class Probabilities는 하나의 Grid cell에 있는 Object가 어떤 Class에 속하는지를 나타내는 값으로 Bounding box의 개수와 상관없이 Grid cell 하나당 하나의 값을 구한다.
각각의 Grid cell은 B개의 Bounding box를 가지고 있으며, 각각의 Bounding box는 (x, y, w, h, Confidence score) 5개의 값으로 구성된다.
입력 이미지를 3 x 3 Grid로 나누고, 각각의 Grid cell에는 2개의 Bounding box를 가진다. 이러한 Grid cell은 3개의 물체를 분류(Classification)할 수 있다고 가정할 때, 1개의 Grid cell이 가지는 데이터 개수와, 전체 Grid cell이 가지는 데이터 개수는?
1개의 Grid cell에는 2개의 Bounding box가 있고, 3개의 Class가 있으므로 계산식은 다음과 같다.
S x S Gird, B bounding box, C Class 이므로
따라서 이다.
아래 그림은 1개의 Grid에 포함되는 데이터를 나타낸 이미지이다. (x, y)는 Bounding box의 중심점, (w, h)는 width, height, c는 Confidence score이다.
[이미지 출처] https://blog.nerdfactory.ai/2021/05/06/You-Only-Look-Once.-YOLO.html
Inference process는 학습이 끝난 모델을 이용해서 테스트 이미지가 어떤 방식으로 Bounding box가 그려진 이미지로 나오는지 분석하는 과정이다.
YOLO는 변형된 GoogleLeNet을 바탕으로, 이어지는 4개의 컨볼루션 레이어와 2개의 완전 연결 레이어를 통해 tensor를 출력한다.
즉, 각각의 Grid cell에 들어있는 2개의 Bounding box 정보와 물체의 Class 정보가 들어있는 데이터가 YOLO의 예측 결과이다.
테스트 단계에서는 20개의 Conditional class probability와 개별 Bounding box를 곱해주는데, 이를 각 Bounding box에 대한 Class-specific confidence score라고 한다.
Class specific confidence score
모든 Grid cell은 2개의 Bounding box가 있으므로 1개의 Grid cell에 대해 2개의 Class specific confidence score가 나온다.
Bounding boxes의 객체를 판단하기 위해 98개의 Bounding box의 Score가 일정 임계치 이상이면 참이라고 판단하는 경우에는 하나의 객체에 대해 여러 개의 Bounding box가 잡힐 수 있다.
따라서 한 객체에 대해 가장 신뢰도가 높은 하나의 Bounding box만 남기고 그 객체와 관련된 나머지 Bounding box를 제거하는 후 과정이 필요한데, 이 때 NMS(Non-maximum suppression) 알고리즘을 이용하면 가장 객체에 대해 가장 신뢰도가 높은 하나의 Boudnig box만 남길 수 있다.
NMS 알고리즘에 대해 간단히 설명하자면 Class에 대한 score를 정렬한 뒤 각각의 Bounding box에 대한 IoU가 0.5 이상이면 score를 0으로 변경하여 IoU가 낮은, 다시말하자면 인접하지 않은 Bounding box만 남기는 알고리즘이다.
NMS 알고리즘에 대한 자세한 내용은 아래 링크에서 확인 가능하다.
https://goo.gl/byNZTn
수업을 들을 때는 뭔가 헷갈리는 부분이 있는 느낌이었는데 블로그 정리하면서 여러 자료를 찾아보니 수업 때 들은 내용들이 정리되는 것 같았다.
하지만 내 능력이 부족해서 블로그 글로 정리하는데는 한계가 있는 것 같다. 하지만 이해한 내용을 바탕으로 최대한 정리를 해봤다.