객체 인식(Object Detection) 학습 데이터를 늘릴 때 이미지만 변형하면 Bounding Box 좌표가 어긋나는 문제를, 증강 방식별 좌표 계산식으로 정리한 글이다. 특히 회전 변환의 좌표 재계산을 파이썬 코드까지 붙여 다룬다.
핵심 포인트- 일반 이미지 증강과 달리 객체 인식은 증강된 이미지에 맞춰 Bounding Box 정보를 다시 잡아 줘야 해서, 이미지와 박스를 함께 증강할 필요가 있다.
- 좌표계는 라벨링 툴 LabelImg 의 픽셀 좌표 방식을 따른다. 좌상단이 원점(0,0)이고 오른쪽이 x, 아래쪽이 y 다.
- Bounding Box 는 좌상단과 우하단 좌표로 위치를 특정한다.
- 밝기·대비·색 필터 변환은 박스 좌표가 변하지 않으므로 기존 증강 방법을 그대로 써도 되며 이 글에서 다루지 않는다.
- 회전은 레터박스 같은 빈 영역이 생겨 전체 이미지 크기가 커지고 그에 따라 모든 좌표가 바뀌기 때문에 가장 복잡하다.
상세 정리- 크기 변환: 증감 비율을 R 이라 두면 이미지 크기와 Bounding Box 좌표를 같은 비율로 곱해 계산한다.
- 좌우 반전: 이미지 크기는 그대로이므로 height·width 는 유지되고, x 좌표만 뒤집으며 y_min·y_max 는 동일하다. 상하 반전은 반대로 x 가 고정되고 y 가 바뀐다.
- 회전 준비: 좌상단 원점 기준으로는 계산이 어려워, 이미지 중앙 (w/2, h/2) 을 원점으로 삼아 네 꼭짓점 좌표를 다시 쓴다. Bounding Box 의 네 모서리도 같은 기준으로 옮긴다.
- 회전 각도 제약을 명시한다. 너무 큰 각도는 학습에 방해가 되므로 ±5도 이내만 상정한다.
- 회전 공식: 2차원 평면에서 점을 원점 중심으로 θ 만큼 회전시키는 표준 변환식을 그대로 적용해, 회전된 이미지 크기와 박스 네 점의 좌표를 함께 구한다.
- 좌표 복원: 변환된 박스 좌표에서 다시 좌상단 원점 기준의 x_min·y_min·x_max·y_max 를 뽑는데, **회전 각도의 부호에 따라 min·max 를 가져올 점이 달라진다**. 반시계는 음수, 시계는 양수 각도로 둔다.
- 파이썬 구현의 처리 순서: 중심 기준 회전 각도를 ±5도 내에서 랜덤 지정 → 라디안 변환 → 확장된 이미지 영역(re_width, re_height) 계산 → 픽셀 좌표는 정수만 가능하므로 형변환.
- 박스는 좌상단을 첫 점으로 두고 반시계 방향으로 네 점을 지정한 뒤 회전 좌표를 구한다.
- 예외 처리: 변환 후 좌표가 이미지 범위를 벗어나지 않도록 조건문으로 잘라 내며, 시계 방향과 반시계 방향 각각에 대해 따로 처리한다.
왜 읽나객체 인식 데이터가 부족해 증강을 붙이려는 사람에게, 이미지와 함께 박스 좌표를 어떻게 다시 계산해야 하는지 수식과 코드로 알려준다.