YOLO Vision 2026:

Ultralytics YOLOv5 아키텍처#

YOLOv5 (v6.0/6.1)는 Ultralytics에서 개발한 강력한 객체 탐지 알고리즘입니다. 이 문서에서는 YOLOv5 아키텍처, 데이터 증강 전략, 학습 방법론 및 손실 계산 기법을 자세히 살펴봅니다. 이러한 종합적인 이해는 감시, 자율주행 차량 및 이미지 인식을 비롯한 다양한 분야에서 객체 탐지를 실제로 적용하는 데 도움이 됩니다.

1. 모델 구조#

YOLOv5의 아키텍처는 다음 세 가지 주요 부분으로 구성됩니다.

  • Backbone: 네트워크의 주요 본체입니다. YOLOv5의 backbone은 이전 버전에서 사용된 Darknet 아키텍처를 수정한 CSPDarknet53 구조로 설계되었습니다.
  • Neck: backbone과 head를 연결하는 부분입니다. YOLOv5에서는 SPPF (Spatial Pyramid Pooling - Fast) 및 PANet (Path Aggregation Network) 구조를 사용합니다.
  • Head: 최종 출력을 생성하는 부분입니다. YOLOv5는 이 목적을 위해 YOLOv3 Head을 사용합니다.

모델의 구조는 아래 이미지에 나와 있습니다. 모델 구조에 대한 자세한 내용은 models/yolov5l.yaml에서 확인할 수 있습니다.

backbone, neck, head를 보여 주는 YOLOv5 아키텍처

YOLOv5는 이전 버전에 비해 다음과 같은 주목할 만한 개선 사항을 도입했습니다.

  1. 이전 버전에서 사용되던 Focus 구조가 6x6 Conv2d 구조로 대체되었습니다. 이러한 변경으로 효율성이 향상됩니다 #4825.
  2. SPP 구조가 SPPF로 대체되었습니다. 이 변경으로 동일한 출력을 유지하면서 처리 속도가 두 배 이상 향상됩니다.

SPPSPPF의 속도를 테스트하려면 다음 코드를 사용할 수 있습니다.

SPP vs SPPF speed profiling example (click to open)
import time

import torch
from torch import nn

class SPP(nn.Module):
    def __init__(self):
        """Initializes an SPP module with three different sizes of max pooling layers."""
        super().__init__()
        self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
        self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
        self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)

    def forward(self, x):
        """Applies three max pooling layers on input `x` and concatenates results along channel dimension."""
        o1 = self.maxpool1(x)
        o2 = self.maxpool2(x)
        o3 = self.maxpool3(x)
        return torch.cat([x, o1, o2, o3], dim=1)

class SPPF(nn.Module):
    def __init__(self):
        """Initializes an SPPF module with a specific configuration of MaxPool2d layer."""
        super().__init__()
        self.maxpool = nn.MaxPool2d(5, 1, padding=2)

    def forward(self, x):
        """Applies sequential max pooling and concatenates results with input tensor."""
        o1 = self.maxpool(x)
        o2 = self.maxpool(o1)
        o3 = self.maxpool(o2)
        return torch.cat([x, o1, o2, o3], dim=1)

def main():
    """Compares outputs and performance of SPP and SPPF on a random tensor (8, 32, 16, 16)."""
    input_tensor = torch.rand(8, 32, 16, 16)
    spp = SPP()
    sppf = SPPF()
    output1 = spp(input_tensor)
    output2 = sppf(input_tensor)

    print(torch.equal(output1, output2))

    t_start = time.time()
    for _ in range(100):
        spp(input_tensor)
    print(f"SPP time: {time.time() - t_start}")

    t_start = time.time()
    for _ in range(100):
        sppf(input_tensor)
    print(f"SPPF time: {time.time() - t_start}")

if __name__ == "__main__":
    main()

result:

True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648

2. 데이터 증강 기법#

