Ultralytics YOLO27:
Get Started

YOLOv5 모델 앙상블#

📚 이 가이드에서는 테스트 및 추론 중에 Ultralytics YOLOv5 🚀 모델 앙상블을 사용해 mAP와 재현율을 향상하는 방법을 설명합니다.

앙상블 학습에서 발췌:

앙상블 모델링은 여러 모델링 알고리즘을 사용하거나 서로 다른 훈련 데이터 세트를 사용하여 다양한 모델을 여러 개 만든 뒤 결과를 예측하는 과정입니다. 그런 다음 앙상블 모델은 각 기본 모델의 예측을 집계하여 미관측 데이터에 대한 최종 예측 하나를 생성합니다. 앙상블 모델을 사용하는 목적은 예측의 일반화 오차를 줄이는 것입니다. 기본 모델이 다양하고 독립적일수록 앙상블 접근 방식을 사용할 때 모델의 예측 오차가 감소합니다. 이 접근 방식은 예측에 집단 지성을 활용합니다. 앙상블 모델은 여러 기본 모델을 포함하지만 하나의 모델처럼 작동하고 성능을 발휘합니다.

시작하기 전에#

리포지토리를 복제하고 Python>=3.8.0 환경에서 requirements.txt를 설치합니다. 여기에는 PyTorch>=1.8이 포함됩니다. 모델과 데이터셋은 최신 YOLOv5 릴리스에서 자동으로 다운로드됩니다.

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

일반 테스트#

앙상블을 구성하기 전에 단일 모델의 기준 성능을 확인하세요. 이 명령은 이미지 크기 640픽셀로 COCO val2017에서 YOLOv5x를 테스트합니다. yolov5x.pt은 사용할 수 있는 가장 크고 정확한 모델입니다. 그 밖에 yolov5n.pt, yolov5s.pt, yolov5m.pt, yolov5l.pt 또는 사용자 지정 데이터셋을 학습해 얻은 자체 체크포인트(예: runs/train/exp/weights/best.pt)를 사용할 수 있습니다. 사용 가능한 모든 모델에 대한 자세한 내용은 사전 학습 체크포인트 표를 참조하세요.

python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half

출력:

val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)

Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients

val: Scanning '../datasets/coco/val2017' images and labels...4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:01<00:00, 2846.03it/s]
val: New cache created: ../datasets/coco/val2017.cache
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [02:30<00:00,  1.05it/s]
                 all       5000      36335      0.746      0.626       0.68       0.49
Speed: 0.1ms pre-process, 22.4ms inference, 1.4ms NMS per image at shape (32, 3, 640, 640)  # <--- baseline speed

Evaluating pycocotools mAP... saving runs/val/exp/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.504  # <--- baseline mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.688
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.546
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.351
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.551
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.644
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.382
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.628
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.681  # <--- baseline mAR
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.524
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.735
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.826

앙상블 테스트#

기존 val.py 또는 detect.py 명령에서 --weights 인자 뒤에 모델을 추가하면 테스트 및 추론 시 여러 사전 학습 모델을 앙상블할 수 있습니다. 다음 예제에서는 모델 2개의 앙상블을 테스트합니다:

  • YOLOv5x
  • YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half

runs/train/exp5/weights/best.pt과 같은 사용자 지정 가중치를 포함해 원하는 만큼 체크포인트를 나열할 수 있습니다. YOLOv5는 각 모델을 자동으로 실행하고, 이미지별 예측을 연결한 다음 NMS를 수행합니다.

출력:

val: data=./data/coco.yaml, weights=['yolov5x.pt', 'yolov5l6.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.6, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)

Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients  # Model 1
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients  # Model 2
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']  # Ensemble notice

val: Scanning '../datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:00<00:00, 49695545.02it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [03:58<00:00,  1.52s/it]
                 all       5000      36335      0.747      0.637      0.692      0.502
Speed: 0.1ms pre-process, 39.5ms inference, 2.0ms NMS per image at shape (32, 3, 640, 640)  # <--- ensemble speed

Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.515  # <--- ensemble mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.699
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.557
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.356
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.563
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.668
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.387
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.638
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.689  # <--- ensemble mAR
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.526
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.743
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.844

앙상블 추론#

앙상블 추론을 실행하려면 --weights 인자에 모델을 추가하세요:

python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images

출력:

YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)

Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']

