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)
픽셀 기반 증강(밝기, 대비)은 바운딩 박스를 건드리지 않습니다. 기하학적 증강(플립, 크롭, 회전)은 좌표를 자동으로 업데이트합니다. 적용 예시:
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],
)
지원 사례:
- 비디오 어노테이션:
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
주요 설정:
| 매개변수 | 설명 | 기본값 |
|----------|------|--------|
| 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
아직 댓글이 없습니다.