본문 바로가기

IT/Paper

[Deeplearning] Yolov3: An Incremental Improvement

이번 포스팅은 Yolo v3 논문에 대해서 리뷰하도록 하겠습니다.


1. The Deal


YOLO v3는 다른 사람들의 아이디어들을 차용한 내용입니다. 

1-1. Bounding Box Prediction


YOLO 9000에서의 Box coordinate prediction은 다음과 같은 방식으로 계산됩니다.


기존의 YOLO 9000은 Anchor Box와 Reference Center Point의 Shift값인 을 예측하고, 값을 구해서 L2 LOSS를 통해서 학습을 시켰는데, 이에 대한 컨셉을 변경해서 위의 기존 식을 inverse해서 다이렉트로 값들의 L1 LOSS값을 구하겠다고 합니다. 아마 아래와 같은 방식으로 기존의 BOX GT를 inverse해서 L1 LOSS를 구해서 학습을 진행한 것 같습니다.


개인적인 생각으로는 학습할 때, 예측된 값을 기존 공식에 넣어서 학습하게 되면 L2 LOSS가 역전파가 되면서 logistic의 제곱꼴이 나오기 때문에 학습에 부정적인 영향을 끼칠 것이라고 생각해서 오히려 GT값을 해당 식의 inverse값으로 추정해서 L1 LOSS를 사용하게 되면 학습이 더 잘될 것 같다는 생각이 깔려있는 것 같습니다.





YOLO v3에서는 각각의 예측된 box마다 objectness에 대한 점수를 logistic regression을 사용해서 구합니다. 만약 예측된 어떤 box가 다른 box들보다 IOU가 높다면 해당 값은 1이 되어야합니다. 만약 box의 IOU가 제일 좋은 것은 아니지만 특정한 threshold보단 높다면 Faster R-CNN의 방법을 사용해서 그냥 무시해버리게 됩니다. 


YOLO v3는 IOU threshold값을 0.5를 사용하고, faster R-CNN과는 다르게 하나의 box에 하나의 GT box를 할당합니다. 만약에 box가 GT에 할당되지 않는다면, 좌표 및 클래스 예측에 손실을 주진 않고, Objectness에 대한 손실 값만 적용하게 됩니다.


자세한건 Faster R-CNN 논문을 살펴봐야 알겠지만, 이미 리뷰가 되어있는 블로그들을 찾아보다 보니까 박진우님의 블로그 [분석] Faster R-CNN을 보면 RPNs는 특정 anchor가 GT와 IOU가 0.7보다 크다면 positive, IOU가 0.3보다 작으면 non-positive label이 할당, 그 외의 구간에서는 IOU가 제일 큰 anchor box를 positive로 잡는데,  YOLOv3는 positive anchor label은 GT와의 IOU 0.5가 크면 positive로 label을 하고, 그 이하의 값들은 다 무시하고 Objectness에 대한 손실값만 적용하는 것 같습니다.



2-1. Class Prediction


각각의 box는 box에 대한 클래스 예측을 multi-label classification을 하게 되는데, 여기서 YOLO v3 저자는 softmax를 사용하는게 성능면에서 좋지 않기 때문에 그냥 logistic classifier를 사용하자고 합니다. 따라서 실제 classification 학습시 loss는 binary cross-entropy를 사용합니다. 이런 방식은 조금 더 복잡한 Domain에서의 Classification으로 Detection문제를 해결할 경우에 도움이 되는데, 예를 들면 Google의 Open Image Dataset같은 경우는 label들이 많이 겹치게 됩니다(사람 & 여자) 이런 경우에 Softmax를 사용하게 되면, 이렇게 사람 & 여자의 경우에는 mutually exclusive하지 않기 때문에 문제가 됩니다. 따라서 이런 경우에는 model을 multilabel 방식으로 접근하는게 더 좋은 접근 방법입니다.


2-3. Predictions Across Scales


YOLO v3는 3개의 다른 스케일의 box들을 예측합니다. YOLO v3는 feature pyramid network의 컨셉과 유사한 방식으로 다양한 스케일에서 feature들을 추출하게 됩니다.  기본적인 feature extractor에서 몇개의 convolutional layer만 추가하면 됩니다. 결국 최종적으로 3-d tensor를 출력값으로 얻게 되는데, 여기에는 box에 대한 정보와, objectness, class에 대한 정보가 있습니다. COCO dataset에서 실험할 때를 이야기해보자면 각 스케일에서 3개의 box를 예측하게 되므로 N x N x [3*(4+1+80)]의 형태로 출력됩니다. N은 feature tensor의 gird 갯수이고, 3개는 anchor box의 개수 (4+1+80)은 4개의 box shift and scaling value, 1개의 objectness score, 80개의 class 정보가 되게됩니다. 그 다음으로 이전 2번째 layer에서 feature map을 가지고 와서 2배로 upscaling하고, 제일 앞단의 feature map을 가져와 둘을 concatenation을 사용해서 upsampled된 feature map과 합치게 됩니다. 이렇게 되면 의미 있는 semantic information을 이전 layer의 feature map으로 얻을 수 있고, finer-grained information을 제일 앞단의 feature map으로 부터 얻을 수 있습니다. 합쳐진 feature map을 사용하기 위해서(process) 몇개의 convolutional layer를 추가합니다. 결국엔 size는 2배지만 유사한 tensor를 예측할 수 있게 됩니다. 

