code: def invert_normalize_bounding_boxes(
      bounding_boxes, bounding_boxes_old
  ):
      ntype = estimate_normalization_type(bounding_boxes_old)
      if ntype == "None":
          assert bounding_boxes is None, (
              "Expected (normalized) 'bounding_boxes' to be None due "
              "(unnormalized) 'bounding_boxes_old' being None. Got type %s "
              "instead." % (type(bounding_boxes),)
          )
          return bounding_boxes
      if ntype in ["array[float]", "array[int]", "array[uint]"]:
          assert len(bounding_boxes) == 1, (
              "Expected a single BoundingBoxesOnImage instance after "
              "normalization due to getting a single ndarray before "
              "normalization. Got %d instances instead."
              % (len(bounding_boxes),)
          )
          input_dtype = bounding_boxes_old.dtype
          return restore_dtype_and_merge(
              [bbsoi.to_xyxy_array() for bbsoi in bounding_boxes],
              input_dtype,
          )
      if ntype == "tuple[number,size=4]":
          assert len(bounding_boxes) == 1, (
              "Expected a single BoundingBoxesOnImage instance after "
              "normalization due to getting a single (x1,y1,x2,y2) tuple before "
              "normalization. Got %d instances instead."
              % (len(bounding_boxes),)
          )
          assert len(bounding_boxes[0].bounding_boxes) == 1, (
              "Expected a BoundingBoxesOnImage instance containing a single "
              "BoundingBox after normalization due to getting a single "
              "(x1,y1,x2,y2) tuple before normalization. Got %d bounding boxes "
              "instead." % (len(bounding_boxes[0].bounding_boxes))
          )
          bb = bounding_boxes[0].bounding_boxes[0]
          return bb.x1, bb.y1, bb.x2, bb.y2
      if ntype == "BoundingBox":
          assert len(bounding_boxes) == 1, (
              "Expected a single BoundingBoxesOnImage instance after "
              "normalization due to getting a single BoundingBox before "
              "normalization. Got %d instances instead."
              % (len(bounding_boxes),)
          )
          assert len(bounding_boxes[0].bounding_boxes) == 1, (
              "Expected a BoundingBoxesOnImage instance containing a single "
              "BoundingBox after normalization due to getting a single "
              "BoundingBox before normalization. Got %d bounding boxes "
              "instead." % (len(bounding_boxes[0].bounding_boxes))
          )
          return bounding_boxes[0].bounding_boxes[0]
      if ntype == "BoundingBoxesOnImage":
          assert len(bounding_boxes) == 1, (
              "Expected a single BoundingBoxesOnImage instance after "
              "normalization due to getting a single BoundingBoxesOnImage "
              "before normalization. Got %d instances instead."
              % (len(bounding_boxes),)
          )
          return bounding_boxes[0]
      if ntype == "iterable[empty]":
          assert bounding_boxes is None, (
              "Expected bounding boxes after normalization to be None, due "
              "to the bounding boxes before normalization being an empty "
              "iterable. Got type %s instead." % (type(bounding_boxes),)
          )
          return []
      if ntype in [
          "iterable-array[float]",
          "iterable-array[int]",
          "iterable-array[uint]",
      ]:
          nonempty, _, _ = find_first_nonempty(bounding_boxes_old)
          input_dtype = nonempty.dtype
          return [
              restore_dtype_and_merge(
                  bbsoi.to_xyxy_array(), input_dtype
              )
              for bbsoi in bounding_boxes
          ]
      if ntype == "iterable-tuple[number,size=4]":
          assert len(bounding_boxes) == 1, (
              "Expected a single BoundingBoxesOnImage instance after "
              "normalization due to getting a an iterable of (x1,y1,x2,y2) "
              "tuples before normalization. Got %d instances instead."
              % (len(bounding_boxes),)
          )
          return [
              (bb.x1, bb.y1, bb.x2, bb.y2)
              for bb in bounding_boxes[0].bounding_boxes
          ]
      if ntype == "iterable-BoundingBox":
          assert len(bounding_boxes) == 1, (
              "Expected a single BoundingBoxesOnImage instance after "
              "normalization due to getting an iterable of BoundingBox before "
              "normalization. Got %d instances instead."
              % (len(bounding_boxes),)
          )
          return bounding_boxes[0].bounding_boxes
      if ntype == "iterable-BoundingBoxesOnImage":
          return bounding_boxes
      if ntype == "iterable-iterable[empty]":
          assert bounding_boxes is None, (
              "Expected bounding boxes after normalization to be None, due "
              "to the bounding boxes before normalization being an empty "
              "iterable of iterables. Got type %s instead."
              % (type(bounding_boxes),)
          )
          return bounding_boxes_old[:]
      if ntype == "iterable-iterable-tuple[number,size=4]":
          return [
              [
                  (bb.x1, bb.y1, bb.x2, bb.y2)
                  for bb in bbsoi.bounding_boxes
              ]
              for bbsoi in bounding_boxes
          ]
  
      assert (
          ntype == "iterable-iterable-BoundingBox"
      ), "Got unknown normalization type '%s'." % (ntype,)
      return [bbsoi.bounding_boxes[:] for bbsoi in bounding_boxes]
  
imports: from __future__ import print_function, division, absolute_import
  import functools
  import numpy
  from ..None import imgaug
  from ..None import dtypes
  from .base import IAugmentable
label_desc: Use image node_id 19 for calling a global function with example usage: invert_normalize_bounding_boxes(bounding_boxes, bounding_boxes_old) and returns: unknown, bounding_boxes, restore_dtype_and_merge, bb,  bb,  bb,  bb, bounding_boxes, bounding_boxes, list, unknown, unknown, bounding_boxes, bounding_boxes, bounding_boxes_old, unknown