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

YOLOv5 아키텍처: backbone, neck, head 표시

YOLOv5는 이전 버전에 비해 몇 가지 주목할 만한 개선 사항을 도입했습니다.

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

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

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

import torch
import torch.nn as 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

2. 데이터 증강 기법

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

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

    4개의 이미지를 결합한 YOLOv5 Mosaic 데이터 증강

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

    인스턴스 분할을 위한 YOLOv5 Copy-Paste 증강

  • 무작위 아핀 변환(Random Affine Transformations): 여기에는 이미지의 무작위 회전, 크기 조정, 이동 및 기울이기가 포함됩니다.

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

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

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

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

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

    YOLOv5 HSV 색 공간 증강 예시

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

    YOLOv5 무작위 수평 뒤집기 증강

3. 학습 전략

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

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

4. 추가 기능

4.1 손실 계산

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

  • Classes 손실(BCE Loss): Binary Cross-Entropy 손실로, 분류 작업에 대한 오차를 측정합니다.
  • Objectness 손실(BCE Loss): 또 다른 Binary Cross-Entropy 손실로, 특정 그리드 셀에 객체가 존재하는지 여부를 감지하는 오차를 계산합니다.
  • Location 손실(CIoU Loss): Complete IoU 손실로, 그리드 셀 내에서 객체의 위치를 파악하는 오차를 측정합니다.

전체 손실 함수는 다음과 같이 표현됩니다.

YOLOv5 총 손실 함수 공식

4.2 손실 균형

세 가지 예측 레이어(P3, P4, P5)의 objectness 손실은 다르게 가중치가 부여됩니다. 균형 가중치는 각각 [4.0, 1.0, 0.4]입니다. 이 접근 방식은 다양한 스케일의 예측이 총 손실에 적절하게 기여하도록 보장합니다.

YOLOv5 objectness 손실 균형 공식

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

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

YOLOv5 unbounded scaling

4.4 타겟 빌드

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

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

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

Ground truth 대 앵커 너비 비율 공식

Ground truth 대 앵커 높이 비율 공식

최대 너비 비율 공식

최대 높이 비율 공식

전체 최대 비율 공식

앵커 일치 임계값 공식

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 모델의 특징인 빠른 속도를 유지하면서도 객체 감지의 정확도와 효율성을 크게 향상시킵니다.

댓글