1 stage Object Detection 모델 정리하는 곳. (~2018)
(1) Yolo
https://arxiv.org/pdf/1506.02640.pdf
1stage 모델의 시작, YOLO(You Only Look Once)다.
이전까지 R-CNN의 variation으로 진화되오던 OD는, 2 stage 모델이어서 속도가 느려 real-time에선 object detection에 한계가 있었다.
YOLO는 이러한 2stage OD의 구조를 깨고, 하나의 stage만으로 task를 가능케 하였다. 어느정도의 정확도를 조금 포기하고, 대신 빠른 속도를 얻은 것이다.
최초의 YOLO의 구조는 다음과 같다.
기존의 2-stage 모델은 Region Proposal 단계, Classification/Regression 단계로 2번의 단계를 거쳤다. YOLO는 앞의 Region Proposal단계를 없애고 하나의 단계로 수행하도록 하였다. 아예 모든 image 범위에 대해서 bbox 확률을 계산한 것이다.
위 그림을 보면, image를 S x S 개의 grid로 우선 나눈다. 그리고 각 grid마다 B개(논문에선 2개)씩의 bbox를 예측하도록 하였다. bbox 예측은 5개의 값으로 예측하도록 했는데, (x,y,w,h,C)로 중앙점과 가로세로 길이, C는 confidence이다.
여기서 말하는 confidence란 해당 bbox내에 object가 정말 있는지에 대한 확률로(어떤 블로그에선 신뢰도라고 해석했다. 좋은 의역인듯), 논문에선 아래와 같이 object가 존재할 확률 x ground truth과의 IoU로써 계산한다.
각 grid는 B개 bbox에 더해 각 class마다 grid내 object의 class 확률도 계산하는데(아래 수식), 논문에선 20개의 class만 이용하여 grid당 20개의 확률을 예측하도록 했다.
최종적으로 YOLO가 예측하는 것의 dimension은 S x S x (B * 5 + C) 개가 된다. 논문은 7x7 grid를 사용하여 최종 output이 7x7x30이 되었다고 한다.
YOLO는 GoogLeNet의 구조를 따와, 아래와 같은 네트워크 구조를 가지며 최종 output으로 7x7x30을 뱉는다. Conv layer들은 Pretrain시킨 후, 뒤의 fc layer들을 OD에 맞게 fine-tuning했다고 한다.
여기까지 오면 의문이 들건데, 7x7x30짜리 feature로 어떻게 학습을 시킬까?
1)일반적인 loss function(SGD 같은)으로는 학습이 어려운데, 우리의 feature 내엔 localization(b x 5)와 classification(C)가 공존하기 때문에, 각각 weight을 달리 핸들링해야 하기 때문이다.
2)또한 별도의 region proposal 과정이 없기 때문에, object가 없는 grid의 수가 훨씬 많아 gradient 의 방향이 confidence를 줄이는 방향이 될 확률이 크다. 그래서 YOLO는 새로운 multi-part loss를 제안한다.
앞의 lambda 값(coord, noobj)들은 2)이유를 보정키 위함으로, coord 람다값을 보통 더 크게 준다.(논문은 5, 0.5)
우선 1obj_ij에 대해 알아야 하는데, 이는 각 grid i마다 예측한 j box들을 masking하는 것이다.
구체적으로 해석하려면, 먼저 Yolo의 prediction과정을 알아야 한다.
이전에 우리는 각 grid 마다 30 크기 vector를 구했다. 예측 시에 yolo는 각 벡터 내의 box confidence(5,10번째 값)와 class prob(11~30번째 값)을 곱하여 해당 grid의 class box를 예측 확률을 구하게 되는데, 곧 각 box당 C와 20개 class prob을 곱해 20 dim의 vector를 구하는 것이다. 이렇게 하는 이유는 앞서 수식그림에 따라 계산 값 C x class prob = Pr(Class) x IoU가 되어, 이것이 곧 box의 class 확률이 되기 때문이다.
각 grid 당 이렇게 B개의 20dim vector를 구해, 순위를 매긴 후 NMS(Non max suppression)방법을 통해 몇 가지 확률만 남기고 0으로 만들어 버린다. 이제 남은 확률값을 통해 각 grid의 box를 classification하여 그리면 끝이다.
어쨌든 다시 돌아와, 여기서 0이 되지 않았던(예측된 class가 존재하는) box들만 loss 계산에 포함시키게 되는데, 이를 masking하는 수식이 1obj_ij라고 보면 된다.
그래서 해당 box들마다 x,y,w,h,C를 L2값으로 loss 계산을 한다(LSE), 대신 w,h의 경우 small,big object의 괴리를 줄이기 위해 루트를 씌워 계산하였다.
그 다음 noobj가 들어간 부분은, 2)의 이유를 위한 것으로 예측값이 없는 box인데도 truth와 IoU가 가장 큰 box에 대해 penalty를 주기 위해 더해진다.
마지막은 box기준이 아니고, 각 grid 마다 class prob에 대한 loss를 계산하는 식이다. classfication을 위한 loss식이라 보면 될 것 같다.
언뜻 복잡하지만, 뜯어보면 의외로 간단할 것이다. 아무튼 YOLO는 아래와 같이 정확도는 2 stage보다 좀 낮지만, 아주 빠른 155의 fps를 보이며 realtime OD에 기준을 제시하였다.
그래도 정확도가 좀 낮긴한데, 이를 보완하기 위한 아이디어들이 앞으로 v2~v4로써 나온다. 처음 논문이라 빡세게 보았다.
cls,reg를 한데 모은 feature를 제안했다는 것에서 정말 신기한 논문이었다. 그런데 확실히 전체 이미지를 보다보니, 어쩌면 너무 큰 이미지에 한계가 있고, grid 간격에 많은 영향을 받을 것 같아 저런 mAP가 나온것에 어떻게 나온거지..했다. Anchor도 쓰지 않았으니 다양한 크기의 object들을 잡는데도 애로가 있을텐데. 뭐 20개로 class를 제한했으니 그런건가.. 암튼 이제 다음 버전들을 보자
(2) Yolo v2
https://arxiv.org/pdf/1612.08242.pdf
Yolov2, 혹은 Yolo9000이라 불린다. 간단히 아래 이미지를 보며 하나하나 보완점들을 체크해보자.
1) 이전의 yolo에 BN layer를 추가하여, 학습 안정성을 높여 정확도 2.4%++
2) 이전 yolo는 224x224로 pretrain(이후 448x448로 파인튜닝), 애초에 448x448로 pretrain시킴.3.7%++
3) 이전 yolo는 fc layer를 마지막에 사용, 이제 이것도 다 conv layer로 바꿈.(1x1 conv같이)
4) anchor box 사용. recall을 늘림.(mAP는 좀 떨어짐) 방식은 비슷함. yolo의 box처럼 하되 수가 수천개가 되는 것.
5) VGG16도 있었는데, GoogLeNet을 계승한 DarkNet을 만들어 사용. 정확도는 비슷하나 계산량을 대폭 줄여 속도 up
6) dimension priors: 기존 anchor dimension을 선정하는 것은 인위적으로 설정했었는데, (retinanet에서 설정한 것처럼.순서가 다르긴한데..) training set에 k-mean clustering을 사용해 dimension을 설정했다고 한다.
7) location prediction: 첫 prediction box에 따라 training의 운명이 많이 갈린다고 하는데, 이를 보완하기 위해 미리 좌표를 알맞게 보정하는 과정,
8) passthrough layer : 기존 13x13x512의 feature가 small object에 취약한 점을 보완키 위해, 26x26x512로 구한 층에서 멈춘 후 13x13x512x4로 쪼개는 passthrough층을 통해 보완함. 이 층의 계산값을 detection할 때 이용했다. fine-grained feature를 추가한다고 보면 된다.
9) multi-scale: 여러가지 해상도로 학습. (1x1 conv를 사용해서 가능)
정말 많은 보완점이 있다. 논문 뒤의 stronger라고 불리는 항목에선 WordTree를 이용해, 개라는 항목 아래의 시츄, 푸들을 학습해야 할때, detection과 classfication의 학습을 합치기 위해 hierachy를 만들어 multilabel-classification으로써 동시 training이 되도록 한 시도가 있다. 굉장히 의미있는 시도였으며, 이후 제대로 된 데이터 label을 만듦으로써 보완하였다고 한다.
Yolov2는 정말 많은 보완점, 특히 Anchor를 도입하고, 인위적 세팅 문제를 prior anchor box로 해결하고 box initialization을 location prediction으로 해결한 점은 상당히 흥미롭고, 꼭 OD뿐 아니라 다른 문제에도 적용할만한 아이디어라고 생각한다.
여기까지만 봐도 꽤나 좋은데, v3는 어떻게 더 성능을 높였을까?
(3) Yolo v3
https://arxiv.org/pdf/1804.02767.pdf
v3의 부제는 An Incremental Improvement이다. 정말 부가적인 성능 업데이트. SSD보다 같은 성능에 3배빠른 모델을 만들었다. 어떻게 가능케 했을까?
1)우선 v2와 같이 Anchor Prior box를 이용한다. 여기에 Faster R-CNN의 idea를 가져와, 각 box마다 Objectness라는 score를 계산하게 했다.(이전 yolo의 confidence인듯) 이것은 prior가 truth와 일치/overlap할 경우 1로 설정되게 하여 loss를 계산하게 하는 방식으로 가장 높은 score의 box들만 loss 계산에 포함시켰다고 한다. (좀 헷갈려서 코드를 보고 난 뒤 다시 이해해볼 것 같다.)
2)classifier를 multi-label에 맞게 bce방식, 즉 독립적인 logistic 분류기로 이용했다. 기존 ce방식보다 더 좋았다고. (여러 object의 가능성을 보다 여는 걸까. object간의 비슷한 점을 통해 좀 더 연관있게 학습한다고 생각.)
3)여러 scale에서 feature map을 만들어, 합쳐 output을 도출했다. 예로 기존의 방식에선 한 feature map이 3x3 grid당 B*(5 + C)개 였는데, 이런 feature map을 여러개 생성해 합쳐 output을 도출했다. 물론 모아서 NMS등을 할 땐 Anchor의 k-mean clustering을 활용.
4)DarkNet 네트워크도 조금 보완하여 더 좋은 성능.(DarkNet19 → DarkNet53)
이밖에 흥미로운 시도.
linear activation으로 direct하게 예측하면 값이 별로. logistic activation을 써야함.
focal loss별로. focal로 잡으려한 문제를 이미 잡아서라고 하네요. (seperate Objectness 계산, Conditional class prediction)_선택적으로 box들만 계산해서 그런가봄.
부가적으로 저자는 왜 metric을 바꿧을까라고 한다. IoU .3이 .5보다 사람이 인식하기 어렵다고 .3으로 바꿨는데, 근본적으로 왜 OD를 연구하는가에서 시작해서 뭐 군사기구에쓰이나.. 이런 말도 한다...ㅋㅋㅋㅋ 웃프다..
그래서 저자는 이런 이유보단 좀더 해피한 이유, 뭐 지나가는 고양이 수나 동물원 얼룩말 수세기(...)같은 데 쓰는. 뭐 비유가 좀 그렇지만 좀 더 행복한 이유에서 연구해야 한다는 사견을 덧붙인다. 재밌어서 옮김.
아무튼. 여기까지 2018년 OD다. 감상은 Faster R-CNN쪽을 더 공부해봐야 할듯? Yolo처럼 이쪽도 variation이 많은 것 같아서. Mask R-CNN과 함께 해볼 생각이다. v4와 mask R-CNN은 따로 문서화하도록 하겠다.
'모아 읽은 보따리 > Object Detection' 카테고리의 다른 글
2-stage Object Detection Model (R-CNN ~ FrRCNN) (0) | 2021.03.10 |
---|