저자는 최종의 scale값을 위해서 같은 디자인의 모델에서 한번 이상의 box값을 예측하게 됩니다. 따라서 3가지 멀티 스케일의 fine-grained feature를 이용한 box예측이라는 benefit을 얻게 됩니다. 

YOLO v3는 여전히 k-means을 이용한 anchor box dimension clustering을 하게 됩니다. YOLO v3에서는 9개의 cluster를 사용해서 3개의 scale에 대해서 임의로 anchor box dimension을 할당하게 됩니다. COCO dataset의 경우에는 다음과 같은 9개의 cluster를 사용합니다. (10×13),(16×30),(33×23),(30×61),(62×45),(59× 119),(116 × 90),(156 × 198),(373 × 326)


2-4. Feature Extractor


YOLO v3에서는 feature extraction을 위한 새로운 network 모델을 사용합니다. YOLO v2와 Darknet-19 그리고 newfangled residual network를 hybrid하게 사용했습니다. YOLO v3의 feature extractor는 3x3과 1x1 convolutional layer를 성공적으로 적용했지만, shortcut connection으로 인해서 네트워크 자체가 많이 커졌습니다. 총 53개의 Convolutional Layer가 존재하고, 이렇게 새로운 Classification 모델을 Darknet-53이라고 하겠다고 합니다. 제안한 새로운 네트워크는 기존 Darknet-19모델보다 강력하지만 resNet-101이나 resNet-152보다는 조금 더 효율적입니다.  Darknet-53은 Train과 Test가 동일한 설정으로 셋팅되며, 256x256의 single crop으로 테스트됩니다. Titan X에서 256x256크기를 갖는 네트워크의 Run-Time을 측정했을 때, Accuracy는 비교된 대조 네트워크와 동등하지만, floating point operation은 더 적고 속도는 더 빠르게됩니다. 정확하게 Darknet-53은 ResNet-101보다는 1.5배 빠르고, ResNet-152와 성능은 비슷하면서 2배 이상의 성능을 보여줍니다. Darknet-53은 floating point operation/second에서 최고의 성능을 달성했습니다. 즉, 이는 network 구조가 GPU 활용을 잘한다는 의미가 됩니다. 대부분의 ResNet 계열은 많은 Layer들이 존재하지만 효율적이지 못합니다. 각 네트워크는 네트워크 구조와 Classificaiton 성능의 결과는 아래와 같습니다. 


 

 


 

2-5. Training


YOLO v3는 negative mining이나 기타 다른 방법을 전혀 사용하지 않고, Full Images를 사용하게 됩니다. 다만 multi-scale training, 많은 data의 augmentation, batch normalization 외의 기타 여러가지 방법들을 사용합니다. 실험 환경은 OpenSource인 Darknet Framework에서 수행했습니다.

3. How We Do


YOLO v3는 꽤 좋습니다. YOLO v3는 COCO의 이상한 mAP metric 기준으로 했을 때, SSD의 변형과는 성능이 비슷하면서 3배 정도 빠르고, RetinaNet보다는 성능이 조금 떨어지게 됩니다. 하지만 기존의 detection metric인 하는  를 사용하게 되면 YOLO v3는 굉장히 강력해집니다. 를 사용할 경우, 성능은  RetinaNet과 비슷해지면서 SSD의 변형보다는 훨씬 좋은 성능을 보여주게됩니다. 이는 YOLO v3가 object에 대한 box를 찾는 강력한 detector라는 것을 의미하지만, IOU threshold가 증가하면 성능이 급격하게 떨어지며 YOLO v3는 Object의 box와 완벽하게 정렬되는 것을 위해서 고군분투하게 됩니다. 과거 YOLO v1의 경우에는 작은 물체를 찾기 위해서 고군분투했다면 지금은 그러한 트렌드가 역전되었다고 생각합니다. 새로운 multi-scale 예측으로 인해서 굉장히 높은 성능을 나타내지만 여전히 중간이나 큰 크기의 object를 찾는 성능보단 떨어집니다. 해당 문제를 끝까지 해결하려면 조금 더 많은 실험 및 연구를 진행해야할 것 같다고 합니다. metirc에 대해서 accuracy vs speed를 plotting하게 되면 YOLO v3가 꾀나 detection system에 중대한 이점(빠르고 더 나아진 부분)  을 줬다고 합니다. 


 



