YOLOv5 모델 앙상블
📚 이 가이드는 mAP 및 재현율(Recall) 향상을 위해 테스트 및 추론 시 Ultralytics YOLOv5 🚀 모델 앙상블을 사용하는 방법을 설명합니다.
앙상블 학습에서:
앙상블 모델링은 다양한 모델링 알고리즘을 사용하거나 서로 다른 학습 데이터 세트를 사용하여 결과를 예측하기 위해 여러 다양한 모델을 생성하는 프로세스입니다. 그런 다음 앙상블 모델은 각 기본 모델의 예측을 집계하여 미확인 데이터에 대한 최종 예측 결과를 도출합니다. 앙상블 모델을 사용하는 동기는 예측의 일반화 오류를 줄이는 것입니다. 기본 모델이 다양하고 독립적인 한, 앙상블 접근 방식을 사용하면 모델의 예측 오류가 감소합니다. 이 접근 방식은 예측 시 대중의 지혜를 활용합니다. 앙상블 모델 내에 여러 기본 모델이 포함되어 있더라도, 단일 모델처럼 동작하고 성능을 발휘합니다.
시작하기 전에
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 픽셀에서 YOLOv5x를 COCO val2017로 테스트합니다. yolov5x.pt는 사용 가능한 가장 크고 정확한 모델입니다. yolov5s.pt, yolov5m.pt, yolov5l.pt 또는 커스텀 데이터셋 학습의 자체 체크포인트 ./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 --halfruns/train/exp-5/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/exp-3/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/exp-2
Done. (0.223s)
모델 앙상블의 이점
YOLOv5를 사용한 모델 앙상블은 여러 가지 장점을 제공합니다:
- 향상된 정확도: 위의 예시에서 보여주듯이, 여러 모델을 앙상블하면 mAP가 0.504에서 0.515로, mAR이 0.681에서 0.689로 증가합니다.
- 더 나은 일반화: 다양한 모델을 결합하면 과적합을 줄이고 다양한 데이터에서의 성능을 향상시킵니다.
- 향상된 강건성: 앙상블은 일반적으로 데이터의 노이즈 및 이상값에 더 강건합니다.
- 상호 보완적 강점: 서로 다른 모델은 서로 다른 유형의 객체 검출이나 다양한 환경 조건에서 탁월한 성능을 발휘할 수 있습니다.
주요 트레이드오프는 속도 지표에서 나타나듯이(단일 모델 22.4ms vs. 앙상블 39.5ms), 추론 시간이 증가한다는 점입니다.
모델 앙상블 사용 시기
다음 시나리오에서 모델 앙상블 사용을 고려하십시오:
- 추론 속도보다 정확도가 더 중요할 때
- 거짓 음성(false negative)을 최소화해야 하는 중요한 애플리케이션의 경우
- 다양한 조명, 가림, 또는 스케일을 가진 어려운 이미지를 처리할 때
- 최대 성능이 요구되는 대회나 벤치마킹 시
엄격한 지연 시간 요구 사항이 있는 실시간 애플리케이션의 경우, 단일 모델 추론이 더 적합할 수 있습니다.
지원 환경
Ultralytics는 프로젝트를 빠르게 시작할 수 있도록 CUDA, CUDNN, Python, PyTorch 등 필수 종속성이 사전 설치된 다양한 즉시 사용 가능한 환경을 제공합니다.
- 무료 GPU 노트북:
- Google Cloud: GCP 빠른 시작 가이드
- Amazon: AWS 빠른 시작 가이드
- Azure: AzureML 빠른 시작 가이드
- Docker: Docker 빠른 시작 가이드
프로젝트 상태
이 배지는 모든 YOLOv5 GitHub Actions 지속적 통합(CI) 테스트가 성공적으로 통과되고 있음을 나타냅니다. 이러한 CI 테스트는 학습, 검증, 추론, 내보내기, 벤치마크 등 다양한 핵심 측면에서 YOLOv5의 기능과 성능을 엄격하게 검사합니다. macOS, Windows, Ubuntu에서 일관적이고 안정적인 동작을 보장하며, 테스트는 매 24시간마다 그리고 새로운 커밋마다 실시됩니다.