Link to this sectionUltralytics YOLOv5 아키텍처#
YOLOv5 (v6.0/6.1)는 Ultralytics에서 개발한 강력한 객체 탐지(object detection) 알고리즘입니다. 본 문서에서는 YOLOv5 아키텍처, 데이터 증강 전략, 학습 방법론 및 손실 계산 기법에 대해 자세히 다룹니다. 이러한 포괄적인 이해는 감시 시스템, 자율 주행 차량 및 이미지 인식을 포함한 다양한 분야에서 객체 탐지를 실무에 적용하는 데 도움을 줄 것입니다.
Link to this section모델 구조#
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는 이전 버전과 비교하여 몇 가지 주목할 만한 개선 사항을 도입했습니다:
- 이전 버전에서 발견되던
Focus구조가6x6 Conv2d구조로 대체되었습니다. 이 변경은 효율성을 향상시킵니다 #4825. SPP구조가SPPF로 대체되었습니다. 이 변경 사항은 동일한 출력을 유지하면서 처리 속도를 두 배 이상 향상시킵니다.
SPP와 SPPF의 속도를 테스트하려면 다음 코드를 사용할 수 있습니다:
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.20780706405639648Link to this section데이터 증강 기법#
YOLOv5는 모델의 일반화 능력을 향상시키고 과적합을 줄이기 위해 다양한 데이터 증강 기법을 사용합니다. 이러한 기법에는 다음이 포함됩니다:
-
Mosaic 증강: 네 개의 학습 이미지를 하나로 결합하여 객체 탐지 모델이 다양한 객체 스케일과 변환을 더 잘 처리하도록 장려하는 이미지 처리 기법입니다.

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

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

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

-
Albumentations: 다양한 증강 기법을 지원하는 강력한 이미지 증강 라이브러리입니다. Albumentations 증강 사용하기에 대해 자세히 알아보십시오.
-
HSV 증강: 이미지의 색조(Hue), 채도(Saturation), 명도(Value)를 무작위로 변경합니다.

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

