[CV 논문 리뷰 스터디 / 1주차 / 최경석] You Only Look Once: Unified, Real-Time Object Detection
1) 한번만 본다!!
2)지금까지 있던 것들을 합쳤다!!
3)실시간으로 확인 가능하다!!
기존의 Object Detection System은 Classifier 모델이 Detection 기능을 수행하도록 변형된 형태였다.
YOLO는 Object Detection을 single regression task로 해결
즉, bounding box 생성과 classification을 이미지에서 바로 진행
YOLO는 End-to-End 방식의 구조로, 기존에서 2단계로 진행하던 object detectoin 과정을 한번에 진행 가능하도록 만들었다. Figure 1을 보면, 이미지가 한개의 Convolution network를 통과함에 따라 bounding box와 class probability를 동시에 출력한다.
또한, 기존의 DPM, R-CNN 기반 Object Detection 모델은 이미지 전체를 보는 것이 아니라 sliding window 혹은 bounding box를 보고 classification을 진행하기 때문에 contextual information에 대한 인식이 부족하다. YOLO는 convolution network를 사용하여 전체 이미지를 인식하여 contextual information을 반영하고 인식 성능이 향상되었다.
그럼 본격적으로, YOLO의 가장 핵심인 "Unified Detection"이라는게 무엇일까?
Unified Detection은 위에서 언급했듯이 object detection에 필요한 기능인 특징 추출, bounding box 생성, classification 과정을 한개의 model로 수행할 수 있다는 의미이다.
일단 논문의 경우에는
해당 논문에서는 7×7의 grid를 생성하였고, 각 grid 별로 2개의 bounding box, 총 20개의 class에 대한 detection 진행
--> 7*7*(2*5+20) 크기의 tensor이 결과값으로 산출됨!!
YOLO는 기본적으로 GoogLeNet의 영향을 받았는데, 3×3 Conv Layer 앞에 1×1의 reduction layer(NiN)을 추가하여 전체 연산량을 감소시켰다. (이전 layer의 feature space를 축소)
총 24개의 convolution layer과 2개의 fully connected layer로 구성되어있다.
전체 24개의 convolution layer 중 20개의 layer를 ImageNet Dataset으로 pretrain 시켰다. 그 뒤에 랜덤하게 초기화된 4개의 convolution layer과 2개의 fully connected layer를 추가시켜서 fine tuning 하였다.
또한, pretrain 과정에서는 ImageNet dataset 크기인 224×224 크기의 input을 사용하였지만, object detection의 특성상 더 높은 해상도를 필요로 하기 때문에 448×448의 input으로 network를 변형하였다.
마지막 layer에서 class probability와 bounding box를 동시에 예측하는데, bounding box의 좌표와 크기 같은 경우에는 input image size에 대해 normalize된 값으로 주어진다. 즉, 0~1 사이의 값으로 주어진다.
Activation function으로는 leaky ReLU를 사용했는데, 마지막 layer에서만 linear activation function을 사용했다.
YOLO에서는 Sum-squared error를 사용한다. 구체적으로 보자면 localization loss(bounding box 위치)와 classification loss(클래스의 정확도)가 있는데, 논문에서는 이 둘에 동일한 가중치를 부여해서 loss를 계산하는 것이 이상적이지 않다고 말하고 있다. 그러나 SSE 방식에서는 이 둘에 대해 동일한 가중치를 부여한다.
또한, S×S grid의 대부분에는 아무런 object가 없을 확률이 높고, 이러한 불균형은 모델이 학습을 진행하면서 각 grid cell들에 대해 object가 존재하지 않는다고 예측하도록 할 가능성이 높다고 말한다. 즉, 대부분의 grid cell에서는 confidence score = 0이 되도록 학습이 진행게 된다.
이를 해결하기 위해, object가 존재하는 BBox의 좌표(x,y,w,h)에 대한 가중치(λ_coord)는 높이고, object가 없는 BBox의 grid cell의 가중치(λ_noobj)는 줄이는 방법을 고안하였다. 이 방법을 통해 localization loss의 가중치를 증가시키고, object가 있는 grid cell의 가중치를 object가 없는 경우보다 증가시켰다. 즉, 위에서 언급됐던 두가지 문제를 모두 해결할 수 있다. 논문의 경우에서는 각각 5와 0.5로 설정하였다.
Sum-squared error에서는 BBox가 큰 object와 작은 object 모두에 동일한 가중치를 부여한다. 그러나 작은 BBox는 조금만 벗어나도 큰 영향을 받지만, 큰 BBox는 상대적으로 그 영향이 작다. 이를 해결하기 위해 YOLO 논문에서는 BBox의 width와 height에 square root를 사용하여 그 영향의 차이를 감쇄시킨다.
1) 1_i^obj : grid cell i 내에 객체가 존재하는지 여부
2) 1_ij^obj : grid cell i의 j번째 BBox predictor가 사용되는지 여부
Loss 식 요약
실제 논문에서 학습은 다음과 같은 방식으로 진행하였다.
YOLO는 한 grid cell에서 B개의 bounding box를 예측한다. 즉, 하나의 grid cell이 한개의 object를 인식하는데 responsible하다는 것이다. 이를 위해 Train 과정에서는 객체 1개를 하나의 BBox와 매칭 시켜야 하고, 여러 BBox 중 ground truth과의 IOU가 가장 높은 bounding box만 선택한다.
Inference 단계에서도 하나의 network로 수행하게 된다. 논문에서 사용한 파스칼 VOC 데이터 셋에 대해서 YOLO는 한 이미지 당 98(7×7×2)개의 bounding box를 예측해주고, 그 bounding box마다 class probabilities을 구해준다.
하지만 YOLO는 하나의 객체를 여러 grid cell에서 동시에 검출하는 경우가 있다는 단점이 있다. 객체의 크기가 크거나 객체가 그리드 셀 경계에 인접해 있는 경우에는 그 객체에 대한 bounding box가 여러 개 생길 수 있다.
즉, 하나의 그리드 셀이 아닌 여러 그리드 셀에서 해당 객체에 대한 bounding box를 예측할 수 있다는 의미이다. 하나의 grid cell에 하나의 object만 포함되지 않는다면 이런 문제가 발생할 수 있다. 이런 다중 검출(multiple detections) 문제는 NMS로 개선할 수 있었고, mAP를 2~3%가량 향상시켰다.
마지막에 보이는 7×7×30 크기의 Tensor은 무엇을 의미하는가??
각 BBox에 대해 class probabilities를 다 구한 이후, 내림차순으로 BBox별 class probabilities 를 나열한다.
이 중 max score를 가진 BBox를 "bbox_max"로 정의한다.
bbox_max와 그 다음 BBox인 bbox_cur 사이의 IOU가 0.5 이하이면 bbox_cur을 0으로 설정한다.
이 과정을 이후에도 나오는 bbox_cur 들에 대해 쭉 진행!!!
다 반복을 하면 그 다음에 새로운 bbox_max를 정한 다음에 같은 과정을 계속 반복!!!
이걸 모든 Class에 대해 반복!!
다 구한 이후에 각 bounding box의 class probabilities 중에서 제일 큰 값으로 class를 설정한다.
Class에 대한 score이 0보다 작으면 BBox 안그리고 skip & 0보다 크면 해당 class로 BBox 그린다.
논문에서 진행한 Experiment & 모델들과의 비교는 생략!!
끝!!
Reference
- https://www.youtube.com/watch?v=eTDcoeqj1_w
- https://velog.io/@suminwooo/Yolo-%EB%85%BC%EB%AC%B8-%EB%B0%8F-%EC%A0%95%EB%A6%AC
- https://blog.naver.com/PostView.nhn?blogId=sogangori&logNo=220993971883
댓글 영역