class_docstr: VIABBoxParser parses `polygon` and `rect` shape attribute types. Polygons
  are converted into bboxes that surround the entire shape.
code: def bboxes(self, o) -> List[BBox]:
      boxes = []
      for shape in o["regions"]:
          label = self._get_label(o, shape["region_attributes"])
          if label in self.class_map._class2id:
              shape_attr = shape["shape_attributes"]
              if shape_attr["name"] == "polygon":
                  x, y = (
                      shape_attr["all_points_x"],
                      shape_attr["all_points_y"],
                  )
                  boxes.append(
                      BBox.from_xyxy(min(x), min(y), max(x), max(y))
                  )
              elif shape_attr["name"] == "rect":
                  boxes.append(
                      BBox.from_xywh(
                          shape_attr["x"],
                          shape_attr["y"],
                          shape_attr["width"],
                          shape_attr["height"],
                      )
                  )
      return boxes
  
imports: from icevision.imports import *
  from icevision.core import *
  from icevision.utils import *
  from icevision.parsers.parser import *
label_desc: Use image node_id 2 for calling the VIABBoxParser obj's underlying member method code with example usage: obj.bboxes(o) and returns: boxes