4. Things We Tried That Didn't Work


YOLO v3를 개발하면더 많은 것들을 시도했었는데, 많은 부분들이 기대했던 바와 작동하지 않았습니다. 해당 세션은 그에 대한 이야기를 하려고 합니다.


4-1. Anchor box x,y offset predictions


linear activation을 사용해서 다양한 box의 width, height의 x,y offset을 일반적인 anchor box예측 메카니즘을 사용해서 해결하려고했는데 이러한 방식은 model의 안정성을 떨어뜨리면서 잘 작동하지 않았다고 합니다.


4-2. Linear x,y predictions instead of logistic


logistic activation대신 linear activation을 사용해서 다이렉트로 x,y의 offset값을 예측하려고 했지만 몇 포인트 정도의 mAP 성능을 떨어뜨렸습니다.


4-3. Focal loss


focal loss를 사용해봤지만 2 point의 mAP를 떨어뜨렸습니다. 이미 focal loss 문제에 대해서 강인하게끔 학습하게되는 YOLO v3는 자체적으로 이를 해결하려고 노력합니다. 왜냐면 특별하게 objectness prediction과 conditional class prediction을 분리하기 때문입니다. 그래서 대부분의 데이터셋에서 class prediction으로 부터 loss가 생기지 않을거라고 생각하는데, 이부분은 완벽하게 확신할 순 없었습니다.


Focal loss는 RetinaNet[Forcal Loss for Dense Object Detection]의 핵심 내용입니다. 저는 김홍배님의 Slide를 참고했습니다. 핵심은 Detection 시스템에서 background라는 클래스를 따로 학습시켜주는 경우가 있는거 같은데, 이렇게 클래스를 background를 두게 되면, 한장의 이미지에서 Object가 있는 영역보다 없는 영역이 커지게 되다보니까 굉장히 큰 class unbalance가 생기게 됩니다. 그럴 경우에 실제 Object가 있는 경우를 학습시키기 어려운 hard sample, Background 클래스의 경우는 학습시키기 쉬운 easy sample이다라고 생각을 해서 기존에 Class Loss로 사용하던 Cross-Entropy를 hard sample과 easy sample에 따른 loss를 다르게 줄 수 있게 설계한 Focal Loss라는 걸 도입하게 됩니다. 


학습을 하고있는데, Background는 금방 학습이 되서 학습 도중에도 Background 영역은 높은 class score를 나타낼 것이고, 학습 중 만약 Background class가 0.9일 경우에 감마값을 2로 가정하고 Focal Loss를 적용하게 되면 기존에 Cross-Entropy를 사용했을 때, 보다 훨씬 작은 Loss값을 나타내게 되고, 그렇지 않은 Object의 Class 경우에는 상대적인 큰값을 갖게 됩니다. 


그런데 YOLO의 기본 LOSS는 아래과 같은데, 기존 YOLO LOSS는 Background시, Object시의 Loss를 분할해서 주고있고, Class에 Background로 넣어주는게 아니라, Objectness score라는 부분을 따로 뽑고있기 때문에, 저자는 YOLO에 Focal Loss를 주는거 자체가 확신은 없지만, 큰 의미는 없을거라고 생각하는거 같습니다.



4-4. Dual IOU thresholds and truth assignment


Faster R-CNN은 학습하는 동안 2가지 IOU threshold값을 사용하는데, 만약 예측된 값이 GT와의 IOU값을 0.7이라면 이는 [0.3, ~0.7]로 셋팅된 값으로 인해 positive example이 되고, GT와의 IOU값이 0.3보다 작게되면 이는 negative example로 무시되게 됩니다. 우리는 이러한 방식과 유사한 방식을 적용했지만 좋은 결과를 보진 못했습니다. 우리가 이미 설정한 formulation은 local optima에 근사한 것처럼 보여 꽤나 좋다고 생각합니다. 이러한 생각은 이러한 테크닉이 결과적으로는 좋은 결과를 내기 때문에 근거가 된다고 생각하고 아마도 거기에는 학습하면서 안정성을 찾기위한 몇가지 튜닝이 필요하다고 생각합니다.

5. What This All Means


YOLOv3는 빠르고 정확하다는 관점에서 좋은 detector입니다. 몰론 COCO의 metric기준으로는 그렇게 좋은 편은 아니지만 기존의 IOU 0.5기반으로 하는 평가 방법으로는 굉장히 좋습니다. 왜 그래도 기존의 metric을 전환했는지에 대해서는 COCO 논문에 언급되어있는데, evaluation server가 완성 되면 평가 metric에 대한 전체 논의 사항이 추가될 것이라고 합니다. Russakovsky et al에서 사람들을 IOU가 0.3이고 0.5인거에 대한지에 대해서 학습을 시켜봤을 때, 사람들은 놀랍게도 이를 잘 해내지 못했다고 합니다. 따라서 사람은 IOU를 0.3~0,5를 구분하는게 어렵다고 리포팅을 했고 만약 사람들이 이게 어렵다라고 했을 때, 이게 무엇을 의미하고 무엇이 문제인 걸까요?

