Ultralytics YOLOv5 아키텍처
YOLOv5 (v6.0/6.1)은 Ultralytics 에서 개발한 강력한 객체 감지 알고리즘입니다. 이 문서에서는 YOLOv5 아키텍처, 데이터 증강 전략, 훈련 방법론 및 손실 계산 기법에 대해 자세히 설명합니다. 이러한 포괄적인 이해는 감시, 자율 주행 차량, 이미지 인식 등 다양한 분야에서 객체 감지의 실제 적용을 개선하는 데 도움이 될 것입니다.
1. 모델 구조
YOLOv5의 아키텍처는 크게 세 부분으로 구성됩니다:
- 백본: 네트워크의 본체입니다. YOLOv5 의 경우 백본은 다음을 사용하여 설계되었습니다.
CSPDarknet53
구조는 이전 버전에서 사용된 다크넷 아키텍처를 수정한 것입니다. - 목: 이 부분은 백본과 헤드를 연결합니다. YOLOv5 에서 ,
SPPF
(공간 피라미드 풀링 - 빠른) 및PANet
(경로 집계 네트워크) 구조를 활용합니다. - Head: 이 부분은 최종 출력을 생성하는 역할을 합니다. YOLOv5 에서는
YOLOv3 Head
를 사용하세요.
모델의 구조는 아래 이미지에 나와 있습니다. 모델 구조에 대한 자세한 내용은 다음에서 확인할 수 있습니다. yolov5l.yaml
.
YOLOv5 이전 버전에 비해 몇 가지 주목할 만한 개선 사항을 도입했습니다:
- 그리고
Focus
구조가 이전 버전에서 발견되는6x6 Conv2d
구조로 변경합니다. 이 변경으로 효율성 향상 #4825. - 그리고
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()
2. 데이터 증강 기술
YOLOv5 는 모델의 일반화 능력을 향상시키고 과적합을 줄이기 위해 다양한 데이터 증강 기법을 사용합니다. 이러한 기법에는 다음이 포함됩니다:
-
모자이크 증강: 객체 감지 모델이 다양한 객체 배율과 변환을 더 잘 처리할 수 있도록 4개의 훈련 이미지를 하나로 결합하는 이미지 처리 기법입니다.
-
복사-붙여넣기 증강: 이미지에서 무작위로 패치를 복사하여 무작위로 선택한 다른 이미지에 붙여넣어 새로운 학습 샘플을 효과적으로 생성하는 혁신적인 데이터 증강 방법입니다.
-
랜덤 아핀 변환: 여기에는 이미지의 무작위 회전, 크기 조정, 이동 및 전단이 포함됩니다.
-
믹스업 증강: 두 이미지와 관련 레이블을 선형적으로 조합하여 합성 이미지를 만드는 방법입니다.
-
문서화: 다양한 증강 기술을 지원하는 강력한 이미지 증강 라이브러리입니다. 문서화 증강 기능 사용에 대해 자세히 알아보세요.
-
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에서는 마지막 레이어의 활성화를 사용하여 박스 좌표를 직접 예측했습니다.
그러나 YOLOv5 에서는 그리드 감도를 줄이고 모델이 무한한 상자 치수를 예측하지 못하도록 상자 좌표를 예측하는 공식이 업데이트되었습니다.
예측된 바운딩 박스를 계산하는 수정된 공식은 다음과 같습니다:
스케일링 전후의 중심점 오프셋을 비교합니다. 중심점 오프셋 범위는 (0, 1)에서 (-0.5, 1.5)까지 조정됩니다. 따라서 오프셋은 쉽게 0 또는 1이 될 수 있습니다.
조정 전과 후의 높이 및 너비 비율(앵커 기준)을 비교합니다. 원래의 yolo 상자 방정식에는 심각한 결함이 있습니다. 너비와 높이가 단순히 아웃=엑스(인)이므로 완전히 무한대이며, 이는 폭주 경사, 불안정성, NaN 손실 및 궁극적으로 훈련의 완전한 손실로 이어질 수 있으므로 위험합니다. 자세한 내용은 이 이슈를 참조하세요.
4.4 빌드 타겟
YOLOv5 의 목표 구축 프로세스는 학습 효율성과 모델 정확도에 매우 중요합니다. 여기에는 출력 맵의 적절한 그리드 셀에 기준점 상자를 할당하고 적절한 앵커 상자와 일치시키는 작업이 포함됩니다.
이 프로세스는 다음 단계를 따릅니다:
- 기준점 상자 치수와 각 앵커 템플릿의 치수의 비율을 계산합니다.
- 계산된 비율이 임계값 내에 있으면 기준값 상자를 해당 앵커와 일치시킵니다.
- 수정된 중심점 오프셋으로 인해 기준점 상자를 두 개 이상의 앵커에 할당할 수 있다는 점을 염두에 두고 일치하는 앵커를 적절한 셀에 할당합니다. 중심점 오프셋 범위가 (0, 1)에서 (-0.5, 1.5)로 조정되었기 때문입니다. GT 박스를 더 많은 앵커에 할당할 수 있습니다.
이렇게 하면 빌드 타깃 프로세스는 학습 과정에서 각 실측 객체가 적절하게 할당되고 일치하는지 확인하여 YOLOv5 객체 감지 작업을 보다 효과적으로 학습할 수 있습니다.
결론
결론적으로, YOLOv5 은 실시간 객체 감지 모델 개발의 중요한 진전을 의미합니다. 다양한 새로운 기능, 개선 사항 및 훈련 전략을 통합하여 성능과 효율성 면에서 이전 버전의 YOLO 제품군을 능가합니다.
YOLOv5 의 주요 개선 사항으로는 동적 아키텍처 사용, 광범위한 데이터 증강 기술, 혁신적인 훈련 전략, 컴퓨팅 손실 및 목표 구축 프로세스의 중요한 조정이 있습니다. 이러한 모든 혁신은 YOLO 모델의 트레이드마크인 빠른 속도를 유지하면서 물체 감지의 정확성과 효율성을 크게 향상시킵니다.