image 1/2 /content/yolov5/data/images/bus.jpg: 640x512 4 persons, 1 bus, 1 tie, Done. (0.063s)
image 2/2 /content/yolov5/data/images/zidane.jpg: 384x640 3 persons, 2 ties, Done. (0.056s)
Results saved to runs/detect/exp2
Done. (0.223s)
YOLO inference result

모델 앙상블의 이점#

YOLOv5 모델 앙상블은 다음과 같은 여러 이점을 제공합니다:

  1. 정확도 향상: 위 예제에서 확인했듯이 여러 모델을 앙상블하면 mAP가 0.504에서 0.515로, mAR이 0.681에서 0.689로 증가합니다.
  2. 일반화 성능 향상: 다양한 모델을 결합하면 과적합을 줄이고 여러 데이터에 대한 성능을 개선할 수 있습니다.
  3. 견고성 강화: 앙상블은 일반적으로 데이터의 노이즈와 이상치에 더 강합니다.
  4. 상호 보완적인 강점: 모델마다 서로 다른 객체 유형이나 환경 조건에서 탐지 성능이 뛰어날 수 있습니다.

속도 지표에서 확인할 수 있듯이 주요한 단점은 추론 시간이 늘어난다는 것입니다(단일 모델 22.4ms, 앙상블 39.5ms).

모델 앙상블을 사용해야 하는 경우#

다음과 같은 상황에서 모델 앙상블 사용을 고려하세요:

  • 추론 속도보다 정확도가 중요한 경우
  • 위음성을 최소화해야 하는 중요한 애플리케이션의 경우
  • 조명 변화, 가림 또는 스케일 차이가 있는 까다로운 이미지를 처리하는 경우
  • 최고 성능이 필요한 대회 또는 벤치마킹의 경우

엄격한 지연 시간 요구사항이 있는 실시간 애플리케이션에는 단일 모델 추론이 더 적합할 수 있습니다.

지원 환경#

Ultralytics는 프로젝트를 빠르게 시작할 수 있도록 CUDA, CUDNN, Python, PyTorch 등 필수 종속성이 사전 설치된 다양한 즉시 사용 가능한 환경을 제공합니다.

프로젝트 상태#

YOLOv5 CI

이 배지는 모든 YOLOv5 GitHub Actions 지속적 통합(CI) 테스트가 성공적으로 통과했음을 나타냅니다. 이 CI 테스트는 학습, 검증, 추론, 내보내기, 벤치마크 등 여러 주요 측면에서 YOLOv5의 기능과 성능을 철저히 확인합니다. 테스트는 24시간마다 그리고 새 커밋이 있을 때마다 실행되어 macOS, Windows, Ubuntu에서 일관되고 안정적으로 작동하는지 확인합니다.

자주 묻는 질문#

  • 개수에 제한이 없습니다. --weights 뒤에 모든 체크포인트를 나열하세요(예: --weights yolov5x.pt yolov5l6.pt runs/train/exp/weights/best.pt). 추론 시간은 모델 수에 대략 비례해 증가합니다.

  • 예. NMS 전에 예측을 연결하므로 모든 모델은 같은 클래스 목록을 동일한 순서로 사용해 학습해야 합니다. 입력 크기와 아키텍처는 서로 달라도 됩니다.

  • 예. 같은 val.py 또는 detect.py 명령에 --augment을 추가하면 앙상블의 모든 모델에 TTA를 적용할 수 있습니다.

  • 앙상블은 models/experimental.py의 PyTorch Ensemble 모듈에서 처리되므로 .pt 체크포인트에만 적용됩니다. ONNX 또는 TensorRT 파일이 필요한 경우 각 모델을 별도로 내보내세요.

댓글