안녕하세요 pulluper 입니다.
이번 포스팅에서는 2020년 arXiv에 발표된 yolo v4 에 대하여 알아보겠습니다. 🤩
https://arxiv.org/abs/2004.10934
yolo v4는 매우 실험적인 논문입니다.
다양한 당시의 최신 딥러닝 기법들을 이용해
yolo 디텍션의 성능과 효율성을 높이는 방법을 제안합니다.
본 포스팅에서는 yolo v3를 기준으로 yolo v4까지 업그레이드를 할 때
개인적으로 효과가 있었던 부분을 중심으로 알아보겠습니다.
포스팅은 크게 Paper 리뷰와 Yolo v3로부터의 구현 부분으로 나누겠습니다.
Paper 리뷰
논문은 최신 뉴럴넷의 학습이 많은 gpu와 mini-batch가 필요하고 실시간이 아니라는 문제가 있으며
이를 해결 하기 위해 자신들의 yolo v4를 제안합니다.
기존의 gpu(1080 ti, 2080 ti 등) 으로 빠른 학습과 state of the art의 성능을 낸다 주장합니다.
이후 Related work에서 기존의 detection들을 상세히 설명하고
Bag-of-Freebies 와 Bag-of-Specials 를 설명합니다.
그 내용은 다음과 같습니다.
Bag of Freebies : inference 시간은 늘리지 않지만 성능을 올리는 방법들
Bag-of-Specials : inference 시간이 조금 늘지만 성능을 대폭 올리는 방법들
생각을 조금 해 보면
inference 때 시간을 늘리지 않는 방법(BOF)은 학습때만 영향을주는 데이터 증강, 스케쥴러, 로스, 등.. 일 것이고
inference 때 시간을 늘리는 방법(BOS)은 대부분 모델에 관련된 부분 혹은 후처리 부분일 것입니다.
이후 Methodology에서 자신들이 사용할 방법들을 열심히 설명합니다.
그래서 최종적으로 YOLO v4는 다음과 같은 구성을 갖네요.
그리고 이를 기준으로 실험 부분에서 열심히 실험을 합니다.
인상 깊었던 점은 이 모든 실험은 1개의 GPU에서 이루어 졌다고 합니다.
실험에서 먼저 BOF 와 BOS에서 중요한 요소들을 뽑기 위해 Ablation Study를 합니다.
Ablation Study of Bag-of-Freebies
이 실험에서 성능을 높이는 방법은 S, M, IT, GA, OA 입니다.
S: Sensitivity (Eliminate grid sensitivity)
그리드 민감성을 없애는 방법(?) 입니다. 다음 그림을 보면 yolo 의 할당방법을 볼 수 있게 됩니다.
b는 GT box, C는 cell 혹은 grid의 좌상점, P는 anchor box 입니다.
그런데, 만약 물체가 특정 그리드에 딱 맞는다고 가정해 봅시다. 그러면, Cx, Cy = 0 or 1 에 가깝게 됩니다.
이러한 상황에서 sigmoid(tx) 가 가지는 값도 0 혹은 1에 가까워야 합니다.
즉 sigmoid(tx)가 1 혹은 0에 가깝게 mapping이 될 때, 학습되는 |tx| 의 값이 너무커지기 때문에
모델의 불안정성을 야기합니다. 이를 해결하기 위해서 sigmoid(tx) 값 앞에 1보다 큰 특정 값을 곱합니다.
c.f.) 참고로 YOLO v5에서는 할당식을 다음과 같이 변경합니다.
c.f.)
가령 그냥 곱하는 것 보다.
다음 그래프에서 빨간색은 y = 1 / (1 + e ^ -x),
파란색은 y = 1 / (1 + e ^ {(2) * -x})
즉, 더 0, 1 로 잘 갈수 있을수 있습니다.
M: Mosaic data augmentation
모자이크 데이터 증강 : 이는 다음 그림과 같이 각 4개의 이미지를
붙여서 하나의 이미지를 만드는 이미지 증강 방법입니다.
IT: IoU Threshold
이것은 제가 YOLO v3를 리뷰하면서 강조했었던 YOLO의 정신이라고 하며(....) 강조했던 내용이었는데
YOLO v4에서는 object 마다 다수의 anchor 를 할당하였습니다. 즉, 다음 그림을 보시겠습니다.
왼쪽그림처럼 하나의 물체에 하나의 anchor를 할당하지 않고
오른쪽 그림과 같이 하나의 물체에 특정 threshold 를 넘는 anchor를
모두 할당하는 방법을 사용하였습니다. 이것이 IT 입니다.
GA: generic algorithm (hyperparameter setting)
GA는 하이퍼 파라미터를 정할 때, 더 좋은 성능을 내기 위해서 유전 알고리즘으로 최적의 값을 찾는 방법 입니다.
OA: Optimized Anchors
resolution, dataset 마다 최적화된 anchor 를 만들어 사용하는 방법입니다.
요렇게 BoF를 이용하면, COCO test dev 기준으로 42.4 mAP를 달성합니다.
Ablation Study of Bag-of-Specials
이번에는 BoS를 이용하여, 어떤 구조의 모델이 가장 성능이 좋은지 판단합니다.
여기서는 CSP + PA + SPP + SAM 이 가장 좋습니다.
그런데, 다음 실험이 여러 다른 setting의 backbone weight 에 대한 실험인데
이때는 맨 위의 CSP + PA + SPP 의 설정을 따릅니다. ( 왜 가장 좋은 성능을 안했을까요? )
Ablation of Different pre-trained backbone weight
여러 다른 backbone weight 들 중 마지막 설정과 mish 활성화 함수를 쓴 성능이 가장 좋았고,
이제 본격적으로 다른 디텍션들과 비교 하기 시작합니다.
최종적으로 YOLO v4에 사용된 BOF와 BOF는 다음과 같습니다.
Bag of Freebies : [Sensitivity, Mosaic, CIoU Loss, GA, OA]
Bag of Specials : [CSPDarknet53, SPP, PAN, D-IOU NMS, Mish]
당시 가장 성능이 좋았던 EfficientDet 보다 더 효율적이고 좋은 성능을 보입니다. :)
네 논문에 리뷰는 여기까지고 이제 구현 및 실험 부분을 보겠습니다.
기본 베이스라인은 구현한 YOLO v3을 이용하였습니다.
이후 BoF, BoS등을 추가해 나간 결과는 다음과 같습니다.
1. CSP 추가 - mAP : 38.0 (+7.0)
2. gIoU loss 추가 - mAP : 39.8 (+8.8)
3. Cosine Annealing 추가 - mAP : 40.3 (+9.3)
4. Mosaic Augmentation 추가 - mAP : 41.0 (+10.0)
IT도 추가를 했는데, 오히려 성능이 떨어지는 모습을 보였습니다. ㅜㅜ
실험적으로 CSP + gIoU + M + CA 의 성능이 논문의 성능과 비슷하게 나왔습니다. !
다른 BoF, BoS 등도 더 추가실험을 하고 code는 refactoring 예정입니다.
실제 구현은 다음 깃헙을 참고하시면 감사하겠습니다.
↓ 구현 코드 ↓
https://github.com/csm-kr/YOLOv4_pytorch
네 오늘은 YOLO v4에 대하여 알아 보았습니다!
질문이나 토론은 언제나 환영합니다! 감사합니다. 🥰🥰🥰
'Object Detection > YOLO Detection' 카테고리의 다른 글
[Object Detection] YOLO v3 논문리뷰 및 코드구현 (8) | 2021.04.19 |
---|---|
[Object Detection] YOLO v2 논문리뷰 및 코드구현(CVPR2017) (8) | 2020.07.16 |
댓글