YOLOv5는 모델의 일반화 성능을 향상하고 과적합을 줄이기 위해 다양한 데이터 증강 기법을 사용합니다. 이러한 기법은 다음과 같습니다.

  • Mosaic Augmentation: 네 개의 학습 이미지를 하나로 결합하여 객체 탐지 모델이 다양한 객체 크기와 이동을 더 잘 처리하도록 하는 이미지 처리 기법입니다.

    네 이미지를 결합하는 YOLOv5 모자이크 데이터 증강

  • Copy-Paste Augmentation: 이미지에서 무작위 패치를 복사하여 무작위로 선택한 다른 이미지에 붙여 넣음으로써 새로운 학습 샘플을 효과적으로 생성하는 혁신적인 데이터 증강 방법입니다.

    인스턴스 세그멘테이션을 위한 YOLOv5 복사-붙여넣기 증강

  • Random Affine Transformations: 이미지의 무작위 회전, 크기 조정, 이동 및 전단을 포함합니다.

    학습을 위한 YOLOv5 무작위 아핀 변환

  • MixUp Augmentation: 두 이미지와 해당 레이블의 선형 결합을 사용하여 합성 이미지를 생성하는 방법입니다.

    두 이미지를 혼합하는 YOLOv5 MixUp 데이터 증강

  • Albumentations: 매우 다양한 증강 기법을 지원하는 강력한 이미지 증강 라이브러리입니다. Albumentations 증강 사용에 대해 자세히 알아보세요.

  • HSV Augmentation: 이미지의 색조, 채도 및 명도를 무작위로 변경합니다.

    YOLOv5 HSV 색상 공간 증강 예시

  • Random Horizontal Flip: 이미지를 수평 방향으로 무작위 반전하는 증강 방법입니다.

    YOLOv5 무작위 수평 뒤집기 증강

3. 학습 전략#

YOLOv5는 모델 성능을 향상하기 위해 여러 가지 정교한 학습 전략을 적용합니다. 이러한 전략은 다음과 같습니다.

  • Multiscale Training: 학습 과정에서 입력 이미지의 크기를 원래 크기의 0.5배에서 1.5배 범위 내에서 무작위로 조정합니다.
  • AutoAnchor: 사용자 지정 데이터에 있는 ground truth 박스의 통계적 특성에 맞도록 사전 anchor box를 최적화하는 전략입니다.
  • Warmup and Cosine LR Scheduler: 모델 성능을 향상하기 위해 학습률을 조정하는 방법입니다.
  • 지수 이동 평균 (EMA): 이전 단계의 파라미터 평균을 사용하여 학습 과정을 안정화하고 일반화 오차를 줄이는 전략입니다.
  • 혼합 정밀도 학습: 연산을 절반-정밀도 형식으로 수행하여 메모리 사용량을 줄이고 계산 속도를 향상하는 방법입니다.
  • 하이퍼파라미터 진화: 최적의 성능을 달성하도록 하이퍼파라미터를 자동으로 조정하는 전략입니다. 하이퍼파라미터 튜닝에 대해 자세히 알아보세요.

4. 추가 기능#

4.1 손실 계산#

YOLOv5의 손실은 다음 세 가지 개별 손실 구성 요소의 조합으로 계산됩니다.

  • 클래스 손실 (BCE Loss): 이진 교차 엔트로피 손실로, 분류 작업의 오차를 측정합니다.
  • 객체성 손실 (BCE Loss): 또 다른 이진 교차 엔트로피 손실로, 특정 그리드 셀에 객체가 있는지 여부를 탐지할 때의 오차를 계산합니다.
  • 위치 손실 (CIoU Loss): Complete IoU 손실로, 그리드 셀 내에서 객체의 위치를 지정할 때의 오차를 측정합니다.

전체 손실 함수는 다음과 같이 나타납니다.

YOLOv5 전체 손실 함수 수식

4.2 손실 균형 조정#

세 예측 레이어(P3, P4, P5)의 객체성 손실에는 서로 다른 가중치가 적용됩니다. 균형 가중치는 각각 [4.0, 1.0, 0.4]입니다. 이 방법을 통해 서로 다른 스케일의 예측이 전체 손실에 적절하게 기여하도록 합니다.

YOLOv5 객체성 손실 균형 조정 수식

4.3 그리드 민감도 제거#

