논문 리뷰/object detection

[논문 리뷰] YOLOv7

curious_cat 2023. 7. 14. 17:32
728x90
728x90

개요

논문 링크: https://arxiv.org/abs/2207.02696

이전 글: [논문 리뷰] YOLOv6

제목: YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors

노트: YOLOv6보다 성능은 조금 안 좋다 (YOLOv6가 더 늦게 나왔다)

주요 내용:

  •  E-ELAN 구조 제안
  • 모델 사이즈를 키우는 방식 제안
  • RepConvN 블록 제안
  • Auxiliary detection head를 사용할 때 label assignment 하는 방식 제안
  • Convolotion & batch normalization 합치는 방법으로 속도 살짝 증가
  • Implicit knowledge 사용
  • 모델 EMA 사용

 

Architecture

Block structure (E-ELAN )

VoVNet

  • DenseNet같은 경우 이전 layer의 feature을 concatenate 해서 residual connection을 준다.
    • 이렇게 하면 MAC (memory access cost)이 높기 때문에 비효율적이다.
    • 또한 concatenate한 feature을 가지고 다음 layer feature을 계산하기 위해서 1x1 convolution을 통해서 channel reduction을 한 후 3x3 convolution을 사용하게 되는데, 1x1 convolution은 GPU에서 비효율적이다 (computation speed 대비 모델 성능 증가에 기여하는 정도가 낮다).
  • VoVNet에서는 feature reuse를 하기 위해서 매번 concatenation을 하지 않고 이전 feature들을 한번에 다 concatenate 한다. 따라서 MAC도 줄어들면서 (이전 feature을 매번 access 할 필요가 없고 마지막에 한 번만 access 하기 때문에), 각 layer 사이에 1x1 convolution도 없어진다 (마지막에 concatenate 하기 전까지 각 layer의 channel 수가 같아서 channel reduction을 매번 할 필요가 없다). 

CSPVoVNet

 

ELAN

  • 최소 gradient path의 depth를 줄여서 neural net의 학습이 더 잘되도록 한다 (최소 gradient path의 depth가 너무 깊으면 학습이 어려워진다) (https://arxiv.org/abs/2211.04800).
  • 이것을 "stack in computational block"을 통해서 하는데, 밑에 그림에서 (c)의 cross stage 쪽으로 gradient 깊이가 (d)에서 cross stage 쪽으로  gradient 깊이보다 얕다. 그 이유는 computational block에 바로 cross stage merge를 해버리기 때문이다. 

  • 이러한 아이디어를 CSPVoVNet에 적용한게 ELAN이다

E-ELAN

  • Extended efficient layer aggregation network의 약자. 
  • ELAN에서 사용하는 gradient path 구조의 큰 그림은 유지하지만 group convolution을 통해서 cardinality를 증가시키고, shuffle cardinality를 통해서 gradient path를 섞어줘서 더 diverse feature을 학습할 수 있게 해 준다.

Model scaling

  • ResNet 같은 구조는 EfficientNet 논문에서 하는 것처럼 width, depth를 따로 scale 할 수 있다.
  • 하지만 E-ELAN 같은 구조는 concatenation 때문에 width, depth를 분리가 잘 안 된다.
  • 밑에 그림처럼 (a)에서는 c + c + c = 3c를 concatenate 해서 transition block을 사용해야하지만, (b)같이 depth를 추가하면 c + c + c + c = 4c를 concatenate해서 transition block을 추가해야 한다.
  • 따라서 depth와 width가 같이 scaling 되는 구조라서 YOLOv7에서 (c)처럼 compound scaling을 하는 방법을 제안한다.

Bag of Freebies

RepConvN

  • RepConv (RepVGG에서 사용하는 블록[간단 리뷰] RepVGG: Making VGG-style ConvNets Great Again)은 3x3 conv, 1x1 conv, identity를 합친 operation이라서 추가적인 residual connection이나 concatenation이랑 같이 사용하면 안 좋다고 한다.
  • 예를 들어서 밑에 그림에서 (a) 같은 plain network에 (c)처럼 residual connection을 추가한 후 3x3 conv를 RepConv로 바꾸면 성능이 안 좋다. 이러한 이유는 RepConv에 residual connection이 있는데 추가적으로 residual connection을 사용하는 것이 의도한 gradient flow를 바꾸기 때문에 그런 것이라고 주장한다.
  • 이런 문제를 해결하기 위해서 RepConvN을 사용하는데 RepConv에서 identity branch를 제거한 block이라고 보면 된다.

Coarse for auxiliary and fine for lead loss

  • Detection head를 lead head만 사용하지 않고 밑에 그림처럼 auxiliary head와 함께 사용.
  • Auxiliary head는 학습을 보조하기 위해서 사용 (앞쪽 feature에서 detection이 어느 정도 되도록 해줘서 뒤쪽 feature에서 residual information만 학습하게 하는 의도)

  • YOLOX처럼 SimOTA 사용 ([논문 리뷰] YOLOX 참고)
  • Lead head auxiliary head 각각 SimOTA를 진행한다. 이때 auxiliary head는 더 많은 label을 assign를 해준다 (coarse 한 assignment), 밑에 그림 참고

 

Convolution과 BatchNorm 합치기

  • 잘 알려져 있지만 inference 할 때 convolution과 batch normalization을 single operation으로 합쳐서 속도를 높일 수 있다
  • 밑에 그림에서 convolution -> batch normalization -> activation이 있을 때 convolution과 batch normalization을 합치는 방법을 참고

Implicit Knowledge 사용

  • YOLOR처럼 implicit knowledge 사용.
  • Convolution을 modulation해주는 역할을 한다. Addition / multiplication으로 implicit knowledge를 추가할 수 있다 (밑에 그림에서 z가 implicit knowledge; z=학습 가능한 parameter)

EMA

  • 학습할 때 모델 weight를 exponential moving average (EMA)해뒀다가 inference할 때 EMA weight 사용
728x90
728x90

'논문 리뷰 > object detection' 카테고리의 다른 글

[논문 리뷰] YOLOv6  (0) 2023.07.09
[논문 리뷰] YOLOX  (0) 2023.06.03
[논문 리뷰] EfficientDet  (0) 2023.05.28
[논문 리뷰] PP-YOLO v1 (+v2)  (3) 2023.05.26
YOLOv5 정리  (2) 2023.05.19