[논문 리뷰] YOLOv4
YOLOv4: Optimal Speed and Accuracy of Object Detection
YOLOv4를 사용한 Mask Detection
darknet을 활용해 구글 크롤링 이미지로 마스크 착용 여부를 판별해주는 모델을 구축하는 것까지 테스트 해봤습니다.
Mask Detection
YOLO는 You Only Look Once의 약자로 이미지를 한 번 보는 것만으로도 Object의 종류와 위치를 추측하는 딥러닝 기반의 물체 인식 알고리즘입니다. 이미지를 한 번만 본다는게 어떤 뜻일까요?
- R-CNN
대표적인 Object Detection 방법인 R-CNN의 학습 방법은 다음과 같습니다.
- 이미지에 대한 후보 영역(region proposal) 약 2000개를 생성합니다.
- 이 후보 영역을 wrap/crop 방법을 통해 고정된 크기로 맞춘 후 CNN을 통과시킵니다.
- YOLO
하지만 YOLO는 region proposal과 같이 이미지를 나누지 않고 CNN에 단 한 번 통과시킵니다. 이를 두고 이미지를 한 번만 본다고 표현합니다. 또 한 번 보기 때문에 속도가 빠릅니다.
실제로 MS-COCO 데이터 기준 FPS를 보면 그 차이가 더 확실하게 보여집니다.
Fast R-CNN | Faster R-CNN | YOLOv1 | YOLOv5 | |
---|---|---|---|---|
FPS | 0.5 | 5 | 45 | 140 |
그럼 본론으로 들어가서 Object Detection 중 최고의 속도를 보이는 YOLOv4 논문 리뷰를 시작하겠습니다.
1. Introduction
Introduction에서는 다른 신경망과 YOLOv4가 다른 점을 소개하고 있다. 논문에서 제시한 요약 3가지는 다음과 같습니다.
- We develope an efficient and powerful object detection model. It makes everyone can use a 1080 Ti or 2080 Ti GPU to train a super fast and accurate object detector.
효율적이고 강력한 object detection model을 개발했다. 이 모델은 단 한 개의 1080 Ti나 2080 Ti로도 매우 빠르고 정확한 object detector 학습이 가능하게 한다. - We verify the influence of state-of-the-art Bag-of-Freebies and Bag-of-Specials methods of object detection during the detector training.
모델 훈련동안에 object detection의 최첨단 BoF와 BoS 방법의 영향을 증명한다. - We modify state-of-the-art methods and make them more efficient and suitable for single GPU training, including CBN. PAN, SAM, etc.
최신기술을 수정하여 single GPU에서 CBN, PAN, SAM을 포함하여 학습하기에 더 효율적이고 적합하게 만든다.
2. Related work
2.1 Object detection models
Object Detection 분야의 연구는 R-CNN을 시작으로 많은 연구가 진행되고 있습니다. 그리고 대표적인 구조로 논문에서는 아래의 구조를 제시하고 있습니다.
구조는 크게 Backbone/Neck/Head 3가지로 구분됩니다. (1) Backbone Backbone은 input image를 feature map으로 변형하는 부분입니다.
(2) Neck Neck은 Backbone과 Head를 연결하는 부분입니다. Feature map을 정제(Refinement), 재구성(Reconfiguration)한다고 생각하면 될 것 같습니다.
(3) Head(Dense / Sparse Prediction) Head는 Backbone에서 추출한 feature map의 location 작업이 이뤄지는 곳으로 Predict classes와 bounding boxes 작업이 이뤄집니다. Head는 크게 두가지로 구분되는데 Dense Prediction과 Sparse Prediction입니다.
Dense Prediction에서는 Predict와 Bounding boxes가 함께 작업이 되고, Sparse Prediction에서는 Predict와 Bounding Boxes가 구분되어 작업됩니다. 이때 Dense Prediction이 Head일 경우 Architecture 전체를 One-Stage Detector, Sparse Prediction이 Head일 경우 Two-Stage Detector가 됩니다.
2.2 Bag of Freebies & 2.3 Bag of Specials
2.2절에서 2.3절까지는 BoF와 BoS의 기초적인 설명이라고 보면 될 것 같습니다.
BoF는 inference cost의 변화 없이 성능 향상을 꾀할 수 있는 딥러닝 기법입니다. 대표적으로 데이터 증강(CutMix, Mosaic 등)과 BBox(Bounding Box) Regression의 손실 함수(IOU loss, CIOU loss 등)이 있습니다.
BOS는 BOF의 반대로 inference cost가 조금 상승하지만 성능 향상이 되는 딥러닝 기법입니다. 대표적으로 enhance receptive filed(SPP, ASPP,RFB), feature integration(skip-connection, hyper-column, Bi-FPN) 그리고 최적의 activation function(P-ReLU, ReLU, Mish 등)이 있습니다.
3. Methodology
3.1 Selection of architecture & 3.2 Selection of BoF and BoS & 3.3 Additional improvements
3.1절에서 3.3절까지는 YOLOv4 모델 구성 선택 과정에 대한 설명입니다. 3.4의 YOLOv4의 구성 요소만을 참고하면 될 것 같습니다.
3.4 YOLOv4
YOLOv4의 구성은 Backbone에 CSPDarknet53, Neck에 SPP와 PANet, Head부분에는 YOLOv3(anchor based)을 사용했습니다. 논문에 의하면 SPP는 additional module, PANet은 path-aggregation neck이라고 표현하고 있습니다.
YOLOv4에서 사용된 방법들은 다음과 같습니다.
Backbone에 사용된 BoF(Bag of Freebies)는 CutMix 방법과 Mosaic 방법의 data augmentation과 DropBlock regularization 방법, Class label smoothing 방법이 사용되었습니다.
Backbone에 사용된 BoS(Bag of Specials)는 Mish activation과 Cross-stage partial connections(CSP), Multi-input weighted residual connections(MiWRC)가 사용되었습니다.
Detector(Head) 부분에 사용된 BoF는 CIoU-loss, CmBN(Cross mini-Batch Normalization), DropBlock regularization 방법과 Mosaic data augmentation 방법, Self-Adversarial Training, Eliminate grid sensitivity, Using multiple anchors for a single ground truth, Cosine annealing scheduler, Optimal hyper-parameters, Random training shapes가 사용되었습니다.
Detector(Head) 부분에 사용된 BoS는 Mish activation, SPP-block, SAM-block, PAN path-aggregation block, DIoU-NMS 방법이 사용되었습니다.
사용된 BoF와 BoS의 종류가 너무 많아서 공부가 많이 필요할 것 같습니다… 사실 모두 공부하는 것은 어렵고 몇몇만 공부해봤습니다.
1) Backbone
Backbone으로는 CSPDarknet53이 사용되었습니다. CSPDarknet은 CSPDensenet의 Densenet자리에 Darknet구조를 사용한 것입니다. 그럼 기존 Densenet과 CSPDensenet의 차이는 무엇일까요?
Densenet과 CSPDensenet의 차이는 그림에서도 보이듯이 input 부분과 output부분을 보면 알 수 있습니다. 기존 Densenet은 input인 x0 전체를 Dense Block에서 처리하고 결과를 Transition Layer에서 conv로 변환합니다. 하지만 CSPDensenet은 input인 x0를 x0’과 x0’‘으로 나눠 x0’‘은 기존 Densenet과 같은 방식으로 Dense Block에서 처리하지만 x0’는 Dense Block을 거치지 않고 바로 Transition Layer로 가 x0’‘의 결과와 병합한 후 conv로 변환합니다. 따라서 전체를 처리하지 않기 때문에 앞에 Partial을 붙여 Partial Dense Block, Partial Transition Layer라고 부릅니다.
이러한 방법은 Weight 갱신 시 다른 Layer의 기울기 정보가 중복되는 것을 방지합니다. 또 input size가 감소하면서 Dense Block에서 처리한 inference cost와 Memory cost가 감소합니다.
- BoF for backbone
(1) CutMix data augmentation
(2) Mosaic data augmentation
(3) DropBlock regularization
(4) Class label smoothing
- BoS for backbone
(1) Mish activation
(2) Multi-input weighted residual connections(MiWRC)
2) Neck
(1) SPP
(2) PAN
3) Head
YOLOv3
작성중
댓글남기기