Ver Fonte

add boxes conversion function

quarrying há 3 anos atrás
pai
commit
41301e6caa
2 ficheiros alterados com 101 adições e 0 exclusões
  1. 1 0
      khandy/boxes/__init__.py
  2. 100 0
      khandy/boxes/boxes_convert.py

+ 1 - 0
khandy/boxes/__init__.py

@@ -1,6 +1,7 @@
 from .boxes_clip import *
 from .boxes_overlap import *
 from .boxes_filter import *
+from .boxes_convert import *
 
 from .boxes_transform_flip import *
 from .boxes_transform_rotate import *

+ 100 - 0
khandy/boxes/boxes_convert.py

@@ -0,0 +1,100 @@
+import numpy as np
+
+
+def convert_xyxy_to_xywh(boxes, copy=True):
+    """Convert [x_min, y_min, x_max, y_max] format to [x_min, y_min, width, height] format.
+    """
+    if copy:
+        boxes = boxes.copy()
+    boxes[:, 2:4] -= boxes[:, 0:2]
+    return boxes
+
+
+def convert_xywh_to_xyxy(boxes, copy=True):
+    """Convert [x_min, y_min, width, height] format to [x_min, y_min, x_max, y_max] format.
+    """
+    if copy:
+        boxes = boxes.copy()
+    boxes[:, 2:4] += boxes[:, 0:2]
+    return boxes
+
+
+def convert_xywh_to_cxcywh(boxes, copy=True):
+    """Convert [x_min, y_min, width, height] format to [cx, cy, width, height] format.
+    """
+    if copy:
+        boxes = boxes.copy()
+    boxes[:, 0:2] += boxes[:, 2:4] * 0.5
+    return boxes
+    
+    
+def convert_cxcywh_to_xywh(boxes, copy=True):
+    """Convert [cx, cy, width, height] format to [x_min, y_min, width, height] format.
+    """
+    if copy:
+        boxes = boxes.copy()
+    boxes[:, 0:2] -= boxes[:, 2:4] * 0.5
+    return boxes
+    
+    
+def convert_xyxy_to_cxcywh(boxes, copy=True):
+    """Convert [x_min, y_min, x_max, y_max] format to [cx, cy, width, height] format.
+    """
+    boxes = convert_xyxy_to_xywh(boxes, copy)
+    boxes = convert_xywh_to_cxcywh(boxes, False)
+    return boxes
+
+
+def convert_cxcywh_to_xyxy(boxes, copy=True):
+    """Convert [x_min, y_min, x_max, y_max] format to [cx, cy, width, height] format.
+    """
+    boxes = convert_cxcywh_to_xywh(boxes, copy)
+    boxes = convert_xywh_to_xyxy(boxes, False)
+    return boxes
+
+
+def convert_boxes_format(boxes, in_fmt, out_fmt, copy=True):
+    """Converts boxes from given in_fmt to out_fmt.
+
+    Supported in_fmt and out_fmt are:
+
+    'xyxy': boxes are represented via corners, x1, y1 being top left and x2, y2 being bottom right.
+
+    'xywh' : boxes are represented via corner, width and height, x1, y2 being top left, w, h being width and height.
+
+    'cxcywh' : boxes are represented via centre, width and height, cx, cy being center of box, w, h
+    being width and height.
+
+    Args:
+        boxes: boxes which will be converted.
+        in_fmt (str): Input format of given boxes. Supported formats are ['xyxy', 'xywh', 'cxcywh'].
+        out_fmt (str): Output format of given boxes. Supported formats are ['xyxy', 'xywh', 'cxcywh']
+
+    Returns:
+        boxes: Boxes into converted format.
+
+    References:
+        torchvision.ops.box_convert
+    """
+    allowed_fmts = ("xyxy", "xywh", "cxcywh")
+    if in_fmt not in allowed_fmts or out_fmt not in allowed_fmts:
+        raise ValueError("Unsupported Bounding Box Conversions for given in_fmt and out_fmt")
+    if copy:
+        boxes = boxes.copy()
+    if in_fmt == out_fmt:
+        return boxes
+
+    if (in_fmt, out_fmt) == ("xyxy", "xywh"):
+        boxes = convert_xyxy_to_xywh(boxes, copy=False)
+    elif (in_fmt, out_fmt) == ("xywh", "xyxy"):
+        boxes = convert_xywh_to_xyxy(boxes, copy=False)
+    elif (in_fmt, out_fmt) == ("xywh", "cxcywh"):
+        boxes = convert_xywh_to_cxcywh(boxes, copy=False)
+    elif (in_fmt, out_fmt) == ("cxcywh", "xywh"):
+        boxes = convert_cxcywh_to_xywh(boxes, copy=False)
+    elif (in_fmt, out_fmt) == ("xyxy", "cxcywh"):
+        boxes = convert_xyxy_to_cxcywh(boxes, copy=False)
+    elif (in_fmt, out_fmt) == ("cxcywh", "xyxy"):
+        boxes = convert_cxcywh_to_xyxy(boxes, copy=False)
+    return boxes
+