YOLO Vision 2026:

Ultralytics YOLOv5 아키텍처#

YOLOv5 (v6.0/6.1)은 Ultralytics에서 개발한 강력한 객체 검출 알고리즘입니다. 본 문서에서는 YOLOv5 아키텍처, data augmentation 전략, 학습 방법론 및 손실 계산 기법에 대해 자세히 알아봅니다. 이러한 종합적인 이해는 감시, 자율주행, image recognition 등 다양한 분야에서 객체 검출의 실무적 적용을 향상시키는 데 도움이 됩니다.

모델 구조#

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에서 확인할 수 있습니다.

YOLOv5 architecture showing backbone, neck, and head

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()

결과:

True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648

데이터 증강 기법#

YOLOv5는 모델의 일반화 능력을 향상시키고 overfitting을 줄이기 위해 다양한 데이터 증강 기법을 채택합니다. 이러한 기법에는 다음이 포함됩니다:

  • Mosaic Augmentation: object detection 모델이 다양한 객체 스케일과 이동을 더 잘 처리할 수 있도록 4개의 학습 이미지를 하나로 결합하는 이미지 처리 기법입니다.

    YOLOv5 mosaic data augmentation combining four images

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

    YOLOv5 copy-paste augmentation for instance segmentation

  • 무작위 Affine 변환: 여기에는 이미지의 무작위 회전, 스케일링, 변환 및 기울이기(shearing)가 포함됩니다.

    YOLOv5 random affine transformations for training

  • MixUp 증강: 두 이미지와 관련된 레이블의 선형 결합을 취하여 합성 이미지를 생성하는 방법입니다.

    YOLOv5 MixUp data augmentation blending two images

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

  • HSV 증강: 이미지의 색조(Hue), 채도(Saturation), 명도(Value)를 무작위로 변경합니다.

    YOLOv5 HSV color space augmentation examples

  • 무작위 수평 뒤집기(Random Horizontal Flip): 이미지를 무작위로 수평으로 뒤집는 증강 방법입니다.

    YOLOv5 random horizontal flip augmentation

학습 전략#

YOLOv5는 모델 성능을 향상시키기 위해 몇 가지 정교한 학습 전략을 적용합니다. 여기에는 다음이 포함됩니다:

  • 다중 스케일 학습(Multiscale Training): 학습 과정 중에 입력 이미지는 원래 크기의 0.5배에서 1.5배 범위 내에서 무작위로 크기가 조정됩니다.
  • AutoAnchor: 이 전략은 사용자 정의 데이터의 ground truth 박스 통계적 특성에 맞게 사전 앵커 박스를 최적화합니다.
  • Warmup and Cosine LR Scheduler: 모델 성능을 향상시키기 위해 learning rate를 조정하는 방법입니다.
  • 지수 이동 평균(EMA): 이전 단계의 매개변수 평균을 사용하여 학습 과정을 안정화하고 일반화 오류를 줄이는 전략입니다.
  • Mixed Precision Training: 연산을 반precision 형식으로 수행하여 메모리 사용량을 줄이고 연산 속도를 향상시키는 방법입니다.
  • Hyperparameter Evolution: 최적의 성능을 달성하기 위해 하이퍼파라미터를 자동으로 튜닝하는 전략입니다. hyperparameter tuning에 대해 자세히 알아보세요.

추가 기능#

4.1 손실 계산(Compute Losses)#

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

  • 클래스 손실 (BCE Loss): 이진 교차 엔트로피 손실로, 분류 작업에 대한 오류를 측정합니다.
  • 객체 존재 손실 (BCE Loss): 또 다른 이진 교차 엔트로피 손실로, 특정 그리드 셀에 객체가 존재하는지 여부를 감지하는 오류를 계산합니다.
  • 위치 손실 (CIoU Loss): 완전 IoU 손실로, 그리드 셀 내에서 객체의 위치를 파악하는 오류를 측정합니다.

전체 loss function은 다음과 같이 나타납니다:

YOLOv5 total loss function formula

4.2 손실 균형(Balance Losses)#

세 개의 예측 레이어(P3, P4, P5)의 객체성 손실(objectness loss)은 가중치가 다르게 적용됩니다. 균형 가중치는 각각 [4.0, 1.0, 0.4]입니다. 이 접근 방식은 서로 다른 스케일의 예측이 전체 손실에 적절하게 기여하도록 보장합니다.

