본문 바로가기
Object Detection/Etc

[Object Detection] bounding box coordinates 설명과 pytorch 구현

by pulluper 2021. 5. 9.
반응형

안녕하세요 "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 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 부분의 수식은 다음과 같습니다.

center to 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 부분의 수식입니다.

corner to 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

댓글