YOLOv5 아키텍처는 이전 YOLO 버전에 비해 박스 예측 전략을 일부 중요하게 변경했습니다. YOLOv2와 YOLOv3에서는 마지막 레이어의 활성화 값을 사용하여 박스 좌표를 직접 예측했습니다.

바운딩 박스 x 좌표 예측 수식 바운딩 박스 y 좌표 예측 수식 바운딩 박스 너비 예측 수식 바운딩 박스 높이 예측 수식

YOLOv5 grid computation

그러나 YOLOv5에서는 그리드 민감도를 줄이고 모델이 제한되지 않은 박스 크기를 예측하는 것을 방지하기 위해 박스 좌표 예측 수식을 업데이트했습니다.

예측된 바운딩 박스를 계산하기 위한 수정된 수식은 다음과 같습니다.

YOLOv5 수정된 바운딩 박스 x 좌표 수식 YOLOv5 수정된 바운딩 박스 y 좌표 수식 YOLOv5 수정된 바운딩 박스 너비 수식 YOLOv5 수정된 바운딩 박스 높이 수식

스케일링 전후의 중심점 오프셋을 비교해 보세요. 중심점 오프셋 범위가 (0, 1)에서 (-0.5, 1.5)로 조정됩니다. 따라서 오프셋은 쉽게 0 또는 1이 될 수 있습니다.

YOLOv5 grid scaling

조정 전후의 높이 및 너비 스케일링 비율(anchor 기준)을 비교해 보세요. 기존 yolo/darknet 박스 수식에는 심각한 결함이 있습니다. 너비와 높이는 단순히 out=exp(in)으로 계산되므로 완전히 제한되지 않으며, 이는 runaway gradient, 불안정성, NaN 손실, 궁극적으로 학습의 완전한 실패를 초래할 수 있어 위험합니다. 자세한 내용은 이 이슈를 참고하세요.

YOLOv5 unbounded scaling

4.4 타깃 생성#

YOLOv5의 타깃 생성 과정은 학습 효율성과 모델 정확도에 매우 중요합니다. 이 과정에서는 출력 맵의 적절한 그리드 셀에 ground truth 박스를 할당하고 이를 적절한 anchor box와 매칭합니다.

이 과정은 다음 단계로 진행됩니다.

  • ground truth 박스의 크기와 각 anchor 템플릿의 크기 비율을 계산합니다.

ground truth와 anchor의 너비 비율 수식

ground truth와 anchor의 높이 비율 수식

최대 너비 비율 수식

최대 높이 비율 수식

전체 최대 비율 수식

anchor 매칭 임계값 수식

YOLOv5 IoU computation
  • 계산된 비율이 임계값 이내이면 ground truth 박스를 해당 anchor와 매칭합니다.
YOLOv5 grid overlap
  • 수정된 중심점 오프셋을 고려하여 매칭된 anchor를 적절한 셀에 할당합니다. 중심점 오프셋 범위가 (0, 1)에서 (-0.5, 1.5)로 조정되므로 추가 매칭이 가능해지고, 이에 따라 하나의 ground truth 박스가 둘 이상의 anchor에 할당될 수 있습니다.
YOLOv5 anchor selection

이와 같이 타깃 생성 과정은 학습 중 각 ground truth 객체가 올바르게 할당되고 매칭되도록 하여 YOLOv5가 객체 탐지 작업을 더 효과적으로 학습할 수 있게 합니다.

결론#

YOLOv5는 실시간 객체 탐지의 발전 과정에서 의미 있는 진전을 보여 줍니다. 아키텍처 설계, 학습 전략 및 엔지니어링 개선을 통해 이전 YOLO 버전에 비해 높은 성능과 효율성을 제공합니다.

YOLOv5의 주요 개선 사항에는 동적 아키텍처의 사용, 광범위한 데이터 증강 기법, 혁신적인 학습 전략, 손실 계산 및 타깃 생성 과정의 중요한 조정이 포함됩니다. 이러한 모든 혁신은 YOLO 모델의 상징인 높은 속도를 유지하면서 객체 탐지의 정확도와 효율성을 크게 향상합니다.

댓글