콘텐츠로 건너뛰기

Ultralytics YOLOv5 아키텍처

YOLOv5 (v6.0/6.1)은 Ultralytics 에서 개발한 강력한 객체 감지 알고리즘입니다. 이 문서에서는 YOLOv5 아키텍처, 데이터 증강 전략, 훈련 방법론 및 손실 계산 기법에 대해 자세히 설명합니다. 이러한 포괄적인 이해는 감시, 자율 주행 차량, 이미지 인식 등 다양한 분야에서 객체 감지의 실제 적용을 개선하는 데 도움이 될 것입니다.

1. 모델 구조

YOLOv5의 아키텍처는 크게 세 부분으로 구성됩니다:

  • 백본: 네트워크의 본체입니다. YOLOv5 의 경우 백본은 다음을 사용하여 설계되었습니다. CSPDarknet53 구조는 이전 버전에서 사용된 다크넷 아키텍처를 수정한 것입니다.
  • : 이 부분은 백본과 헤드를 연결합니다. YOLOv5 에서 , SPPF (공간 피라미드 풀링 - 빠른) 및 PANet (경로 집계 네트워크) 구조를 활용합니다.
  • Head: 이 부분은 최종 출력을 생성하는 역할을 합니다. YOLOv5 에서는 YOLOv3 Head 를 사용하세요.

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

yolov5

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

  1. 그리고 Focus 구조가 이전 버전에서 발견되는 6x6 Conv2d 구조로 변경합니다. 이 변경으로 효율성 향상 #4825.
  2. 그리고 SPP 구조가 SPPF. 이렇게 변경하면 동일한 출력을 유지하면서 처리 속도가 두 배 이상 빨라집니다.

속도를 테스트하려면 SPP 그리고 SPPF를 사용하면 다음 코드를 사용할 수 있습니다:

SPP 대 SPPF 속도 프로파일링 예시(열려면 클릭)
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 는 모델의 일반화 능력을 향상시키고 과적합을 줄이기 위해 다양한 데이터 증강 기법을 사용합니다. 이러한 기법에는 다음이 포함됩니다:

  • 모자이크 증강: 객체 감지 모델이 다양한 객체 배율과 변환을 더 잘 처리할 수 있도록 4개의 훈련 이미지를 하나로 결합하는 이미지 처리 기법입니다.

    모자이크

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

    복사-붙여넣기

  • 랜덤 아핀 변환: 여기에는 이미지의 무작위 회전, 크기 조정, 이동 및 전단이 포함됩니다.

    랜덤-어파인

  • 믹스업 증강: 두 이미지와 관련 레이블을 선형적으로 조합하여 합성 이미지를 만드는 방법입니다.

    믹스업

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

  • HSV 증강: 이미지의 색조, 채도 및 값을 임의로 변경합니다.

    hsv

  • 무작위 수평 뒤집기: 이미지를 무작위로 가로로 뒤집는 증강 방식입니다.

    수평 뒤집기

3. 교육 전략

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

  • 멀티스케일 트레이닝: 훈련 과정에서 입력 이미지의 크기가 원래 크기의 0.5~1.5배 범위 내에서 임의로 조정됩니다.
  • 자동 앵커: 이 전략은 사용자 지정 데이터의 기준 데이터 상자의 통계적 특성과 일치하도록 이전 앵커 상자를 최적화합니다.
  • 워밍업 및 코사인 LR 스케줄러: 모델 성능을 향상시키기 위해 학습 속도를 조정하는 방법입니다.
  • 지수이동평균(EMA): 과거 단계의 매개변수 평균을 사용하여 학습 과정을 안정화하고 일반화 오류를 줄이는 전략입니다.
  • 혼합 정밀도 훈련: 반정밀 형식으로 연산을 수행하여 메모리 사용량을 줄이고 계산 속도를 향상시키는 방식입니다.
  • 하이퍼파라미터 진화: 최적의 성능을 달성하기 위해 하이퍼파라미터를 자동으로 조정하는 전략입니다. 하이퍼파라미터 튜닝에 대해 자세히 알아보세요.

