Ultralytics YOLO27:
Get Started

테스트 시 증강(TTA)#

📚 이 가이드에서는 YOLOv5 🚀의 테스트 및 추론 과정에서 테스트 시 증강(TTA)을 사용해 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

일반 테스트#

TTA를 사용하기 전에 비교 기준이 될 성능을 설정합니다. 이 명령은 이미지 크기 640픽셀로 COCO val2017에서 YOLOv5x를 테스트합니다. yolov5x.pt은 사용 가능한 모델 중 가장 크고 정확도가 높습니다. 그 밖에 yolov5n.pt, yolov5s.pt, yolov5m.pt, yolov5l.pt 또는 사용자 지정 데이터셋 학습에서 얻은 체크포인트인 runs/train/exp/weights/best.pt를 선택할 수 있습니다. 사용 가능한 모든 모델에 대한 자세한 내용은 YOLOv5 문서를 참조하세요.

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

TTA를 사용한 테스트#

TTA를 활성화하려면 기존 val.py 명령에 --augment을 추가하고, 더 나은 결과를 위해 이미지 크기를 약 30% 늘리세요. TTA가 활성화된 추론에서는 이미지를 좌우 반전하고 3가지 해상도에서 처리한 뒤 출력을 병합하므로, 일반 추론보다 보통 2~3배 더 오래 걸립니다. NMS 이전에 출력이 병합됩니다. 속도 저하의 일부는 이미지 크기 증가(832 대 640) 때문이고, 일부는 실제 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/exp2/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.833

TTA를 사용한 추론#

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)
YOLOv5 test time augmentations

PyTorch Hub TTA#

TTA는 모든 YOLOv5 PyTorch Hub 모델에 자동으로 통합되어 있으며, 추론 시 augment=True을 전달해 사용할 수 있습니다.

import torch

# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")  # 또는 yolov5m, yolov5x, custom

# Images
img = "https://ultralytics.com/images/zidane.jpg"  # 또는 file, PIL, OpenCV, numpy, multiple

# Inference
results = model(img, augment=True)  # <--- TTA 추론

# Results
results.print()  # 또는 .show(), .save(), .crop(), .pandas() 등입니다.

사용자 지정#

YOLOv5 forward_augment() 메서드에서 적용할 TTA 연산을 사용자 지정할 수 있습니다.

테스트 시 증강의 장점#

테스트 시 증강은 객체 탐지 작업에 다음과 같은 주요 이점을 제공합니다:

  • 정확도 향상: 위 결과에서 보듯이 TTA를 사용하면 mAP가 0.504에서 0.516으로, mAR이 0.681에서 0.696으로 증가합니다.
  • 소형 객체 탐지 개선: TTA는 특히 소형 객체 탐지 성능을 높이며, 작은 영역의 AP가 0.351에서 0.361로 향상됩니다.
  • 강건성 향상: 각 이미지의 여러 변형을 테스트하면 시야각, 조명 및 기타 환경 요인의 영향을 줄일 수 있습니다.
  • 간단한 구현: 기존 명령에 --augment 플래그를 추가하기만 하면 됩니다.

대신 추론 시간이 늘어나므로 속도보다 정확도를 우선하는 애플리케이션에 TTA가 더 적합합니다.

지원 환경#

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

프로젝트 상태#

YOLOv5 CI

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

자주 묻는 질문#

  • 각 이미지를 세 가지 크기와 좌우 반전으로 처리하고, NMS 전에 예측 결과를 병합합니다. 추가 시점은 연산량을 늘리는 대신 재현율을 높이며, 특히 소형 객체에서 효과적입니다.

  • 일반 추론보다 약 2~3배 더 오래 걸립니다. 비용의 일부는 더 큰 --img 크기에서 발생하므로, 크기를 늘리기 전에 GPU 메모리가 충분한지 확인하세요.

  • 640 대신 832처럼 해상도를 약 30% 높이면 다중 스케일 처리에서 활용할 수 있는 세부 정보가 늘어나며, 위 벤치마크에서 가장 좋은 결과를 얻었습니다.

  • 증강된 순방향 패스는 PyTorch DetectionModel에 포함되어 있으므로, --augment은 .pt 체크포인트에만 영향을 줍니다. 내보낸 ONNX, TensorRT 및 기타 형식에서는 이를 무시합니다.

댓글