YOLOv5 objectness loss balance formula

4.3 그리드 민감도 제거#

YOLOv5 아키텍처는 이전 YOLO 버전과 비교하여 박스 예측 전략에 몇 가지 중요한 변경 사항을 적용합니다. YOLOv2 및 YOLOv3에서는 박스 좌표가 마지막 레이어의 활성화를 사용하여 직접 예측되었습니다.

Bounding box x-coordinate prediction formula Bounding box y-coordinate prediction formula Bounding box width prediction formula Bounding box height prediction formula

YOLOv5 grid computation

그러나 YOLOv5에서는 그리드 민감도를 줄이고 모델이 경계 없는 박스 크기를 예측하지 못하도록 박스 좌표 예측 공식이 업데이트되었습니다.

예측된 bounding box를 계산하기 위한 수정된 공식은 다음과 같습니다:

YOLOv5 revised bounding box x-coordinate formula YOLOv5 revised bounding box y-coordinate formula YOLOv5 revised bounding box width formula YOLOv5 revised bounding box height formula

스케일링 전후의 중심점 오프셋을 비교해 보십시오. 중심점 오프셋 범위는 (0, 1)에서 (-0.5, 1.5)로 조정되었습니다. 따라서 오프셋은 쉽게 0이나 1을 얻을 수 있습니다.

YOLOv5 grid scaling

조정 전후의 높이 및 너비 스케일링 비율(앵커 대비)을 비교해 보세요. 원래의 yolo/darknet 박스 방정식에는 심각한 결함이 있습니다. 너비와 높이는 단순히 out=exp(in)으로 처리되어 완전히 무제한적이며, 이는 폭주하는 그래디언트, 불안정성, NaN 손실, 궁극적으로는 학습의 완전한 실패로 이어질 수 있으므로 위험합니다. 자세한 내용은 Refer to this issue를 참조하세요.

YOLOv5 unbounded scaling

4.4 타겟 빌드(Build Targets)#

YOLOv5의 빌드 타겟 프로세스는 학습 효율성과 모델 accuracy에 매우 중요합니다. 이는 정답 박스(ground truth box)를 출력 맵의 적절한 그리드 셀에 할당하고 적절한 앵커 박스와 일치시키는 과정을 포함합니다.

이 과정은 다음 단계를 따릅니다:

  • Ground truth 박스 치수와 각 앵커 템플릿 치수의 비율을 계산합니다.

Ground truth to anchor width ratio formula

Ground truth to anchor height ratio formula

Maximum width ratio formula

Maximum height ratio formula

Overall maximum ratio formula

Anchor matching threshold formula

YOLOv5 IoU computation
  • 계산된 비율이 임계값 내에 있으면, ground truth 박스를 해당 앵커와 일치시킵니다.
YOLOv5 grid overlap
  • 수정된 중심점 오프셋으로 인해 ground truth 박스가 하나 이상의 앵커에 할당될 수 있다는 점을 유념하면서 일치된 앵커를 적절한 셀에 할당합니다. 중심점 오프셋 범위가 (0, 1)에서 (-0.5, 1.5)로 조정되어 추가 매칭이 가능해졌기 때문입니다.
YOLOv5 anchor selection

이러한 방식으로 타겟 빌드 과정은 각 ground truth 객체가 학습 과정에서 적절하게 할당되고 일치되도록 보장하여 YOLOv5가 객체 탐지 작업을 보다 효과적으로 학습할 수 있도록 합니다.

결론#

YOLOv5는 실시간 객체 탐지 발전의 의미 있는 단계를 나타냅니다. 아키텍처 선택, 학습 전략 및 엔지니어링 개선은 이전 YOLO 버전과 비교하여 강력한 성능과 효율성을 제공합니다.

YOLOv5의 주요 개선 사항으로는 동적 아키텍처 사용, 광범위한 데이터 증강 기법, 혁신적인 학습 전략, 손실 계산 및 타겟 빌드 과정의 중요한 조정 등이 있습니다. 이러한 모든 혁신은 YOLO 모델의 특징인 고속 성능을 유지하면서 객체 탐지의 정확도와 효율성을 크게 향상시킵니다.

댓글