code: def normalize_keypoints(inputs, shapes=None):
      # TODO get rid of this deferred import
      from imgaug.augmentables.kps import Keypoint, KeypointsOnImage
  
      shapes = _preprocess_shapes(shapes)
      ntype = estimate_keypoints_norm_type(inputs)
      _assert_exactly_n_shapes_partial = functools.partial(
          _assert_exactly_n_shapes,
          from_ntype=ntype,
          to_ntype="List[KeypointsOnImage]",
          shapes=shapes,
      )
  
      if ntype == "None":
          return inputs
      if ntype in ["array[float]", "array[int]", "array[uint]"]:
          _assert_single_array_ndim(
              inputs, 3, "(N,K,2)", "KeypointsOnImage"
          )
          _assert_single_array_last_dim_exactly(
              inputs, 2, "KeypointsOnImage"
          )
          _assert_exactly_n_shapes_partial(n=len(inputs))
          return [
              KeypointsOnImage.from_xy_array(attr_i, shape=shape)
              for attr_i, shape in zip(inputs, shapes)
          ]
      if ntype == "tuple[number,size=2]":
          _assert_exactly_n_shapes_partial(n=1)
          return [
              KeypointsOnImage(
                  [Keypoint(x=inputs[0], y=inputs[1])], shape=shapes[0]
              )
          ]
      if ntype == "Keypoint":
          _assert_exactly_n_shapes_partial(n=1)
          return [KeypointsOnImage([inputs], shape=shapes[0])]
      if ntype == "KeypointsOnImage":
          return [inputs]
      if ntype == "iterable[empty]":
          return None
      if ntype in [
          "iterable-array[float]",
          "iterable-array[int]",
          "iterable-array[uint]",
      ]:
          _assert_many_arrays_ndim(
              inputs, 2, "(K,2)", "KeypointsOnImage"
          )
          _assert_many_arrays_last_dim_exactly(
              inputs, 2, "KeypointsOnImage"
          )
          _assert_exactly_n_shapes_partial(n=len(inputs))
          return [
              KeypointsOnImage.from_xy_array(attr_i, shape=shape)
              for attr_i, shape in zip(inputs, shapes)
          ]
      if ntype == "iterable-tuple[number,size=2]":
          _assert_exactly_n_shapes_partial(n=1)
          return [
              KeypointsOnImage(
                  [Keypoint(x=x, y=y) for x, y in inputs],
                  shape=shapes[0],
              )
          ]
      if ntype == "iterable-Keypoint":
          _assert_exactly_n_shapes_partial(n=1)
          return [KeypointsOnImage(inputs, shape=shapes[0])]
      if ntype == "iterable-KeypointsOnImage":
          return inputs
      if ntype == "iterable-iterable[empty]":
          return None
      if ntype == "iterable-iterable-tuple[number,size=2]":
          _assert_exactly_n_shapes_partial(n=len(inputs))
          return [
              KeypointsOnImage.from_xy_array(
                  np.array(attr_i, dtype=np.float32), shape=shape
              )
              for attr_i, shape in zip(inputs, shapes)
          ]
  
      assert (
          ntype == "iterable-iterable-Keypoint"
      ), "Got unknown normalization type '%s'." % (ntype,)
      _assert_exactly_n_shapes_partial(n=len(inputs))
      return [
          KeypointsOnImage(attr_i, shape=shape)
          for attr_i, shape in zip(inputs, shapes)
      ]
  
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 10 for calling a global function with example usage: normalize_keypoints(inputs, shapes) and returns: unknown, inputs, unknown, list, list, list, None, unknown, list, list, inputs, None, unknown