Link to this section학습 전략#
YOLOv5는 모델 성능을 향상시키기 위해 몇 가지 정교한 학습 전략을 적용합니다. 여기에는 다음이 포함됩니다:
- 다중 스케일 학습(Multiscale Training): 학습 과정 중에 입력 이미지는 원래 크기의 0.5배에서 1.5배 범위 내에서 무작위로 크기가 조정됩니다.
- AutoAnchor: 이 전략은 사용자 정의 데이터의 ground truth 박스 통계적 특성에 맞게 사전 앵커 박스를 최적화합니다.
- Warmup 및 Cosine LR 스케줄러: 모델 성능을 향상시키기 위해 학습률을 조정하는 방법입니다.
- 지수 이동 평균(EMA): 이전 단계의 매개변수 평균을 사용하여 학습 과정을 안정화하고 일반화 오류를 줄이는 전략입니다.
- 혼합 정밀도 학습: 절반 정밀도 형식으로 연산을 수행하여 메모리 사용량을 줄이고 계산 속도를 향상시키는 방법입니다.
- 하이퍼파라미터 진화(Hyperparameter Evolution): 최적의 성능을 달성하기 위해 하이퍼파라미터를 자동으로 튜닝하는 전략입니다. 하이퍼파라미터 튜닝에 대해 더 알아보십시오.
Link to this section추가 기능#
Link to this section4.1 손실 계산(Compute Losses)#
YOLOv5의 손실은 세 가지 개별 손실 구성 요소의 조합으로 계산됩니다:
- 클래스 손실 (BCE Loss): 이진 교차 엔트로피 손실로, 분류 작업에 대한 오류를 측정합니다.
- 객체 존재 손실 (BCE Loss): 또 다른 이진 교차 엔트로피 손실로, 특정 그리드 셀에 객체가 존재하는지 여부를 감지하는 오류를 계산합니다.
- 위치 손실 (CIoU Loss): 완전 IoU 손실로, 그리드 셀 내에서 객체의 위치를 파악하는 오류를 측정합니다.
전체 손실 함수는 다음과 같이 묘사됩니다:
Link to this section4.2 손실 균형(Balance Losses)#
세 개의 예측 레이어(P3, P4, P5)의 객체 존재 손실은 다르게 가중치가 부여됩니다. 균형 가중치는 각각 [4.0, 1.0, 0.4]입니다. 이 접근 방식은 서로 다른 스케일에서의 예측이 전체 손실에 적절하게 기여하도록 보장합니다.
Link to this section4.3 그리드 민감도 제거#
YOLOv5 아키텍처는 이전 YOLO 버전과 비교하여 박스 예측 전략에 몇 가지 중요한 변경 사항을 적용합니다. YOLOv2 및 YOLOv3에서는 박스 좌표가 마지막 레이어의 활성화를 사용하여 직접 예측되었습니다.
그러나 YOLOv5에서는 그리드 민감도를 줄이고 모델이 경계 없는 박스 크기를 예측하지 못하도록 박스 좌표 예측 공식이 업데이트되었습니다.
예측된 바운딩 박스 계산을 위한 수정된 공식은 다음과 같습니다:
스케일링 전후의 중심점 오프셋을 비교해 보십시오. 중심점 오프셋 범위는 (0, 1)에서 (-0.5, 1.5)로 조정되었습니다. 따라서 오프셋은 쉽게 0이나 1을 얻을 수 있습니다.
조정 전후의 높이 및 너비 스케일링 비율(앵커 기준)을 비교해 보십시오. 기존 yolo/darknet 박스 방정식에는 심각한 결함이 있습니다. 너비와 높이는 단순히 out=exp(in)으로 되어 있어 완전히 경계가 없으며, 이는 불안정성, NaN 손실, 궁극적으로는 학습의 완전한 실패로 이어질 수 있어 위험합니다. 자세한 내용은 이 이슈를 참조하십시오.
Link to this section4.4 타겟 빌드(Build Targets)#
YOLOv5의 타겟 빌드 과정은 학습 효율성과 모델 정확도에 매우 중요합니다. 여기에는 ground truth 박스를 출력 맵의 적절한 그리드 셀에 할당하고 적절한 앵커 박스와 일치시키는 작업이 포함됩니다.
이 과정은 다음 단계를 따릅니다:
- Ground truth 박스 치수와 각 앵커 템플릿 치수의 비율을 계산합니다.
- 계산된 비율이 임계값 내에 있으면, ground truth 박스를 해당 앵커와 일치시킵니다.
- 수정된 중심점 오프셋으로 인해 ground truth 박스가 하나 이상의 앵커에 할당될 수 있다는 점을 유념하면서 일치된 앵커를 적절한 셀에 할당합니다. 중심점 오프셋 범위가 (0, 1)에서 (-0.5, 1.5)로 조정되어 추가 매칭이 가능해졌기 때문입니다.
이러한 방식으로 타겟 빌드 과정은 각 ground truth 객체가 학습 과정에서 적절하게 할당되고 일치되도록 보장하여 YOLOv5가 객체 탐지 작업을 보다 효과적으로 학습할 수 있도록 합니다.
Link to this section결론#
YOLOv5는 실시간 객체 탐지 발전의 의미 있는 단계를 나타냅니다. 아키텍처 선택, 학습 전략 및 엔지니어링 개선은 이전 YOLO 버전과 비교하여 강력한 성능과 효율성을 제공합니다.
YOLOv5의 주요 개선 사항으로는 동적 아키텍처 사용, 광범위한 데이터 증강 기법, 혁신적인 학습 전략, 손실 계산 및 타겟 빌드 과정의 중요한 조정 등이 있습니다. 이러한 모든 혁신은 YOLO 모델의 특징인 고속 성능을 유지하면서 객체 탐지의 정확도와 효율성을 크게 향상시킵니다.