더 나은 질문은 우리가 이러한 detector system으로 무엇을 할건지에 대해서 크게 변경되지 않을까 라고 합니다. 여기서 저자는 인공지능에서 특히 vision system에서 많은 사람들(Google이나 Facebook)는 여러가지에 대해서 연구를 진행하고있는데. 이러한 연구를 통해서 좋은 기술이 획득하고 명확하게 우리들은 우리들의 개인적인 정보가 이에 의해 수집되고 판매되길 원하지 않을 것이라고합니다. Vision System에 대해서 투자하거나 깊게 공부하는 사람들은 개발된 기술을 통해서 사람을 죽이거나, 끔찍한 짓을 하는데 이러한 기술이 사용되는 것을 원하진 않을 것이지만 최근 이러한 부분들에 대해서 의심가는 정황들이 많습니다. 연구자들은 이러한 기술 연구 개발에 대해서 이러한 윤리적인 책임이 있으니 이에대한 것을 완화하고 더 나은 방향으로 갈 수 있도록 고려해야하는 책임이 있다고 이야기합니다.

6. Rebuttal


해당 세션에는 레딧이나 트위터 및 메일 등에서 언급되었던 몇가지 이야기에 대한 저자의 반박 내용을 적어놨습니다.


먼저 저자는 논문에 언급 된 그래프의 이상한 위치로부터 지적을 많이 받은 것 같습니다. 그에 대해서 저자는 해당 말이 틀린 말은 아니지만 이러한 내용에 대해서 생각해보라고 내용을 던지게 됩니다. 어차피 현 상황에서의 Detection System은 2~3%의 mAP 향상에 대해서 이야기하고 있다는 사실을 깨달아야하고, 그래프를 어떻게 표현하냐에 따라서 그래프가 확연히 다를 수 있다는 것을 다음과 같은 그래프로 던집니다.


왼쪽의 그래프를 봤을 때, YOLO v3는 다른 Detection System들과의 Run-Time이 크게 차이나는 것 처럼 안보일 수 있지만 Run-TIME을 FPS로 표기하게 되면 엄청난 차이가 일어나는 것 처럼 표기될 수 있습니다. 실제로 실 사용을 위해 시스템에 적용했을 때, FPS의 증가는 체감상 극단적으로 나타날 수 있고, 저자는 YOLO 시스템 자체가 accuracy가 비슷하다고 해서 해당 System에 대해서 별 차이 없다고 느낄 수 있는 부분을 반박한 것 처럼 보입니다.






두번째는 COCO metric에 대해서 논리적으로 너무 약하다고 언급한 내용에 대해서는 논문 쓰면서 자기 논문을 정당화하는 논리를 찾아야해야한다는 점을 이야기하면서 다시한번 COCO metric의 기준에 대해서 언급합니다. VOC PASCAL은 GT로 표기하는 label 자체가 부정확하기 때문에 IOU를 낮게 잡았는데, COCO의 label이 VOC PASCAL FORMAT보다 더 좋다라는 근거가 있냐고 이야기합니다. COCO DataSet이 모든 DataSet에 대해서 Semantic Segmentation label이 있기 때문에 그럴 수도 있다고 이야기하면서 그저 논문의 정당화가 부족했기 때문이라고 이야기합니다. 하지만 COCO metric이 bounding box에 대해서 강조하는데, 저자는 bounding box를 강조하는 것을 통해서 다른 부분(Classification)에 대해서 약하게 보는게 맞는거냐고 의문을 던집니다. 극단적인 예를 들어 2가지 시스템이 다음과 같은 결과를 냈을 때, COCO에서는 평가결과가 둘다 좋다고 이야기하지만 실은 그렇지 않은 것 아니냐고 이야기합니다.  또한 mAP 측정은 각 class별로 측정하기 때문에 이미 엉망이 됬다고 생각한다고 합니다.


이미 mAP(mean average precision)이라는 개념은 있는데 COCO의 metric은 똑같이 mAP로 할거냐고 물어보기도 합니다.


따라서 YOLO저자는 실세계에서 사람들이 원하는 object에 대한 image를 주고 이에 대해서 클래스에 대한 AP를 제거하고 전체 평균 AP를 측정하는 것이 어떻냐고 합니다. 저자는 이러한 바보같은 metric에 맞춰서 YOLO를 개선시키고 싶진 않다고합니다. 차라리 box가 아닌 segmentation을 사용한다면 거기에는 수용하겠다고 합니다.