홈으로 돌아가기

Albumentations의 Bbox 증강: 형식 및 오류

이 기사는 Albumentations에서 탐지 작업을 위한 바운딩 박스 증강 설정을 다룹니다. 좌표 형식, BboxParams 매개변수, 메타데이터 바인딩 및 마크업 오류 처리를 설명합니다. label_fields를 사용한 파이프라인 코드 예제.

Bbox 증강: Albumentations 완전 가이드
Advertisement 728x90

Albumentations에서 바운딩 박스 증강: 매개변수와 오류 처리

객체 탐지 작업에서 mAP 하락은 종종 모델 구조 문제 때문이 아니라, 증강 후 바운딩 박스의 불일치에서 비롯됩니다. 공간 변환은 객체 좌표와 이미지 자체를 동기화된 방식으로 업데이트해야 합니다. Albumentations는 A.BboxParams를 통해 이를 완벽하게 처리하며, pascal_voc, albumentations, coco, yolo, cxcywh 총 5가지 좌표 형식을 지원합니다.

잘못된 coord_format은 코드 오류 없이 박스를 조용히 이동시킬 수 있습니다. 640×480 이미지에서 (98,345)~(420,462) 박스를 각 형식으로 표현하면:

  • pascal_voc: [98, 345, 420, 462]
  • albumentations: [0.153, 0.719, 0.656, 0.962]
  • coco: [98, 345, 322, 117]
  • yolo: [0.405, 0.841, 0.503, 0.244]
  • cxcywh: [259, 403.5, 322, 117]

탐지 파이프라인 구축

import albumentations as A
import cv2
import numpy as np

train_transform = A.Compose([
    A.RandomCrop(width=450, height=450, p=1.0),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.2),
], bbox_params=A.BboxParams(
    coord_format='coco',
    label_fields=['class_labels'],
), seed=137)

픽셀 기반 증강(밝기, 대비)은 바운딩 박스를 건드리지 않습니다. 기하학적 증강(플립, 크롭, 회전)은 좌표를 자동으로 업데이트합니다. 적용 예시:

Google AdInline article slot
image = cv2.imread("image.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

bboxes = np.array([
    [23, 74, 295, 388],
    [377, 294, 252, 161],
    [333, 421, 49, 49],
], dtype=np.float32)

class_labels = np.array(['dog', 'cat', 'sports ball'])

result = train_transform(image=image, bboxes=bboxes, class_labels=class_labels)

augmented_image = result['image']
augmented_bboxes = result['bboxes']
augmented_labels = result['class_labels']

라이브러리는 경계 밖으로 나간 박스나 너무 작은 박스를 자동으로 필터링합니다.

바운딩 박스에 메타데이터 부착

label_fields 사용

클래스와 추가 데이터를 별도 배열로 전달:

bbox_params = A.BboxParams(
    coord_format='pascal_voc',
    label_fields=['class_labels', 'difficult_flags'],
)

result = transform(
    image=image,
    bboxes=bboxes,
    class_labels=['dog', 'cat', 'ball'],
    difficult_flags=[0, 0, 1],
)

지원 사례:

Google AdInline article slot
  • 비디오 어노테이션: frame_ids로 박스 출처 추적
  • 인스턴스 세그멘테이션: instance_ids로 마스크 연결
  • 트래킹: 클래스 ID + 트랙 ID를 추가 필드에

필터링 시 모든 배열이 자동 동기화됩니다.

내장 메타데이터

숫자 데이터는 bbox 배열에 열 추가:

bboxes = np.array([
    [23, 74, 295, 388, 1, 17],  # + class_id, track_id
    [377, 294, 252, 161, 2, 23],
], dtype=np.float32)

bbox_params = A.BboxParams(coord_format='coco')

품질 관리를 위한 A.BboxParams

주요 설정:

Google AdInline article slot

| 매개변수 | 설명 | 기본값 |

|----------|------|--------|

| coord_format | 좌표 형식 | 필수 |

| label_fields | 메타데이터 | [] |

| min_area | 최소 픽셀 면적 | 0.0 |

| min_visibility | 최소 가시 비율 | 0.0 |

| min_width/height | 크기 임계값 | 0.0 |

| clip_bboxes_on_input | 증강 전 클리핑 | False |

| filter_invalid_bboxes | 유효하지 않은 박스 제거 | False |

| max_accept_ratio | 최대 종횡비 | None |

불완전한 어노테이션 처리:

bbox_params = A.BboxParams(
    coord_format='yolo',
    label_fields=['class_labels'],
    clip_bboxes_on_input=True,
    filter_invalid_bboxes=True,
)

min_visibility=0.3은 크롭 후 가시 영역이 너무 적은 박스를 제거합니다. min_area=100은 작은 조각을 제외합니다.

크롭핑 전략과 흔한 함정

RandomCrop은 사용 불가능한 영역이 0인 박스를 만들 수 있습니다. 모범 사례:

  • 신호 보존을 위해 min_visibility > 0 설정
  • 과도한 필터링 피하기 위해 크롭 p < 1.0
  • 파이프라인 전/후 bbox 크기 분포 확인

흔한 문제:

  • 잘못된 coord_format (YOLO는 'yolo' 필요)
  • 클래스용 label_fields 누락
  • 지저분한 데이터셋에서 clip/filter 생략
  • min_ 매개변수 0으로 쓰레기 학습

주요 요약

  • coord_format 필수: 대부분 데이터셋은 pascal_voc, Ultralytics는 yolo
  • label_fields 자동 동기화 필터링 중 라벨
  • clip + filter 훈련 전 어노테이션 정리
  • min_visibility 0.3–0.5 크롭에 최적
  • 파이프라인 후 초기 배치 시각 검사

— Editorial Team

Advertisement 728x90

다음 읽기