첫째날에 읽어보았지만 머리가 너무 아파서 둘째날인 2023.01.13(금)에 논문 리뷰를 적어보려고 한다. 최대한 내가 이해할 수 있는 수준에서 요약을 해보겠다. 오늘 해당 논문을 scholar.google.com에 검색을 해보니, 진짜 엄청나게 인용이 많이 된 논문이었다. 오늘 기준 30982회나 인용되었다. 간만에 논문을 읽다보니 눈이랑 머리가 아파서 좀 힘들었는데, 이 숫자를 보고 나니 꽤 꼼꼼히 읽어봐야겠다는 생각이 들었다. 가보자고!!
해당 논문의 요약 부분인데, YOLO는 object detection에 쓰이고 기존의 모델들과는 다르게 regression problem으로 한번에 end-to-end로 물체 검출을 해낸다고 한다. 입력한 사진 내에서 모델은 bounding boxes를 predict하고 각각의 물체의 class probabilities를 한번의 evaluation으로 결론낸다고 한다. 한글로 쓸 수 있으나, 기존의 늬앙스랑 내가 오번역할 경우가 있을 수 있기 때문에 그냥 영어로 적는 거는 양해 부탁바란다.
45fps 수준의 영상을 수행할 수 있으며 Fast YOLO는 150fps 수준의 영상까지 수행할 수 있다고 한다. 다른 detecting model보다 두 배 수준의 mAP를 유지하면서 검출해낼 수 있다고 한다. 기존의 다른 방법들에서는 DPM, R-CNN 등을 예술작품 같은 다른 영역에서 YOLO가 더 우세하게 검출해낸다고 한다.
mAP는 mean Average Precision의 약자로 정확도를 의미한다. 이걸 이해하기 위해서는 Precision과 더불어 Recall에 대해서도 알아야 한다. 이 주제만으로 글을 하나 작성할 수 있을 거 같은데, 여기서 간단하게 정리를 해보고자 한다. 아래 그림을 봐보자.
이 그림을 살펴보면 색이 채워져 있는 점들은 실제로 참인 값이고 색이 없는 점들은 거짓인 값들이다. 가운데 있는 커다란 동그라미 안에 들어있는 점들은 모델이 positive하다고 평가한 값들이다. 이때 우리는 모델이 얼마나 정확하게 이 값들을 평가했는지 알고 싶은 것이다. 이때 사용되는 값들이 Precision과 Recall 값이다.
Precision은 정확도로 해당 그림과 같다. 모델이 평가한 값들 중 맞는 값의 비율을 나타낸다.
Recall은 검출율을 의미한다. 모델이 옳게 평가해야하는 값들 중 맞게 평가한 값의 비율을 나타낸다.
이 개념들로부터 파생되는 여러 다른 개념들도 존재한다. 우선 F1 Score이다. 정확도와 검출율을 동시에 다룰 수 있는 값이다. 높을수록 좋을 것 같다. 아직 감은 안 온다. 대신, 여태까지 모델을 학습시킬때 해당 값을 많이 봤었는데 드디어 이 값의 의미를 알게 되었다.
다음으로는 Precision-Recall 곡선, PR 곡선이다. 일반적으로 정확도(precision)와 검출율(recall)은 반비례 관계를 지닌다고 한다. 이를 이해하기 위해서는 표를 하나 살펴봐야 한다.
여기서 TP는 True Positive, FP는 False Positive이다. 그리고 Confidence는 모델이 해당 값이 Positive하다고 생각한 확률이라고 생각할 수 있다. 여기서 Confidence의 값을 조정해나가면서 Precsion값과 Recall값을 도출해내보겠다.
confidence: 90% | precision: 1/1= 1.0 | recall: 1/15= 0.067
confidence:85% | precision: 2/2= 1.0 | recall: 2/15= 0.13
confidence:10% | precision: 7/10= 0.7 | recall: 7/15= 0.47
얘네들의 관계를 그래프로 나타내면 다음과 같은 형식이 도출된다.
하지만 PR 그래프는 하나의 성능을 전반적으로 파악하기에는 좋으나 서로 다른 두 알고리즘에 대해 성능을 정략적(quantitavely) 비교하기에 불편하다고 한다. 그래서 나온 개념이 Average Precision인데 이 값이 높을수록 알고리즘의 성능이 좋은 것이다. 이 값은 위의 그래프의 면적을 구하면 되는데 편의를 위해 사선은 다 직선으로 바꿔서 면적을 구해준다.
mAP(mean Average Precision)는 물체 클래스가 여러 개인 경우 각 클래스당 AP를 구한 후 클래스의 개수로 나눠줌으로써 알고리즘의 성능을 평가하는 수치이다.
이런 식으로 빨간 그래프의 면적이 AP 값이다. 해당 그래프의 면적의 값은 AP = 왼쪽 큰 사각형의 넓이 + 중간 작은 사각형의 넓이 + 오른쪽 작은 사각형의 넓이 = 1 0.33 + 0.86 (0.4-0.33) + 0.77 * (0.46 - 0.4) = 0.4364
이 논문을 읽다보면 IoU라는 표현이 자주 나오는데 이거에 대한 간략한 설명을 먼저 해보려고 한다.
아래 그림에 다음과 같이 빨간 바운더리 박스를 지정했고 모델이 초록색 바운더리 박스를 지정을 했다고 가정하자.
이때의 모델이 얼마나 박스를 잘 결정했는 지 평가하기 위해 나온 수치가 IoU인 것이다. 합집합의 면적 분의 중첩된 면적이 IoU 값이다. 영어 말 그대로인 것이다. TP(True Positive), FP(False Positive)를 결정짓는 임계값을 설정해서 기준을 설정하면 된다.
서론이 길었고 이제 YOLO에 대해 알아보자. 기존의 방식 중 최근 방식이라는 R-CNN은 region proposal method를 사용해 먼저 잠재적 bounding box를 만들고, 이후에 그 box에 대해 분류를 진행한다. 분류를 하고 나면, post-processing(후처리)을 통해 bounding-box를 정제하고 중복된 영역은 삭제하고 box를 다시 점수 매긴다. 이 방식은 과정이 복잡하고 각각의 요소들을 개별적으로 훈련시켜야 하기 때문에 느리고 최적화하기 어렵다고 한다.
이와 반대로 YOLO는 하나의 Convolutional Network가 연속적으로 bounding box와 그것의 분류까지 진행한다. 이렇게 한번의 순전파로 검출을 하는데, 이렇게 진행할 경우 엄청나게 빠르게, 그리고 사진 전체적인 문맥을 고려하면서 detection을 진행하게 된다. 대신에 매우 빠른 대신에 정확도가 조금은 모자르다고 한다.
YOLO는 하나의 네트워크와 사진 전체의 feature를 사용하고 동시에 모든 bounding box들을 만들고 또 분류한다. 처음에 input image를 S x S grid로 나누고 각 그리드 안의 물체에 대해 검출을 진행한다. 각각의 grid cell은 B개의 bounding boxes와 confidence를 도출한다. Confidence는 box안에 물체가 들어 있다는 확신의 정도와 얼마나 정확하다고 생각하는지 나타내는 지표이다. 값은 Pr(Obj) x IOU 이다.
논문에서는 PASCAL VOC를 YOLO로 평가했는데 이때 S=7, B=2, 20개의 클래스가 존재하므로 C=20, 7 x 7 x 30 tensor를 final prediction으로 가진다고 한다.
YOLO 모델은 GoogLeNet Model에서 영감을 받아 24개의 convolutional layers와 2개의 fully connected layers와 1x1 reduction layers와 3x3 convolutional layer를 가진다고 한다. Fast YOLO는 24개가 아닌 9개의 layer를 사용한다고 한다. 난 그림을 봐도 어떻게 dimension 계산이 이뤄지는지 아직 이해를 잘 못하겠다. 교수님께 물어봐보면 되려나? ㅎㅎ
위의 모델을 ImageNet 1000-class competition dataset을 사용해 약 일주일간 훈련을 시켰다고 한다. 먼저 첫 20개의 convolutional layer들을 pretraining했다고 한다. 20개의 layer 뒤에는 average-pooling layer와 fully connected layer를 덧붙힌다고 했다. 그렇게 해서 ImageNet2012 validation set에서 GoogLeNet model과 비슷한 수준이 88% accuracy를 도달했다고 한다. 학습을 완료한 모델을 detection을 수행하도록 수정을 진행해야 한다고 한다. Convolutional layer와 connected layer를 더하면 검출하는데 모델 성능이 증가한다고 하여 4개의 convolutional layer와 fully-connected layer 2개를 붙이고 (randomly initialized weights) detection은 해상도가 높을수록 좋으므로 input resolution을 224 x 224에서 448 x 448로 증가시켰다고 한다. 마지막 layer에는 class probability랑 bounding box coordinate를 예측하는데, 우선은 bounding box의 넓이와 높이를 이미지의 넓이와 높이에 대해 정규화시키고, 각 bounding box의 좌표들을 특정 grid cell에 대해 기준화 시켜준다. 해당 layer의 activation function은 leaky ReLu이고 sum-squared error를 Loss function으로 사용해준다고 한다. 이유는 최적화가 쉽기 때문이라고 한다.
다만, 해당 함수로는 average precision, 즉 평균 정확도를 높이는데 도움이 그리 되지 못한다고 한다. Localization error과 classification error의 영향력이 동일하기 때문이다. 또한 만약 grid cell 안에 물체가 없다고 판단할 경우 해당 grid cell의 confidence score이 0에 가까워지는데, 이는 물체가 있는 grid cell의 confidence score이 강화되는 듯한 효과를 가져온다고 한다. 이를 보완하기 위해 해당 모델에서, loss from bounding box coordinate prediction은 증가시키고 loss from confidence predictions for boxes that don't contain objects는 감소시켜야 한다. λcoord and λnoobj라는 두 개의 parameter를 사용하는데, λcoord=5, λnoobj=0.5로 이를 보완한다.
또한 Sum-squared error는 large box와 small box에서의 error를 동일하게 여기는데, 작은 box일수록 coordinate가 세밀해야한다. 이를 보완하기 위해 모델은 bounding box의 직접적인 width, height가 아닌 width와 height의 제곱근 값을 도출해낸다. 제곱근 값끼리는 값의 차이가 더 작기 때문에, 작은 값의 width와 height를 가진 사각형이 큰 값의 width와 height를 가진 사각형과 그리 큰 차이를 지니지 않게 된다.
예측을 할때에는 grid cell에 여러개의 bounding box를 도출해내는데, 훈련을 할 때에는 하나의 bounding box predictor가 하나의 물체를 검출하는데 responsible하도록 한다. 가장 높은 IoU를 지닌 bounding box를 토대로 classification을 진행하고 그러면서 bounding box predictor끼리의 성능이 증가하게 된다. 크기, 비율, 분류, 검출율 등이 증가하게 된다.
위의 내용들을 모두 다 적용했을 때의 loss function은 다음과 같은 모양이다.
약 135 epoch만큼 진행하고 learning rate은 10^-3에서 10^-2까지 초반에 천천히 올리고 75 epoch까지는 10^-2, 이후 10^-3으로 30 epoch, 그리고 마지막 30 epoch는 10^-4의 크기로 진행한다. drop out layer는 rate=0.5로 진행하고 data augmentation은 20%만큼의 크기 scaling과 HSV color space에서 1.5만큼 exposure과 saturation을 무작위로 수정하면서 진행하였다.
YOLO 모델은 PASCAL VOC dataset에서 이미지당 98개의 bounding box를 예측해냈고 한번의 계산 이후에 결과가 도출되므로 굉장히 빠르다고 볼 수 있다. 다만 단점으로는 물체가 grid cell 안에 정확히 들어와 있으면 문제가 없는데, 겹칠 경우 검출이 잘 안될 수 있다는 거였다. 이거의 해결으로는 Non-maximal suppression (NMS)가 있다. 이 방법을 적용할 경우 2-3%의 mAP의 증가가 있었다고 한다.
하나의 grid cell 안에 bounding box의 수를 2개로 설정했기 때문에 YOLO는 작은 물체를 검출하는데 어려움을 겪는다고 한다. bounding box 내에서 물체를 예측하도록 학습 받았기 때문에, 조잡한 특징들로 물체를 검출할 수 밖에 없다. 그렇게 되니, 새로운 환경이나 다른 모습의 같은 물체를 검출할 때 어려움이 있다고 한다. 그리고 마지막으로는 또, 큰 상자와 작은 상자 간의 error이 같게 반영이 되는 점인데, 작은 상자일수록 error에 더 민감해야 한다. 하지만, 현재의 loss function에서는 이게 미미하게 반영이 된다고 한다. 이의 원인은 incorrect localization, 즉 bounding box를 잘못 그리는 것이라고 한다. 당연한 말이긴한데 말이다.
Deformable parts model (DPM)
DPM은 sliding window를 사용한다. 비연속적인 pipeline을 사용해서 정적 특징, 지역의 분류 그리고 bounding box를 예측해낸다. YOLO보다 느리다.
R-CNN
R-CNN은 sliding window 대신 region proposals를 사용하여 Selective Search를 진행한다. 각 region에서 potential bounding box를 생성해내고 convolutional network가 특징을 추출핸고 SVM이 평가를 하고 linear model이 bounding box를 수정하고, non-max suppression이 중복된 상자들을 지워준다. 각각의 과정은 개별적으로 tuning 즉 역전파(?)가 일어나야하고, 또 계산이 느려 이미지당 40초가 걸린다고 한다. YOLO는 grid cell당 공간적 제약(spatial constraints)가 있어 같은 물체에 대한 중복된 검출을 완화시켜줄수 있고 훨씬 더 적은 bounding box들을 도출한다. 또한 계산이 한번에 이뤄진다는 장점이 존재한다.
Other Fast Detectors
Fast와 Faster R-CNN은 computation sharing과 Selective Search 대신 neural network를 사용하여 속도를 올리긴 했으나, 실시간으로 사용하기엔 무리가 존재한다고 한다.
Deep Multibox
하나의 물체를 검출하는데 쓰이므로 YOLO에 비해 부족하다.
OverFeat.
Sliding window 형식으로, convolutional network를 통해 이를 잘 수행한다. 그래서 localization은 잘 해내지만, 전체적인 문맥이 반영되지 못하므로 detection은 잘 되지 못한다.
MultiGrasp.
YOLO의 grid로 나누는 접근이 여기서 나왔는데, MultiGrasp는 물체가 들어있을법한 하나의 region만 도출해낸다. bounding box의 크기, 위치, 비율, 그리고 classification은 전혀 수행하지 않는다.
가장 빠른 YOLO로는 Fast YOLO가 있는데 무려 52.7%의 mAP이고 그냥 YOLO는 63.4%이다.
대략 이런 결과고 너무 세세한 내용들이라 중요하다고 생각하는거 몇가지만 다뤄보자면, YOLO의 경우 background mistake이 적은 대신 mAP값이 좀 작다. Fast R-CNN은 localization을 잘하는 대신, backgroud error가 많다. 그렇기 때문에 이 둘을 합쳐서 사용하기도 한다. 이 둘을 어떻게 합치는 과정을 ensemble이라고 한다. 다른 R-CNN과 비교했을 때보다 YOLO를 합칠 경우 mAP의 증가가 크다.
그 이유는 YOLO의 연산이 워낙 빨라 test time에 실수를 많이 하게 되는데 이는 Fast R-CNN의 성능에 큰 영향을 주기 때문이라고 한다. 이 부분이 이해가 잘 안됐다. ㅎㅎ;; 그리고 또, YOLO와 Fast R-CNN은 동시에 돌리는게 아니고 각자 돌린 다음에 합쳐 성능 향상을 이끌어 냈다는데, 이 부분도 이해가 안됐다. 어떻게 그럼 합친거지? 싶다.
굳이 이렇게 따로 해야하나 싶었는데, 결론을 얘기하자면, YOLO가 예술작품에서 사람을 검출하는데 현존하는 (state-of-art) 모델들 중 성능이 가장 뛰어났다. YOLO를 비롯한 R-CNN, DPM을 언급하는데, 굳이 여기서 언급은 하지 않겠다. 그래프는 다음과 같다.
웹켐에 연결해서 사용할 수 있다는 걸 언급하는 섹션이었다. 사진이 흥미로우니 이것 또한 붙이겠다.
YOLO에 대한 정리를 간단하게 하자면, 하나의 통합된 모델로 full image로 학습이 가능하고 classifier-based approach와 달리 loss function에 의존하여 학습이 이뤄지기 때문에 모델 학습이 직접적이고 빠르다고 한다. YOLO의 빠른 속도는 실시간 object detection을 가능하게 하며, 비교적 새로운 환경 (ex artwork)에서 빠르고 그리고 비교적 탄탄하게 검출을 해낼 수 있다고 한다.
어제 한번 읽었던 논문을 다시 정리해보니 내용이 더 잘 들어왔고 YOLO가 엄청 빠르고 훈련하기 비교적 간단하다는 걸 알게 됐다. 그리고 Precision, Recall, AP, mAP, IoU 등 새로운 용어들을 잘 숙지하고 정리하고 읽어보니, 내용이 이해하기 훨씬 수월해졌고 앞으로 이런 모델을 사용해서 학습하는 시간이 아주 약간은 기대가 된다. ㅋㅎㅎ
Redmon, Joseph, et al. "You only look once: Unified, real-time object detection." Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.
이 글을 작성하고 좀 아래 추천되는 글 좀 보다가 나와 같은 논문을 리뷰한 것 같은 사람의 글을 보게 되었다. 나보다 정리도 더 깔끔하고 구현도 제대로 완료하셔서 나중에 참고하고자 좌표 남기겠다 ㅎ
https://velog.io/@minkyu4506/YOLO-v1-%EB%A6%AC%EB%B7%B0-%EC%BD%94%EB%93%9C-%EA%B5%AC%ED%98%84tensorflow2