4. 추가 기능

4.1 손실 계산

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

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

전체 손실 함수는 다음과 같이 표시됩니다:

손실

4.2 잔액 손실

세 가지 예측 레이어의 오브젝트니스 손실(P3, P4, P5)의 가중치는 다르게 적용됩니다. 밸런스 가중치는 다음과 같습니다. [4.0, 1.0, 0.4] 로 각각 설정합니다. 이 접근 방식은 서로 다른 규모의 예측이 총 손실에 적절하게 기여하도록 보장합니다.

객체 손실

4.3 그리드 감도 제거하기

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

b_x b_y b_w b_h

YOLOv5 그리드 계산

그러나 YOLOv5 에서는 그리드 감도를 줄이고 모델이 무한한 상자 치수를 예측하지 못하도록 상자 좌표를 예측하는 공식이 업데이트되었습니다.

예측된 바운딩 박스를 계산하는 수정된 공식은 다음과 같습니다:

bx by bw bh

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

YOLOv5 그리드 스케일링

조정 전과 후의 높이 및 너비 비율(앵커 기준)을 비교합니다. 원래의 yolo 상자 방정식에는 심각한 결함이 있습니다. 너비와 높이가 단순히 아웃=엑스(인)이므로 완전히 무한대이며, 이는 폭주 경사, 불안정성, NaN 손실 및 궁극적으로 훈련의 완전한 손실로 이어질 수 있으므로 위험합니다. 자세한 내용은 이 이슈를 참조하세요.

YOLOv5 무제한 확장

4.4 빌드 타겟

YOLOv5 의 목표 구축 프로세스는 학습 효율성과 모델 정확도에 매우 중요합니다. 여기에는 출력 맵의 적절한 그리드 셀에 기준점 상자를 할당하고 적절한 앵커 상자와 일치시키는 작업이 포함됩니다.

이 프로세스는 다음 단계를 따릅니다:

  • 기준점 상자 치수와 각 앵커 템플릿의 치수의 비율을 계산합니다.

rw

rh

rwmax

rhmax

rmax

일치

YOLOv5 IoU 계산

  • 계산된 비율이 임계값 내에 있으면 기준값 상자를 해당 앵커와 일치시킵니다.

YOLOv5 그리드 겹침

  • 수정된 중심점 오프셋으로 인해 기준점 상자를 두 개 이상의 앵커에 할당할 수 있다는 점을 염두에 두고 일치하는 앵커를 적절한 셀에 할당합니다. 중심점 오프셋 범위가 (0, 1)에서 (-0.5, 1.5)로 조정되었기 때문입니다. GT 박스를 더 많은 앵커에 할당할 수 있습니다.

YOLOv5 앵커 선택

이렇게 하면 빌드 타깃 프로세스는 학습 과정에서 각 실측 객체가 적절하게 할당되고 일치하는지 확인하여 YOLOv5 객체 감지 작업을 보다 효과적으로 학습할 수 있습니다.

결론

결론적으로, YOLOv5 은 실시간 객체 감지 모델 개발의 중요한 진전을 의미합니다. 다양한 새로운 기능, 개선 사항 및 훈련 전략을 통합하여 성능과 효율성 면에서 이전 버전의 YOLO 제품군을 능가합니다.

YOLOv5 의 주요 개선 사항으로는 동적 아키텍처 사용, 광범위한 데이터 증강 기술, 혁신적인 훈련 전략, 컴퓨팅 손실 및 목표 구축 프로세스의 중요한 조정이 있습니다. 이러한 모든 혁신은 YOLO 모델의 트레이드마크인 빠른 속도를 유지하면서 물체 감지의 정확성과 효율성을 크게 향상시킵니다.

📅1 년 전 생성됨 ✏️ 11 일 전 업데이트됨

댓글