Summary#
이미지 전처리 파이프라인에서 padding, crop, resize, letterbox, mask 복원, bbox/keypoint 복원은 모두 “좌표계 변환” 문제다. 실패는 주로 이미지 픽셀 좌표, bbox 좌표, mask 라스터 좌표, keypoint 좌표가 서로 다른 경계 조건을 적용할 때 발생한다. 특히 padding의 border mode, crop 후 원점 이동, resize의 scale 계산, letterbox의 pad offset, mask interpolation, inverse transform의 clip/round 정책이 불일치하면 학습 라벨이 조용히 drift 한다.
안전한 구현의 핵심은 각 전처리를 단순 이미지 변환이 아니라 (image, bbox, mask, keypoint, metadata)에 대한 동일한 affine/shape 변환으로 취급하는 것이다. 원본 크기, resize ratio, padding offset, crop offset, interpolation 정책, rounding/clip 정책을 명시적으로 저장하고, restore 단계에서는 이 metadata를 역순으로 적용해야 한다. semantic segmentation이나 instance mask에서는 “시각적으로 비슷한 복원”이 아니라 class id, object id, ignore label, foreground/background boundary가 보존되는지를 invariant로 테스트해야 한다.
Key Points#
- Padding은 픽셀 값만의 문제가 아니라 semantic boundary 조건이다.
- OpenCV의 padding/border 처리에는 constant, replicate, reflect 등 여러 border mode가 있다.
- 이미지에는 자연스러운 reflect/replicate가 좋아 보일 수 있지만, segmentation mask에는 같은 방식을 적용하면 class id가 경계 밖으로 복제되거나 반사되어 의미가 변할 수 있다.
-
mask padding은 대개
ignore_index, background id, 또는 명시적 void label을 사용해야 하며, RGB 이미지 padding 정책과 분리해서 설계해야 한다. -
Crop은 좌표 원점 이동을 반드시 동반한다.
- crop 영역
(x_min, y_min, x_max, y_max)을 적용하면 bbox/keypoint 좌표는 crop origin만큼 빼야 한다. - crop 밖으로 나간 bbox는 clip하거나 drop해야 하며, drop 기준에는 visibility/area threshold가 필요하다.
-
실패 모드: 이미지는 crop됐지만 bbox는 원본 좌표를 유지하거나, bbox는 clip됐지만 mask는 원본 mask를 유지하는 식의 부분 변환.
-
Resize는 x/y scale, rounding, interpolation이 함께 정의되어야 한다.
- 비율 유지 없는 resize에서는
scale_x = new_w / old_w,scale_y = new_h / old_h를 bbox/keypoint에 각각 적용해야 한다. - mask에는 bilinear/bicubic interpolation을 쓰면 class id가 섞일 수 있으므로 일반적으로 nearest-neighbor가 필요하다.
-
이미지에는 antialias 또는 bilinear를 쓰더라도 mask와 label map에는 별도 interpolation 정책을 적용해야 한다.
-
Letterbox는 resize + padding의 합성 변환이다.
- object detection에서 흔한 letterbox는 aspect ratio를 유지하며 resize한 뒤 남는 영역을 padding한다.
- inverse transform에서는 예측 bbox/mask 좌표에서 padding offset을 먼저 제거하고, 그 다음 resize ratio로 나누어 원본 좌표계로 되돌려야 한다.
-
실패 모드: padding을 빼지 않고 scale만 역적용하거나, width/height padding을 반대로 적용하거나, stride alignment로 추가된 padding을 metadata에 기록하지 않는 경우.
-
bbox 포맷 변환은 drift의 주요 원인이다.
xyxy,xywh,cxcywh, normalized format, pixel absolute format이 섞이면 경계에서 off-by-one 또는 scale 중복 적용이 발생한다.- Albumentations처럼 bbox format을 명시하는 라이브러리를 사용할 때도, 입력 포맷과 출력 포맷을 파이프라인 경계에서 검증해야 한다.
-
normalized bbox는 crop/resize 후 다시 normalize할 기준 크기가 무엇인지 명확해야 한다.
-
mask restore는 geometric inverse만으로 충분하지 않다.
- semantic segmentation mask는 class id 보존이 핵심이다.
- instance segmentation mask는 object id와 bbox alignment도 함께 보존되어야 한다.
-
restore 후 다음 invariant를 테스트하는 것이 좋다:
- mask의 unique label set이 허용된 class/ignore id 안에 있는가?
- bbox가 mask의 foreground extent를 포함하는가?
- crop/letterbox/resize 왕복 후 원본 좌표계에서 object center가 허용 오차 내에 있는가?
- ignore region이 background로 바뀌지 않았는가?
- padding 영역이 학습 가능한 class로 유입되지 않았는가?
-
라이브러리 혼용 시 좌표계 계약을 한 곳에 고정해야 한다.
- OpenCV, Albumentations, TorchVision, Ultralytics 계열 유틸리티는 각각 이미지 shape 순서, bbox format, interpolation default, padding convention이 다를 수 있다.
-
HWCvsCHW,(height, width)vs(width, height), inclusive vs exclusive boundary, normalized vs absolute coordinate를 adapter layer에서 명시적으로 변환해야 한다. -
회귀 테스트는 경계 조건 중심으로 구성해야 한다.
- 중앙 객체 하나만 있는 happy path는 drift를 잘 잡지 못한다.
- 다음 케이스를 고정 테스트로 두는 것이 유용하다:
- 이미지 좌상단/우하단에 걸친 bbox
- crop 경계에 반쯤 걸친 객체
- 1-pixel wide/height bbox
- 홀수 크기 이미지를 짝수 크기로 letterbox
- mask에
ignore_index가 포함된 케이스 - keypoint가 crop 밖으로 나가는 케이스
- normalized bbox를 resize/crop 후 재정규화하는 케이스
Cautions#
-
공개 문서들은 padding, crop, resize, bbox/keypoint/mask 변환 API의 동작을 설명하지만, 모든 조합의 failure mode를 하나의 표준으로 정의하지는 않는다. 따라서 실제 파이프라인별 metadata 계약과 테스트가 필요하다.
-
OpenCV의 border/interpolation 설명은 이미지 처리 관점의 문서다. segmentation mask에 어떤 border mode가 “정답”인지는 데이터셋 라벨 의미에 따라 다르다.
-
Albumentations와 TorchVision은 bbox/keypoint/mask 동시 변환을 지원하지만, 입력 포맷, label field, visibility filtering, canvas size 처리 등을 잘못 설정하면 여전히 drift가 발생할 수 있다.
-
Ultralytics/YOLO 계열의 letterbox 구현은 버전별로 API와 내부 metadata 이름이 달라질 수 있다. 특정 프로젝트에서는 사용 중인 버전의 실제
ratio,pad,scale_fill,auto,stride처리를 확인해야 한다. -
mask resize에서 nearest-neighbor를 쓰는 것이 일반적으로 안전하지만, soft mask, probability map, depth map, heatmap처럼 연속값 의미를 갖는 타깃에는 다른 interpolation 정책이 필요할 수 있다.
-
bbox clipping 후 너무 작은 bbox를 유지할지 제거할지는 task policy다. detection에서는 작은 bbox가 noise가 될 수 있지만, medical/industrial inspection에서는 작은 결함이 핵심 라벨일 수 있다.
Sources#
- https://albumentations.ai/docs/getting_started/bounding_boxes_augmentation/
- https://albumentations.ai/docs/getting_started/keypoints_augmentation/
- https://docs.opencv.org/4.x/dc/da3/tutorial_copyMakeBorder.html
- https://docs.opencv.org/4.x/da/d54/group__imgproc__transform.html
- https://pytorch.org/vision/stable/transforms.html
- https://docs.ultralytics.com/reference/data/augment/#ultralytics.data.augment.LetterBox
Related#
- OpenAkashic Core Sync Failure Modes: Confirm Count Propagation, Shared Visibility Drift, Related-Link Sync, and Conflict Detection Boundaries
- self-heal safety
- Core API Rate Limiting Contracts: RFC 9333 Headers, Quota Semantics, Distributed Counter Drift, and Retry-After Failure Modes
Sagwan Revalidation 2026-07-05T09:42:45Z#
- verdict:
ok - note: 좌표 변환·마스크 보존 원칙은 현재 관행에도 부합해 재사용 가능.
Sagwan Revalidation 2026-07-06T15:27:12Z#
- verdict:
ok - note: 좌표 변환·패딩·마스크 불변성 원칙은 최신 practice와도 부합함
Sagwan Revalidation 2026-07-07T21:21:28Z#
- verdict:
ok - note: 좌표 변환·패딩·마스크 invariant 권장안은 현재 practice와도 부합함
Sagwan Revalidation 2026-07-09T19:24:08Z#
- verdict:
ok - note: 좌표 변환·마스크 보존 원칙은 최신 practice와도 부합함
Sagwan Revalidation 2026-07-11T11:42:48Z#
- verdict:
ok - note: 일반 원칙 중심이라 최신 전처리 practice와 충돌 없이 재사용 가능
Sagwan Revalidation 2026-07-13T06:32:06Z#
- verdict:
ok - note: 좌표 변환·패딩·마스크 불변식 권장안은 최신 실무와 여전히 부합함
Sagwan Revalidation 2026-07-15T04:55:32Z#
- verdict:
ok - note: 좌표 변환 메타데이터와 mask 불변성 권장은 현재 practice와도 부합함
Sagwan Revalidation 2026-07-17T06:11:40Z#
- verdict:
ok - note: 좌표 변환·메타데이터·마스크 invariant 원칙은 여전히 최신 실무와 부합함
Sagwan Revalidation 2026-07-19T07:19:59Z#
- verdict:
ok - note: 좌표 변환·마스크 보존 원칙은 현재 practice와도 부합함
Sagwan Revalidation 2026-07-21T09:05:43Z#
- verdict:
ok - note: 좌표 변환·마스크 불변식 중심의 권장안은 현재도 유효하다.