AI/Object Detection

[Object Detection] YOLO v1 ~ v6 비교(2)

슈퍼짱짱 2022. 6. 23. 22:03
반응형

YOLO Version별 비교

 

지난 포스팅에서 YOLO v1~v3를 비교&리뷰했다.

 

2022.06.23 - [AI/Object Detection] - [Object Detection] YOLO v1 ~ v6 비교(1)

 

[Object Detection] YOLO v1 ~ v6 비교(1)

YOLO Version별 비교 지난 포스팅에서 Object Detection 알고리즘 중 YOLO v1에 대해 자세히 알아보았다. 2022.04.04 - [AI/Object Detection] - [Object Detection(객체 검출)] YOLO v1 : You Only Look Once [Ob..

leedakyeong.tistory.com

 

이번에는 v4~v6에대해 리뷰하겠다.

 


YOLO v4 :: Optimal Speed and Accuracy of Object Detection

 

YOLO v4는 2020년 4월에 개시되었으며,

저자들은 정확도의 문제로 실제 YOLO만 단독으로 쓰이는 경우가 매우 적음을 지적하고 빠르면서도 정확한 모델을 만들기 위해 version 4 모델을 개발했다고 말한다. 

또한, Single GPU 즉, GPU 한 개만 있어도 사용할 수 있도록 만든 점을 강조하고 있다.

 

version4 역시 version3에 몇 가지 아이디어를 더해 만든 모델로, 

YOLO v4 = YOLO v3 + CSPDarknet53(backbone) + SPP + PAN + BoF + BoS 라 정리할 수 있다.

각각에 대해 자세히 알아보겠다.

 

BoF, BoS는 이미 학회에서 유명한 다양한 기술들을 적용하여 실험한 내용으로, BoF 먼저 설명하겠다.

 

1. BoF(Bag of Freebies)

BoF는 inference 시간은 늘리지 않으면서 더 높은 정확도를 얻기 위해 학습시키는 방법들을 의미한다.

Data Augmentation, Regulaization, Loss Function 등에 다양한 실험을 진행했다.

* 최종 모델은 이 기법들을 모두 적용한 건 아니고 실험을 통해 몇 개만 적용했다.  

 

1-1. Data Augmentation

 

Data Augmentation은 입력 이미지에 변동성을 높혀, 설계된 모델이 다른 환경에서 얻은 이미지에 보다 강건해 질 수 있도록 하기 위해서 수행하는 기법이다.

v4에서는 Pixel-wise adjustment, Simulating object occlusion(Random Erase, CutOut), Using multiple images(Mosaic, MixUp, CutMix), Style transfer GAN 등을 실험에 사용했다. 

 

이 중 CutMix는 Classification 문제에서 효과가 좋았고, Mosaic은 Classification에서도, OD에서도 효과가 좋았다.

 

(각 기법에 대한 자세한 설명은 아래 더보기를 참고한다.)

더보기

Pixel-wise adjustment는 픽셀 단위로 정보를 변경시키는 방법으로, augmentation 후에 변동된 영역의 원본 픽셀 정보가 보존된다는 특징을 가진다.

예로 아래 그림과 같이 밝기, 대비, 색조, 채도 조절과 크기 조절, Flip, 회전 등이 있다.

 

https://herbwood.tistory.com/24?category=856250

Simulating object occlusion은 객체가 서로 겹치는 상황을 가정하고, 이러한 상황에 모델이 보다 잘 대처하게끔 하기 위해 사용하는 방법이다. 대표적인 예로는 Random Erase과 CutOut이 있다.

Random Erase는 이미지에 직사각형 영역을 random하게 선택하고, 그 값을 random한 값으로 채우는 것이고, 

CutOut은 그 직사각형 영역을 0으로 채우는 것이다. 

 

Random Erase(좌), CutOut(우)

Using multiple images는 다수의 이미지를 함께 사용하여 aumentation하는 방법이다.

Mosaic은 v4의 저자들이 처음으로 제시한 기법으로,

다음과 같이 4장의 이미지를 random한 비율로 1장으로 만드는 기법이다.

 

https://www.researchgate.net/figure/Mosaic-represents-a-new-method-of-data-augmentation-mixed-while-CutMix-mixes-only-2_fig3_340883401

 

이 기법은 한 개의 이미지로 4개의 이미지를 학습하는 효과를 주고, 물체의 사이즈가 작아져 작은 물체를 예측하는데에도 도움을 준다.

 

MixUp은 다음과 같이 두 이미지를 하나로 합치고, 두 Label을 모두 1로 해준다.

두 클래스 간 Decision Boundary가 더 부드럽게 되어 Overfitting을 막아주는 역할을 한다.

 

https://medium.com/@wolframalphav1.0/easy-way-to-improve-image-classifier-performance-part-1-mixup-augmentation-with-codes-33288db92de5

 

 

CutMix는 CutOut과 MixUp을 합친 방법이다.


Style transfer GAN은 두 이미지가 주어졌을 때, 그 이미지의 주된 형태는 content image와 유사하게 유지하면서 스타일만 style image와 유사하게 바꾸는 GAN 모델이다. 

아래 그림에서 왼쪽 위 주택 사진이 content image이고, 각 화가의 작품이 style image이다. 주택의 형태와 배치는 유지되면서 화풍만 각 작가와 유사하게 바뀐 것을 볼 수 있다.

 

https://blog.lunit.io/2017/04/27/style-transfer/

 

 

(Online Augmentation과 Offline Augmentation의 차이도 아래 더보기를 참고한다.)

더보기

참고로 Data Augmentation에는 Online Augmentation과 Offline Augmentation이 있는데,

 

Online Augmentation은 데이터 수가 충분히 보장 되었을 때 하는 방법으로, 

Disk에 Augmentation한 데이터를 저장하는 것이 아니라, 학습을 할 때 Real-time으로 Augmentation을 적용한다.

모델을 Robust하게 하기 위함이고, 매 epoch매다 새로운 데이터를 학습 시킬 수 있다. 

 

Offline Augmentation은 데이터가 적을 때 하는 방법으로, Augmentation한 이미지를 Disk에 저장해서 학습 시 사용하는 방법이다.

Train Set 자체이기 때문에 모델이 epoch을 돌 때마다 같은 이미지를 학습하게 된다. 

 

데이터 수가 충분하다면 대체로 Online이 Offline보다 성능이 좋다고 한다. 단, 학습 시간은 많이 늘어날 수 있다.

 

 

1-2. Sementic Distribution Bias

 

학습 데이터 셋 자체에 내제하는 Bias(Class Imbalance, One-hot hard representation)를 해결하기 위해 다음과 같은 실험을 했다.

 

먼저, Class Imbalance 문제를 해결하기 위해 Focal Loss를 적용한다.

 

여기서 Class는 물체(foreground)와 배경(background)을 의미한다. 대부분의 이미지는 물체가 차지하는 영역보다 배경이 차지하는 영역이 훨씬 많고, 이로인해 Class Imabalance 문제가 발생한다. 

 

R-CNN 계열인 Two-Stage OD에서는 hark negative exmaple mining이나, online hard example mining과 같은 기술로 이를 해결하지만, 이는 One-Stage OD에는 맞지 않는다. 

따라서 One-Stage 기법인 YOLOv4에서는 Focal Loss로 이를 해결한다.

 

(Focal Loss에 대한 자세한 설명은 아래 더보기를 참고한다.)

더보기

Focal Loss는 Cross Entoropy를 Class Imabalance 문제를 다루기 위해 개선된 버전이라 말할 수 있다.

 

OD 문제에서 Background는 Foreground(객체)에 비해 Detector에 의해 잘 분류될 수 있어서 loss가 작으나, 그 수가 굉장히 많기 때문에 전체 loss 및 gradient를 계산 할 때는 영향이 압도적으로 커지는 문제가 있다.

 

Focal Loss는 이를 개선하여 Detector가 더 못찾는 즉, 쉽게 오분류되는 케이스(=Foreground)에 더 큰 가중치를 주는 방법이다. 

 


Cross Entropy 식은 다음과 같다. 

 

https://gaussian37.github.io/dl-concept-focal_loss/

 

표기를 간단히 하기 위해 $Y_{act}$는 $Y$로 표기하고, $Y_{pred}$는 $p$라 표현하겠다.

 

Cross Entropy는 foreground를 잘 못 예측했을 때와, background를 잘 못 예측했을 때 loss가 같다.

예를 들어, foreground Y=1이고 p=0.95라 하고, background Y=0이고 p=0.05라 하자.

그 때 CE는 다음과 같이 동일하다.

 

 

문제가 없어보이지만, Background의 수가 훨씬 더 많기 때문에, 학습에도 훨씬 더 큰 영향을 줄것이다.


Focal Loss는 이를 개선하여 다음과 같이 식을 조정한다.

 

 

$\alpha$와 $\gamma$는 모두 hyper parameter 값이고, 논문에서는 $\alpha=0.25, \gamma=2$를 최종적으로 사용했다.

단, Foreground에 대해 $\alpha=0.25$이면, Background에 대해서는 $\alpha=0.75$가 사용된다.

 $\gamma=0$일 때, 기존 CE은 식이된다.

 

아래는 $\gamma$에 따른 Focal Loss 그래프이다.

Y=1이라 할 때, x축은 p값이고, y축은 그 때 계산된 loss값이다.

 

 

예를 들어, p=0.1일 때, 즉 Detector가 잘 못 맞출 때 CE loss 값은 약 2.3이고, FL 값은 약 2.1이다.

p=0.9일 때 즉, Detector가 잘 맞출 때는 CE loss 값은 약 0.1이고, FL 값은 0.01이다.

 

이처럼 CE에 비해 FL가 잘 못 맞출 때 훨씬 loss값이 큰 것을 볼 수 있다.

 

 

다음으로, 서로 다른 category 간의 연관성을 표현하기 위해 Label refinement network와 Label smoothing 방법을 사용한다.

 

쉽게 말해, 고양이라는 category에 대해 [고양이 : 1, 강아지 : 0, 사람 : 0] 이라 labeling하는 것이 아니라,
[고양이 : 0.9, 강아지 : 0.1, 사람 : 0] 으로 표현하는 것이다. 

이는 모델을 보다 더 Robust하게 만드는 역할을 한다.

 

Label Smoothing은 Classification 문제에서는 효과가 좋았으나, OD 문제에서는 오히려 성능을 떨어뜨렸다.

 

 

1-3. BBox Loss Function

 

Bounding Box의 Loss Function으로는 기존의 MSE 외에 IoU기반의 Loss Function(GIoU, CIoU, DIoU 등)들을 실험했다.

 

실험 결과도 MSE보다 IoU기반 Loss들이 더 성능이 좋았고, 최종 CIoU를 사용한다.

 

(IoU 기반 Loss들에 대한 자세한 설명은 아래 더보기를 참고한다.)

더보기

아래 그림에서 세 쌍의 Box 모두 MSE는 동일하지만, IoU값에는 차이가 있다. 이와같은 이유로 OD에 BBox Loss는 MSE가

아니라 IoU를 활용하는 것이 더 적합할 수도 있다. 

https://silhyeonha-git.tistory.com/3

만약, 1-IoU를 loss로 사용한다면, 아래 이미지에서 가장 오른쪽 예시와 같이 두 박스가 전혀 겹치지 않는 경우에는 어느 정도 오차로 교집합이 생기지 않는지 알 수가 없어 vanishing gradient 문제가 발생할 수 있다.

 

1-IoU Loss

 

이를 해결하기 위해 등장한 방법이 GIoU이다.

 


GIoU(Generalized-IoU)는 BBox와 GT를 모두 포함하는 최소 크기의 C 박스를 활용한다.

 

GIoU

 

C Box는 A와 B를 포함하는 가장 작은 Box이고, 기존 IoU 값에서 C Box 중 A와 B 모두 겹치지 않는 영역의 비율을 뺀 값이다. 이 값은 클 수록 두 박스가 많이 겹쳐있음을 의미한다.

 

단, OD에서 1-GIoU를 사용했더니 아래 이미지처럼 GT와의 overlap을 위해 BBox 영역이 넓어지고, 그 다음에 IoU를 높이기 위해 BBox 영역을 줄이는 방식으로 수행되어, 수렴 속도가 느리고 부정확하게 박스를 예측한다는 문제점이 존재했다.

 

BBox 예측 과정. 초록Box GT, 파랑Box BBox

 

이를 해결하기 위해 DIoU가 등장한다.


DIoU(Distance-IoU)는 IoU와 함께 중심좌표를 활용한다.

DIoU를 활용한 Loss 식은 다음과 같다.

 

여기서 $\rho$는 Euclidean distance, $b$는 BBox, $b^{gt}$는 GT의 중심좌표, $c$는 BBox와 GT를 포함하는 최소 Box인 C Box의 대각 길이를 의미한다.

 

아래는 DIoU Loss를 활용한 BBox 예측 과정이다. (초록Box : GT, 빨강Box : BBox)

중심 좌표를 비교하면서 학습하기 때문에, GT와 단지 overlap 하기 위해 영역을 넓히던 이전 loss들과 달리, BBox 자체가 GT로 이동한다.

 

 


마지막으로 CIoU(Complete-IoU)는 DIoU가 제안될 때 동시에 제안된 방법으로, overlap area, central point distance, aspect ratio(종횡비)를 모두 고려한 방법이다.

즉, overlap area와 central point distance를 고려한 DIoU에 aspect ratio를 추가한 방법이다.

 

CIoU Loss 식은 다음과 같다.

 

 

 

여기서 $v$는 두 box의 aspect ratio의 일치성을 측정하는 역할이고 $\alpha$는 positive trade-off parameter로 non-overlapping case와 overlapping case의 균형을 조절하는 역할을 한다.

 

 

1-4. Regularization method

 

Overfitting을 막기 위한 regulaization 기법으로는 DropOut, DropPath, Spatial DropOut, DropBlock을 실험했는데, 

 

DropBlock을 적용했을 때 성능이 가장 좋았다고 한다.

 

 

2. BoS(Bag of Specials)

inference 시간은 아주 조금 증가시키지만, 정확도는 크게 향상시키는 방법을 BoS라 부른다.

모델 및 후처리에 적용하는 기술들이 이에 속한다.

 

 

2-1. Enhance receptive field

 

backbone에서 얻은 feature map에 대한 receptive field를 키우는 방법으로,

  • SPP(Spatial Pyramid Pooling)
  • ASPP(Atrous SPP)
  • RFB(Receptive Field Block Net) 등의 방법을 사용했다.

 

이 중 SPP를 사용한다.

(SPP에 대한 설명은 아래 Neck에서 한다.)

 

(Receptive Field에 대한 설명은 아래 더보기를 참고한다.)

더보기

receptive field란 feature를 생성하는 input 영역의 크기이다.

아래 이미지에서 3X3 CNN filter를 적용했다고 할 때, Layer2의 초록색 영역의 receptive field는 Layer1의 초록색 영역이다.

 

 

https://theaisummer.com/receptive-field/

 

 

2-2. Attention module

 

Attention module로는

  • SE(Squeeze-and-Excitation)
  • SAM(Spatial Attention Module) 을 사용했는데, 

 

SE는 약 2%의 연산량이 증가(GPU에서는 10%)하지만, 1%의 정확도 향상을 이뤘다고 한다.

하지만 SAM은 GPU Inference 속도에 전혀 영향을 미치지 않았고 정확도도 향상시켰다.

(SAM에 대한 설명도 아래 Neck에서 한다.)

 

2-3. Feature Integration

 

feature map을 통합하기 위해

  • SFAM
  • ASFF
  • BiFPN 과 같은 실험을 했다.

 

 

2-4. Activation Function

 

  • Leaky ReLU
  • Parametric ReLU
  • ReLU6
  • SELU(Scaled Exponential Linear Unit)
  • Swish
  • Hard-Swish
  • Mish 중에서는 

 

Mish가 효과가 좋았다.

 

https://herbwood.tistory.com/24?category=856250

 

 

2-5. Post-processing Method

 

후처리 중 같은 객체를 예측하는 BBox를 제거하는 NMS도 좀 더 다양한 방식으로 시도한다.

  • Greedy NMS
  • Soft NMS
  • DIoU NMS 중

 

DIoU NMS를 사용한다.

 

 

2-6. Normalization of the network activations by their mean and variance

 

  • BN(Batch Normalization)
  • CCBN or SyncBN(Cross-GPU Batch Normalization)
  • FRN(Filter Response Normalization)
  • CBN(Cross-Iteration Batch Normalization) 중에서는 

 

CBN이 효과가 좋았다.

 

 

2-7. Skip-connections

 

  • Residual connections
  • Weighted residual connections
  • Mini-input weighted residual connections
  • (CSP)Cross stage partial connections 

 

Backbone으로 CSP가 포함된 CSPDarknet-53 모델을 사용한다.

(CSP에 대한 자세한 설명은 아래 Backbone에서 한다.)

 

3. Model Architecture

YOLO v4의 Model Architecture는 크게 Backbone, Neck, Head로 이루어지는데, 

Backbone은 input으로부터 feature를 추출하는 부분이고,

Neck은 앞에서 추출한 feature들을 집계하는 부분이다.

Head는 최종적으로 BBox를 찾고 Classfication을 담당한다.

 

 

3-1. Backbone

 

Backbone으로는 CSPDarknet53 모델을 사용하는데, 저자가 이 Backbone을 결정하기 위해 고려한 내용이 다음과 같다.

 

  1. 작은 물체를 잘 예측하기 위해 Input Resolution을 크게 사용할 수 있고(512X512),
  2. BoS에서 했던 노력처럼 Receptive Field를 키워주기 위해 깊은 Layer를 쌓고,
  3. 모델 성능을 위해 파라미터 수를 키웠다고 한다. 

단, 그럼에도 Inference 속도가 빨라야한다.

이를 충족하는 Backbone이 CSPDakrnet53이었다.

 

Layer도 깊고 파라미터 수도 많은데, 속도가 빠른 이유는 바로 CSPNet(Cross Stage Partial DenseNet) 때문이다.

 

CSPNet

 

CSPNet의 연산속도가 빠른 이유는 input feature map을 두 파트로 나눠서 한 파트는 아무 연산도 하지 않고 전달하고, 나머지 파트만 연산에 참여한 후 다시 합쳐준다.

이렇게 하면 정확도에는 손실이 없으면서, 연산 속도는 빠르게 수행할 수 있도록 해준다.

 

이 CSP Layer를 Darknet53에 연결해서 CSPDarknet53을 Bakcbone으로 사용한다.

 

 

3-2. Neck

 

Neck 중 Additional Block으로는 BoS 실험들 중 SPP와 SAM이 사용된다.

 

먼저, SPP(Spatial Pyramid Pooling)는 Receptive field를 늘리기위한 방법 중 하나로, 아래 이미지처럼 feature map을 정해준 grid에 맞추어 max pooing 한다.

 

 

 

SPP layer

 

가장 왼쪽 Pooling Layer는 feature map을 4by4로 나누어 각 grid cell별로 max pooing하여 한 줄로 flat하고,

가운데 Pooling Layer는 2by2로 영역을 나누어 pooing하여 한 줄로 flat하고, 마지막 layer는 전체를 한 값으로 pooling한다.

 

이를 다른 이미지로 보면 다음과 같다.

 

 

https://driip.me/5743aed5-c630-4900-b367-9987a088661a

 

 

YOLO에서는 5X5, 9X9, 13X13 size가 적용된다.

input으로 어떤 size가 들어오든 일정한 개수의 값을 return하기 때문에 Input Image의 Size를 자유롭게 넣어줄 수 있다는 장점이 있다.

 

Backbone 마지막 Layer와 PANet 사이에 연결되며 연산량에는 큰 영향을 미치지 않는다.

 

 

SAM(Self-Attention Module)은 feature map을 정제시켜서 상대적으로 중요한 값을 강조하는 역할을 한다.

* 단, SAM은 BoS 조합들로 성능을 가릴 때는 사용되었고, 최고 성능 조합으로 뽑혔으나, 최종적으로는 사용되지 않았다.

 

 

https://jonathan-hui.medium.com/yolov4-c9901eaa8e61

 

input feature map에 max pooling layer와 average pooling layer를 각각 적용시켜 새로운 두 세트의 feature map을 생성하고, 이에 다시 conv layer를 적용한다. 그리고 sigmoid를 적용하면 Spatial Attention Module이 생성되고, 이를 다시 원래 input feature와 합치면 refined feature가 생성된다.

 

전체 과정은 다음과 같다. 

 

 

 

 

 

Path-aggregation blocks으로는 기존 YOLOv3의 FPN이 아닌, PAN을 사용한다.

* FPN(Feature Pyramid Networks)는 마지막에 3개 Scale로 Prediction하는 network 이다.

 

PAN(Path Augmented Network)은 Bottom-up Path Augmentation을 통해 Low-level feature 정보를 High-level feature에 효과적으로 전달함으로써 Object Detection 시 Localization 성능을 향상시킨 Network 이다.

 

FPN과 비교하면 다음과 같다.

 

FPN(좌), PAN(우)

 

일반적으로 low-level feature는 small object를, high-level feature를 large object를 검출하는데 유용하다고 알고있다.

* 참고로 low-level feature는 edge(물체의 경계)를 추출하는 역할을 하고, high-level feature는 학습과정에서 표현력이 커지면서 이미지의 context를 포착하는 역할을 한다.

 

하지만, small object를 포착하는데 high-level feature도 필요하고, large object를 포착하는데 low-level feature도 분명히 필요하다.

따라서 low-level과 hight-level 정보를 풍부하게 활용한다면 더 정확한 localization이 가능하다.

 

기존의 FPN은 최하단 Layer가 최상단에 도달할 때까지 100 layer 이상을 거쳐야 한다. (이는 위 이미지에서 빨간색 점선이 표시하고 있다.)

하지만, PAN은 FPN이 생성한 {P2, P3, P4, P5}를 활용하여 {N2, N3, N4, N5}를 생성한다. 이로써 PAN은 최하단 Layer가 최상단에 도달하기까지 녹색 점선처럼 몇 개의 Layer만 거치면 된다. 

이로써, low-level 정보가 온전히 high-level에 전달되어, 활용할 수 있다.

 

 

3-3. Head

 

마지막으로 Head는 기존 YOLO v3와 같이 3 Scale로 prediction한다.

 

 

이를 모두 합쳐 표현한 YOLO v4 Model Architectur는 다음과 같다.

 

 

https://www.researchgate.net/figure/Schematic-of-the-YOLOv4-network-architecture-consisting-of-CSPDarknet53-as-the-backbone_fig1_357659151

 

 

Input Image 입력 받아서 -> Backbone 지난 후 -> 가장 마지막에 SPP Layer 지나고 -> PANet -> Head 를 거쳐 Detection 결과가 return된다.

 

 


YOLO v5, v6

 

YOLO v5는 v4가 공개된 지 2달만인 2020년 6월에 공개되었는데, Paper도, Tech Report도 아닌 코드만 공개했다.

 

v3를 Pytorch로 구현했던 사람이 본인 github에 코드를, 블로그에는 성능 등 간략한 내용만 공개한것이다.

 

따라서 어디에도 이전 version들에 비해 성능 외 어떤 점이 달라졌는지 구체적으로 명시된 내용이 없다.

또한, 처음에는 Version5로 공개했지만, 2021년 10월에 모델 구조를 조금 바꾸어 Version6로 업데이트 되었고, 그 이후에도 지속적으로 업데이트 되고 있다. 

 

그래서 직접 그 코드를 까보면서 공부한 내용을 토대로 Version5, 6가 이전 버전과 크게 달라진 점을 꼽아보자면 다음과 같다.

 

 

1. Backbone

 

가장 큰 변화는 그동안은 C언어로 구현된 Darknet 을 사용했지만, YOLO v5부터는 Pytorch로 구현했다는 것이다. 

 

우선 v5안에서도 사소한 변화들이 있었다. 아래는 변화 전과 후의 모델 구조이다.

 

전(좌), 후(우)

 

Head에 Neck 부분이 같이있고, 마지막 Detect Layer가 실제 Head를 담당한다.

Yolo v5를 그림으로 도식화하면 다음과 같다.

 

https://arxiv.org/pdf/2112.11798.pdf

 

  1. Focus() 가 일반 Conv Layer로 대체되었고
  2. SPP()가 SPPF()로 
  3. BottleNeckCSP()가 C3()로 대체되었다.

1. 기존의 Focus() Layer는 input을 받아서 Space to Depth 역할을 해주었다. 

Conv2d의 연산량을 줄이기 위해 Resolution을 줄이는 대신 Depth를 늘리는 역할을 했다.

예로 [1,1,4,4]를 [1,4,2,2]로 바꿔주는 역할이다. (torch에서 dimension의 각 자리는 [N, C, W, H]를 의미한다.)

 

그런데 kernel size가 3인 Focus Layer는 kernel size가 6이고, Stride가 2인 Conv Layer와 동일한 결과를 낸다는 것이 밝혀져 이와같이 수정되었다.

이에 대한 자세한 설명은 여기에 있다.

 

2. 기존의 SPP layer와 수학적으로 동일한 결과를 내는데, 더 빠른 속도로 구현한 SPPF(fast) Layer를 사용한다.

기존 SPP는 input feature map에 5X5, 9X9, 13X13 max pooling layer를 적용하여 concat한다.(padding으로 size는 모두 같게 맞춘다.)

SPPF는 ①. input feature map에 5X5 max pooling layer 적용하고,

②. ①에 다시 5X5 max pooling layer 적용하고,

③. ②에 다시 5X5 max pooling layer 적용하여 input feature map과 ②, ③을 concat한다. 마찬가지로 padding으로 size는 모두 같게 맞춰준다.

이에 대한 자세한 설명은 여기에 있다.

 

3. C3 Layer가 BottleneckCSP Layer를 반복하는 구조로 짜여져있다. 즉, Model을 더 깊게 쌓기 위해 대체된 것으로 보인다.

 

version6으로 가면서는 조금의 변화가 더 생겼다.

아래 이미지에서 왼쪽이 v5이고 오른쪽이 v6이다.

전반적으로 모델이 더 깊어졌다.

 

(yolo v5에 대한 모델 구조는 yolov5/models에 있고, yolo v6에 대한 모델 구조는 yolov5/models/hub에 가면 있다.)

 

YOLOv5(좌), YOLOv6(우)

 

v6으로 가면서 가장 큰 변화는 Head 이다.

기존 3개 Scale로 Detection하더 Head가 4개 Scale로 변경되었다.

(참고로 왼쪽 v5는 640 size에 대한 Anchor Box size를 나타내고있고, 오른쪽 v6은 1280 size에 대한 Anchor Box size를 나타내고 있다.)

 

YOLOv5(좌), YOLOv6(우)

 

version 6의 Model 구조를 도식화하면 다음과 같다.

전반적인 구조는 version 5와 거의 비슷하나, 좀 더 깊어졌고, Detection하는 Head 부분의 Scale이 하나 늘었다. 

 

 

 

2. Data Augmentation

 

학습 시 Mosaic, MixUp, Copy & Paste를 수행한다.

MixUp과 Copy & Paste는 Segmentation 문제에만 적용하고, OD에는 Mosaic만 적용한다.

 

Mosaic과 MixUp은 v4에서 설명한 내용이고,

 

 

Copy & Paste는 다음과 같이 Segmentation 문제에서 여러 물체들을 말 그대로 Copy & Paste 해준다. 

데이터가 적을 때 물체 수를 많이 늘릴 수 있다는 장점이 있다.

 

https://openaccess.thecvf.com/content/CVPR2021/papers/Ghiasi_Simple_Copy-Paste_Is_a_Strong_Data_Augmentation_Method_for_Instance_CVPR_2021_paper.pdf

 

 

3. Anchor Box Auto Learning

 

Anchor Box 역시 이전 버전들과 동일하게 K-means를 통해 결정하는데, 이를 학습 시 자동으로 계산하도록 구현되어있어, 사용자가 따로 계산하지 않아도 된다. 

새롭게 계산된 Anchor Box의 결과도 train.py 파일 실행 시 Console창에 Print 해준다.

(만약, 이를 원치 않는다면 train.py 실행 시 noautoanchor 파라미터를 False로 입력해주면 된다.)

 

 

성능은 다음과 같다.

위에 결과들이 version5에 대한 성능이고, 아래 결과는 version6에 대한 성능이다.

 

 

Version5에서 6로 가면서 생긴 가장 큰 변화는 nano버전이 나왔다는 것이다.

YOLO v5와 v6를 구현한 이들의 blog에 가보면 v5의 nano 모델(즉, 가장 얕고, 가벼운 모델)이 v4의 tiny모델에 비해 Training 속도와 Inference 속도 모두 좋아졌으며, 성능 역시 좋아졌음을 강조한다.

 

 

(이 코드를 직접 까보면서 느낀점은 자동화가 굉장이 잘 되어있고, 따라서 사용자가 Low Level에서 본인의 Dataset과 목적에 맞게 Custom하기 쉽게 구현되어 있다는 점이다.)


정리하자면, 애초에 YOLO는 R-CNN 계열의 Object Detection 알고리즘들이 높은 성능을 내지만, 속도는 매우 느린것에서 출발하여 real-time으로 Object Detection을 하기 위해 나온 알고리즘으로,

 

  • YOLO v2부터 Anchor Box가 도입되었으며, K-means로 Optimal한 크기와 개수를 정해준다.
  • 또, v2부터 FC Layer가 사라져, 다양한 Size의 Input을 넣을 수 있게 되었다.
  • YOLO의 고질적인 문제인 Small Object를 잘 못찾는다는 문제점은 v3에서 3 scale로 예측하면서 크게 해소되었다.
  • v4부터 Mosaic, MixUp 등 다양한 Augmentation을 적용하여 성능을 향상시켰다.
  • 또, v4는 CSP Layer를 활용하여 정확도는 향상시키되, 속도는 줄이는데 큰 역할을 했다.
  • v4까지는 Darknet 기반 Backbone을 사용했으나, v5부터 Pytorch로 구현된 Backbone을 사용한다.
  • v6부터는 기존 3개 Scale로 Detection하던 것에서 4개로 늘어 더 다양한 Size의 Object를 잘 Detection한다.

 

이후 20년 7월 PP-YOLO라는 모델이 발표되었고, 21년 2월에 Scaled-YOLOv4, 21년 5월에 YOLOR, 21년 7월에는 YOLOX라는 모델이 나왔다.

 

이처럼 Object Detection 분야는 매우 활발하게 연구가 이루어지고있으며, SOTA 모델도 지속적으로 업데이트 되고 있다.

 

 

현재 COCO Dataset에 대한 YOLO SOTA 모델은 YOLOR 계열인 것으로 보인다.

 

https://paperswithcode.com/sota/object-detection-on-coco?tag_filter=15

 

이 내용은 구글에 Object Detection SOTA라 검색하면 나오는 링크에 들어가면 볼 수 있다.

 

 

 

* 참고로 현재 구글에 YOLO v7을 검색하면 yolov7이란 이름의 github 가 나오는데, 이는 실제 YOLO v7를 의미하는 것이 아니라, detectron2에 기반한 YOLO 변종이며, 7이라는 숫자는 그냥 행운의 숫자라서 붙였다고 한다.

 

v7에 대한 설명

 


참고

 

YOLO v4 : https://www.youtube.com/watch?v=CXRlpsFpVUE, https://herbwood.tistory.com/24?category=856250 

Focal Loss : https://gaussian37.github.io/dl-concept-focal_loss/

BBox Loss : https://silhyeonha-git.tistory.com/3

SAM : https://jonathan-hui.medium.com/yolov4-c9901eaa8e61

PAN : https://deep-learning-study.tistory.com/637, https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=siniphia&logNo=221490098283 

반응형