Data Augmentation
데이터 증강은 뒤집기, 자르기, 색상 변경 등 기존 이미지를 무작위로 변환한 복사본으로 모델을 학습시켜 일반화 성능을 높입니다.
데이터 증강은 기존 예제에 플립, 크롭, 크기 조정, 색상 변경 및 이미지 혼합과 같은 무작위 변환을 적용해 학습 데이터셋의 다양성을 높입니다. 변환된 사본은 원래 라벨을 그대로 유지하므로 모델은 시점, 조명 및 위치가 달라져도 객체가 동일한 객체라는 점을 학습합니다. 새 이미지를 수집하고 라벨링하는 작업은 느리고 비용이 많이 듭니다. 따라서 증강은 과적합을 방지하는 가장 저렴한 방법이며, 거의 모든 최신 컴퓨터 비전 모델이 증강을 사용해 학습합니다.
데이터 증강의 작동 방식#
대부분의 학습 파이프라인은 온라인 증강을 사용합니다. 데이터 로더가 배치를 구성할 때 각 이미지를 변환하고 매번 새로운 무작위 파라미터를 선택하므로, 에포크마다 이미지의 서로 다른 버전을 보게 됩니다. 오프라인 증강은 학습 전에 변환된 사본을 정해진 수만큼 디스크에 저장하는 방식으로, 저장 공간을 늘리고 모델이 접하는 고유한 변형의 수를 크게 줄입니다.
증강이 데이터를 왜곡하지 않도록 두 가지 규칙을 지켜야 합니다. 첫째, 라벨은 픽셀과 함께 이동해야 합니다. 객체 탐지, 인스턴스 세그멘테이션, 포즈 추정에서는 기하학적 변환을 적용할 때 모든 바운딩 박스, 마스크, 키포인트를 업데이트해야 하며, 수평 반전에서는 좌우 키포인트도 서로 바꿔야 합니다. 둘째, 실제 환경에서 일어날 수 있는 변환이어야 합니다. 수직 반전은 항공 이미지와 현미경 이미지에 적합하지만, 거리 장면에서는 추론 시점에 나타나지 않는 거꾸로 된 자동차를 만듭니다. 이미지와 함께 박스를 전달하면 Torchvision 변환이 첫 번째 규칙을 자동으로 처리합니다.
from urllib.request import urlopen
from PIL import Image
from torchvision import tv_tensors
from torchvision.transforms import v2
image = Image.open(urlopen("https://ultralytics.com/images/bus.jpg")) # 810 x 1080 pixels
boxes = tv_tensors.BoundingBoxes([[50, 400, 250, 900]], format="XYXY", canvas_size=(1080, 810))
# Flip every time (p=1.0) and shift colors; the box must move with the pixels
augment = v2.Compose([v2.RandomHorizontalFlip(p=1.0), v2.ColorJitter(brightness=0.4, saturation=0.7)])
new_image, new_boxes = augment(image, boxes)
print(f"Original box: {boxes.tolist()}")
print(f"Flipped box: {new_boxes.tolist()}")이미지 왼쪽에 있는 남성 주변의 박스는 810픽셀 너비를 기준으로 좌우 반전되어 [50, 400, 250, 900]에서 [560, 400, 760, 900]로 이동합니다. 반면 색상 지터는 박스를 건드리지 않고 픽셀만 변경합니다.
일반적인 기법#
- 기하학적 변환: 플립, 회전, 크기 조정, 이동, 크롭, 기울이기 및 원근 왜곡으로 다양한 카메라 위치와 객체 크기를 모사합니다.
- 광도 변환: 밝기, 대비, 채도 및 색조를 변경하고 블러와 노이즈를 추가해 다양한 조명, 센서 및 이미지 품질을 모사합니다.
- 가림: 랜덤 지우기와 컷아웃으로 사각형 영역을 비워 모델이 객체의 특정 부분 하나에 의존하지 못하게 합니다.
- 이미지 혼합: MixUp은 이미지 두 장과 라벨을 혼합하고, CutMix는 한 이미지의 패치를 다른 이미지에 붙여 넣습니다. 모자이크는 이미지 네 장을 하나의 학습 샘플로 타일링하며, 복사-붙여넣기는 세그멘테이션된 객체를 새 배경으로 옮깁니다.
- 자동화된 정책: RandAugment는 변환 수와 강도라는 두 가지 설정만으로 제어되는 무작위 변환 시퀀스를 적용해, 이전에 학습된 정책에서 필요했던 비용이 큰 탐색 과정을 없앱니다.
객체 검출을 위한 증강 파이프라인#
검출 파이프라인은 여러 변환을 연결하고 각각에 자체 확률을 적용하므로 모든 학습 이미지가 서로 다른 무작위 조합을 받습니다.
Ultralytics YOLO 학습은 기본적으로 이 파이프라인을 실행합니다. 모든 이미지에 모자이크를 적용하고(mosaic=1.0), 수평 플립을 50% 확률로 적용하며(fliplr=0.5), 최대 ±50% 크기 조정과 HSV 색상 변경을 적용합니다. 마지막 10개 에포크에서는 모자이크를 끄고(close_mosaic=10) 모델이 완전하고 자연스러운 이미지로 학습을 마치도록 합니다.
from ultralytics import YOLO
# 사전 학습된 YOLO26n 모델을 불러옵니다
model = YOLO("yolo26n.pt")
# fliplr: 수평 플립 확률; scale: 확대/축소 범위(+/- 70%); degrees: 회전 범위(+/- 5)
results = model.train(data="coco8.yaml", epochs=10, fliplr=0.5, scale=0.7, degrees=5.0)이 실행 중 YOLO26 트레이너는 박스를 그린 첫 번째 증강 배치 세 개를 train_batch0.jpg, train_batch1.jpg 및 train_batch2.jpg으로 저장하므로, 긴 학습을 시작하기 전에 각 설정의 효과를 확인할 수 있습니다.










