안녕하세요 "pulluper" 입니다.
오늘은 object detection 에서 실제 box 를 다룰때의 2가지의 좌표를 알아보고 서로 바꾸는 코드를 pytorch로 알아보겠습니다. :-)
object detection box coordinates
object detection 에서는 bounding box 를 다룰 때, 보통 2가지 coordinate 로 box 를 다룹니다.
- center coordinates
- corner coordinates
특히 IoU(loss) 를 다룰때는 corner coordinates 를 사용하며,
anchor 나 MSELoss 를 다룰때는 center coordinates 를 사용합니다.
위 사진에서 파란 색으로 표시된 좌표는 bounding box를 좌상점과 우하점으로 나타내는 corner coordinates 이며,
빨간색으로 표시된 좌표는 bounding box를 중심점과 width, height 로 나타내는 center coordinates 입니다.
The code of transform box coordinates
object detection 구현에서 두 좌표는 자주 변경이 되며, dataset 마다 annotation 이 되는 기준도 다르기 때문에 서로 변경해주는 코드가 필요합니다.
- center_to_corner
- corner_to_center
input 은 [N, 4] 의 float32 type의 tensor 라고 가정하겠습니다. 먼저 center -> corner 부분의 수식은 다음과 같습니다.
이를 pytorch 코드로 옮기면, 아래와 같습니다.
def corner_to_center(corner_boxes):
"""
input
corner_boxes : corner coordinates boxes : [N, 4] (x1, y1, x2, y2)
output
center_boxes : center coordinates boxes : [N, 4] (cx, cy, w, h)
"""
cxcy = (corner_boxes[..., :2] + corner_boxes[..., 2:4]) / 2
wh = corner_boxes[..., 2:4] - corner_boxes[..., :2]
centor_boxes = torch.cat([cxcy, wh], dim=-1)
return centor_boxes
이번에는 corner -> center 부분의 수식입니다.
이것은 다음과 같이 코드로 작성 할 수 있습니다.
def center_to_corner(center_boxes):
"""
input
center_boxes : center coordinates boxes : [N, 4] (cx, cy, w, h)
output
corner_boxes : corner coordinates boxes : [N, 4] (x1, y1, x2, y2)
"""
x1y1 = center_boxes[..., :2] - (center_boxes[..., 2:4])/2
x2y2 = center_boxes[..., :2] + (center_boxes[..., 2:4])/2
corner_boxes = torch.cat([x1y1, x2y2], dim=-1)
return corner_boxes
확인을 위해서 다음과 같은 좌표를 가지는 corner coordinates를 갖는 이미지가 있다고 합니다.
이후 다음 코드를 실행시키면 center box 가 나오고 그것을 다시 corner box 로 바꾸면 원래의 좌표가 나와야합니다.
import torch
if __name__ == '__main__':
corner_boxes = torch.FloatTensor([[10, 30, 140, 135],
[90, 10, 117, 43]])
center_boxes = corner_to_center(corner_boxes)
print(center_boxes)
corner_boxes = center_to_corner(center_boxes)
print(corner_boxes)
결과
tensor([[ 75.0000, 82.5000, 130.0000, 105.0000],
[103.5000, 26.5000, 27.0000, 33.0000]])
tensor([[ 10., 30., 140., 135.],
[ 90., 10., 117., 43.]])
네 오늘은 bouning box 를 실제로 다룰때의 2가지 좌표에 대하여 알아보았는데요,
실제 구현시 꼭 필요한 부분이므로 한번쯤은 정리 해 두셔도 좋을것 같네요
댓글과 질문은 항상 환영합니다. 감사합니다. :0
'Object Detection > Etc' 카테고리의 다른 글
[Object Detection] Anchor Box 설명과 pytorch 구현 (0) | 2022.03.29 |
---|
댓글