Ultralytics YOLOv5 아키텍처
YOLOv5 (v6.0/6.1)는 Ultralytics에서 개발한 강력한 객체 감지 알고리즘입니다. 이 기사에서는 YOLOv5 아키텍처, 데이터 증강 전략, 훈련 방법론 및 손실 계산 기술에 대해 자세히 알아봅니다. 이 포괄적인 이해는 감시, 자율 주행 차량 및 이미지 인식을 포함한 다양한 분야에서 객체 감지의 실제 적용을 개선하는 데 도움이 될 것입니다.
1. 모델 구조
YOLOv5의 아키텍처는 세 가지 주요 부분으로 구성됩니다:
- Backbone: 이는 네트워크의 주요 부분입니다. YOLOv5의 경우 백본은 다음을 사용하여 설계되었습니다.
CSPDarknet53
구조로 변경되었으며, 이는 이전 버전에서 사용된 Darknet 아키텍처의 수정본입니다. - Neck: 이 부분은 백본과 헤드를 연결합니다. YOLOv5에서는
SPPF
(Spatial Pyramid Pooling - Fast) 및PANet
(Path Aggregation Network) 구조가 활용됩니다. - 헤드: 이 부분은 최종 출력을 생성하는 역할을 합니다. YOLOv5는 다음을 사용합니다.
YOLOv3 Head
이 목적을 위해.
모델의 구조는 아래 이미지에 나와 있습니다. 모델 구조에 대한 자세한 내용은 다음에서 확인할 수 있습니다. yolov5l.yaml
.
YOLOv5는 이전 모델에 비해 몇 가지 주목할 만한 개선 사항을 도입했습니다.
- 에 지정되어 있습니다.
Focus
구조는 a(으)로 대체되었으며,6x6 Conv2d
구조로 변경되었습니다. 이러한 변화는 효율성을 향상시킵니다. #4825. - 에 지정되어 있습니다.
SPP
구조로 대체되었습니다.SPPF
이러한 변경으로 처리 속도가 두 배 이상 빨라지면서도 동일한 출력을 유지할 수 있습니다.
속도를 테스트하려면 SPP
및 SPPF
, 다음 코드를 사용할 수 있습니다.
SPP vs 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는 모델의 일반화 능력을 향상시키고 과적합을 줄이기 위해 다양한 데이터 증강 기술을 사용합니다. 이러한 기술에는 다음이 포함됩니다.
-
Mosaic 데이터 증강: 객체 감지 모델이 다양한 객체 크기 및 변환을 더 잘 처리하도록 장려하는 방식으로 네 개의 훈련 이미지를 하나로 결합하는 이미지 처리 기술입니다.
-
복사-붙여넣기 증강: 이미지에서 임의의 패치를 복사하여 임의로 선택한 다른 이미지에 붙여넣어 새로운 훈련 샘플을 효과적으로 생성하는 혁신적인 데이터 증강 방법입니다.
-
임의의 아핀 변환: 여기에는 이미지의 임의 회전, 스케일링, 변환 및 기울이기가 포함됩니다.
-
MixUp 증강: 두 이미지와 연결된 레이블의 선형 조합을 취하여 합성 이미지를 만드는 방법입니다.
-
Albumentations: 다양한 증강 기법을 지원하는 강력한 이미지 증강 라이브러리입니다. Albumentations 증강 사용에 대해 자세히 알아보세요.
-
HSV 증강: 이미지의 색조, 채도 및 값에 대한 임의 변경.
-
임의의 수평 뒤집기: 이미지를 수평으로 임의로 뒤집는 증강 방법입니다.
3. 학습 전략
YOLOv5는 모델의 성능을 향상시키기 위해 여러 정교한 훈련 전략을 적용합니다. 여기에는 다음이 포함됩니다.
- 다중 스케일 훈련: 입력 이미지는 훈련 과정에서 원래 크기의 0.5~1.5배 범위 내에서 임의로 크기가 조정됩니다.
- AutoAnchor: 이 전략은 사용자 정의 데이터에서 ground truth 박스의 통계적 특성에 맞게 사전 앵커 박스를 최적화합니다.
- Warmup and Cosine LR Scheduler: 모델 성능을 향상시키기 위해 학습률을 조정하는 방법입니다.
- 지수 이동 평균(EMA): 학습 과정을 안정화하고 일반화 오류를 줄이기 위해 과거 단계에 대한 파라미터의 평균을 사용하는 전략입니다.
- 혼합 정밀도 훈련: 반정밀도 형식으로 연산을 수행하여 메모리 사용량을 줄이고 계산 속도를 향상시키는 방법입니다.
- 하이퍼파라미터 진화: 최적의 성능을 달성하기 위해 하이퍼파라미터를 자동으로 조정하는 전략입니다. 하이퍼파라미터 튜닝에 대해 자세히 알아보세요.
4. 추가 기능
4.1 손실 계산
YOLOv5의 손실은 세 가지 개별 손실 구성 요소의 조합으로 계산됩니다.
- 클래스 손실 (BCE 손실): 이진 교차 엔트로피 손실은 분류 작업에 대한 오류를 측정합니다.
- 객체성 손실 (BCE 손실): 또 다른 이진 교차 엔트로피 손실로, 특정 그리드 셀에 객체가 있는지 여부를 탐지하는 데 발생하는 오류를 계산합니다.
- 위치 손실 (CIoU 손실): Complete IoU 손실은 그리드 셀 내에서 객체 위치를 파악하는 데 발생하는 오류를 측정합니다.
전체 손실 함수는 다음과 같습니다.
4.2 손실 균형 조정
세 개의 예측 레이어의 객체성 손실(P3
, P4
, P5
)은 가중치가 다르게 부여됩니다. 밸런스 가중치는 [4.0, 1.0, 0.4]
각각. 이 접근 방식은 다양한 스케일에서의 예측이 총 손실에 적절하게 기여하도록 보장합니다.
4.3 그리드 민감도 제거
YOLOv5 아키텍처는 이전 버전의 YOLO와 비교하여 상자 예측 전략에 몇 가지 중요한 변경 사항을 적용했습니다. YOLOv2 및 YOLOv3에서는 상자 좌표가 마지막 레이어의 활성화를 사용하여 직접 예측되었습니다.
그러나 YOLOv5에서는 박스 좌표 예측 공식이 그리드 민감도를 줄이고 모델이 무한한 박스 크기를 예측하는 것을 방지하도록 업데이트되었습니다.
예측된 bounding box 계산을 위한 수정된 공식은 다음과 같습니다.
스케일링 전후의 중심점 오프셋을 비교합니다. 중심점 오프셋 범위는 (0, 1)에서 (-0.5, 1.5)로 조정됩니다. 따라서 오프셋은 쉽게 0 또는 1이 될 수 있습니다.
조정 전후의 높이 및 너비 스케일링 비율(앵커 기준)을 비교합니다. 원래 YOLO/Darknet 박스 방정식에는 심각한 결함이 있습니다. 너비와 높이는 단순히 out=exp(in)이기 때문에 완전히 제한이 없으며, 이는 폭주하는 기울기, 불안정성, NaN 손실 및 궁극적으로 훈련의 완전한 손실로 이어질 수 있으므로 위험합니다. 자세한 내용은 이 문제를 참조하세요.
4.4 타겟 구축
YOLOv5의 빌드 타겟 프로세스는 훈련 효율성과 모델 정확도에 매우 중요합니다. 여기에는 ground truth 박스를 출력 맵의 적절한 그리드 셀에 할당하고 적절한 앵커 박스와 일치시키는 과정이 포함됩니다.
이 프로세스는 다음 단계를 따릅니다.
- Ground Truth Box 크기와 각 앵커 템플릿 크기의 비율을 계산합니다.
- 계산된 비율이 임계값 내에 있으면 ground truth 상자를 해당 앵커와 일치시킵니다.
- 수정된 중심점 오프셋으로 인해 접지 실체 상자가 둘 이상의 앵커에 할당될 수 있다는 점을 염두에 두고 일치하는 앵커를 적절한 셀에 할당합니다. 중심점 오프셋 범위가 (0, 1)에서 (-0.5, 1.5)로 조정되기 때문입니다. GT Box를 더 많은 앵커에 할당할 수 있습니다.
이러한 방식으로 빌드 대상 프로세스는 각 ground truth 객체가 학습 프로세스 중에 적절하게 할당되고 일치되도록 보장하여 YOLOv5가 객체 감지 작업을 보다 효과적으로 학습할 수 있도록 합니다.
결론
결론적으로, YOLOv5는 실시간 객체 감지 모델 개발에 있어 중요한 진전을 나타냅니다. 다양한 새로운 기능, 개선 사항 및 학습 전략을 통합함으로써 성능과 효율성 면에서 이전 버전의 YOLO 제품군을 능가합니다.
YOLOv5의 주요 개선 사항으로는 동적 아키텍처, 광범위한 데이터 증강 기술, 혁신적인 훈련 전략, 손실 계산 및 대상 구축 프로세스의 중요한 조정 등이 있습니다. 이러한 모든 혁신은 YOLO 모델의 트레이드마크인 높은 수준의 속도를 유지하면서 객체 감지의 정확성과 효율성을 크게 향상시킵니다.