테스트 시간 증강(TTA)#
📚 이 가이드는 YOLOv5 🚀에서 mAP와 Recall을 향상하기 위해 테스트 및 추론 시 Test Time Augmentation (TTA)을 사용하는 방법을 설명합니다.
시작하기 전에#
requirements.txt 저장소를 클론하고 Python>=3.8.0 환경에 설치하며, PyTorch>=1.8을 포함합니다. 모델 및 데이터셋은 최신 YOLOv5 릴리스에서 자동으로 다운로드됩니다.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install일반 테스트 수행#
TTA를 시도하기 전에 비교할 기준 성능을 설정하려고 합니다. 이 명령어는 이미지 크기 640픽셀에서 COCO val2017에 대해 YOLOv5x를 테스트합니다. yolov5x.pt은 사용 가능한 가장 크고 가장 정확한 모델입니다. 다른 옵션으로는 yolov5s.pt, yolov5m.pt, yolov5l.pt이 있거나 커스텀 데이터셋을 학습하여 얻은 사용자 지정 체크포인트 ./weights/best.pt를 사용할 수 있습니다. 사용 가능한 모든 모델에 대한 자세한 내용은 YOLOv5 documentation을 참조하세요.
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.826TTA를 사용한 테스트#
TTA를 활성화하려면 기존 val.py 명령어에 --augment을 추가하고, 향상된 결과를 위해 이미지 크기를 약 30% 늘립니다. 이미지가 좌우 반전되어 3가지 서로 다른 해상도로 처리된 후 NMS 전에 출력이 병합되므로, TTA가 활성화된 상태에서의 추론은 일반적으로 일반 추론보다 약 2~3배의 시간이 소요됩니다. 속도 저하의 일부는 단순히 더 큰 이미지 크기(640 대신 832) 때문이고, 일부는 실제 TTA 연산 때문이므로, --img을 늘리기 전에 GPU에 충분한 메모리 여유가 있는지 확인하십시오.
python val.py --weights yolov5x.pt --data coco.yaml --img 832 --augment --half출력:
val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=832, conf_thres=0.001, iou_thres=0.6, task=val, device=, single_cls=False, augment=True, 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...
/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /pytorch/c10/core/TensorImpl.h:1156.)
return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)
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, 2885.61it/s]
val: New cache created: ../datasets/coco/val2017.cache
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [07:29<00:00, 2.86s/it]
all 5000 36335 0.718 0.656 0.695 0.503
Speed: 0.2ms pre-process, 80.6ms inference, 2.7ms NMS per image at shape (32, 3, 832, 832) # <--- TTA speed
Evaluating pycocotools mAP... saving runs/val/exp-2/yolov5x_predictions.json...
...
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.516 # <--- TTA mAP
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.701
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.562
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.361
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.564
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.656
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.388
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.640
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.696 # <--- TTA mAR
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.553
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.744
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.833TTA를 사용한 추론#
detect.py TTA 추론은 val.py TTA와 동일하게 작동합니다. 기존 detect.py 명령어에 단순히 --augment를 추가하기만 하면 됩니다.
python detect.py --weights yolov5s.pt --img 832 --source data/images --augment출력:
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
Downloading https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt to yolov5s.pt...
100% 14.1M/14.1M [00:00<00:00, 81.9MB/s]
Fusing layers...
Model Summary: 224 layers, 7266973 parameters, 0 gradients
image 1/2 /content/yolov5/data/images/bus.jpg: 832x640 4 persons, 1 bus, 1 fire hydrant, Done. (0.029s)
image 2/2 /content/yolov5/data/images/zidane.jpg: 480x832 3 persons, 3 ties, Done. (0.024s)
Results saved to runs/detect/exp
Done. (0.156s)
PyTorch Hub TTA#
TTA는 모든 YOLOv5 PyTorch Hub 모델에 자동으로 통합되며, 추론 시점에 augment=True을 전달하여 액세스할 수 있습니다.
import torch
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s") # or yolov5m, yolov5x, custom
# Images
img = "https://ultralytics.com/images/zidane.jpg" # or file, PIL, OpenCV, numpy, multiple
# Inference
results = model(img, augment=True) # <--- TTA inference
# Results
results.print() # or .show(), .save(), .crop(), .pandas(), etc.사용자 지정#
YOLOv5 forward_augment() method에 적용되는 TTA 연산을 커스터마이즈할 수 있습니다.
테스트 시간 증강의 이점#
Test-Time Augmentation은 object detection 작업에 몇 가지 주요 이점을 제공합니다:
- 향상된 정확도: 위 결과에서 볼 수 있듯이, TTA는 mAP를 0.504에서 0.516으로, mAR을 0.681에서 0.696으로 증가시킵니다.
- 더 나은 소형 객체 탐지: TTA는 특히 소형 객체 탐지를 향상하며, 소형 영역 AP가 0.351에서 0.361로 개선됩니다.
- 향상된 견고성: TTA는 각 이미지의 여러 변형을 테스트함으로써 보기 각도, 조명 및 기타 환경적 요인의 영향을 줄입니다.
- 간단한 구현: 기존 명령어에
--augment플래그를 추가하기만 하면 됩니다.
그 대가로 추론 시간이 증가하므로 TTA는 속도보다 정확도가 우선시되는 애플리케이션에 더 적합합니다.
지원되는 환경#
Ultralytics는 프로젝트를 빠르게 시작할 수 있도록 CUDA, CUDNN, Python, PyTorch와 같은 필수 종속성이 미리 설치된 다양한 즉시 사용 가능한 환경을 제공합니다.
- 무료 GPU 노트북:
- Google Cloud: GCP 퀵스타트 가이드
- Amazon: AWS 빠른 시작 가이드
- Azure: AzureML 빠른 시작 가이드
- Docker: Docker 퀵스타트 가이드
프로젝트 상태#
이 배지는 모든 YOLOv5 GitHub Actions CI(Continuous Integration) 테스트가 성공적으로 통과되었음을 나타냅니다. 이 CI 테스트들은 학습, 검증, 추론, 내보내기, 벤치마크 등 다양한 핵심 측면에서 YOLOv5의 기능과 성능을 엄격하게 확인합니다. 테스트는 24시간마다 그리고 새로운 커밋이 발생할 때마다 수행되며 macOS, Windows, Ubuntu에서 일관되고 안정적인 작동을 보장합니다.