code: def _normalize_polygons_and_line_strings(
      cls_single,
      cls_oi,
      axis_names,
      estimate_ntype_func,
      inputs,
      shapes=None,
  ):
      cls_single_name = cls_single.__name__
      cls_oi_name = cls_oi.__name__
      axis_names_4_str = "(N,%s,%s,2)" % (axis_names[0], axis_names[1])
      axis_names_3_str = "(%s,%s,2)" % (axis_names[0], axis_names[1])
      axis_names_2_str = "(%s,2)" % (axis_names[1],)
  
      shapes = _preprocess_shapes(shapes)
      ntype = estimate_ntype_func(inputs)
      _assert_exactly_n_shapes_partial = functools.partial(
          _assert_exactly_n_shapes,
          from_ntype=ntype,
          to_ntype=("List[%s]" % (cls_oi_name,)),
          shapes=shapes,
      )
  
      if ntype == "None":
          return None
      if ntype in ["array[float]", "array[int]", "array[uint]"]:
          _assert_single_array_ndim(
              inputs, 4, axis_names_4_str, cls_oi_name
          )
          _assert_single_array_last_dim_exactly(inputs, 2, cls_oi_name)
          _assert_exactly_n_shapes_partial(n=len(inputs))
          return [
              cls_oi(
                  [cls_single(points) for points in attr_i], shape=shape
              )
              for attr_i, shape in zip(inputs, shapes)
          ]
      if ntype == cls_single_name:
          _assert_exactly_n_shapes_partial(n=1)
          return [cls_oi([inputs], shape=shapes[0])]
      if ntype == cls_oi_name:
          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, 3, axis_names_3_str, cls_oi_name
          )
          _assert_many_arrays_last_dim_exactly(inputs, 2, cls_oi_name)
          _assert_exactly_n_shapes_partial(n=len(inputs))
          return [
              cls_oi(
                  [cls_single(points) for points in 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 [cls_oi([cls_single(inputs)], shape=shapes[0])]
      if ntype == "iterable-Keypoint":
          _assert_exactly_n_shapes_partial(n=1)
          return [cls_oi([cls_single(inputs)], shape=shapes[0])]
      if ntype == ("iterable-%s" % (cls_single_name,)):
          _assert_exactly_n_shapes_partial(n=1)
          return [cls_oi(inputs, shape=shapes[0])]
      if ntype == ("iterable-%s" % (cls_oi_name,)):
          return inputs
      if ntype == "iterable-iterable[empty]":
          return None
      if ntype in [
          "iterable-iterable-array[float]",
          "iterable-iterable-array[int]",
          "iterable-iterable-array[uint]",
      ]:
          _assert_many_arrays_ndim(
              inputs, 2, axis_names_2_str, cls_oi_name
          )
          _assert_many_arrays_last_dim_exactly(inputs, 2, cls_oi_name)
          _assert_exactly_n_shapes_partial(n=len(inputs))
          return [
              cls_oi(
                  [cls_single(points) for points in attr_i], shape=shape
              )
              for attr_i, shape in zip(inputs, shapes)
          ]
      if ntype == "iterable-iterable-tuple[number,size=2]":
          _assert_exactly_n_shapes_partial(n=1)
          return [
              cls_oi(
                  [cls_single(attr_i) for attr_i in inputs],
                  shape=shapes[0],
              )
          ]
      if ntype == "iterable-iterable-Keypoint":
          _assert_exactly_n_shapes_partial(n=1)
          return [
              cls_oi(
                  [cls_single(attr_i) for attr_i in inputs],
                  shape=shapes[0],
              )
          ]
      if ntype == ("iterable-iterable-%s" % (cls_single_name,)):
          _assert_exactly_n_shapes_partial(n=len(inputs))
          return [
              cls_oi(attr_i, shape=shape)
              for attr_i, shape in zip(inputs, shapes)
          ]
      if ntype == "iterable-iterable-iterable[empty]":
          return None
  
      assert ntype in [
          "iterable-iterable-iterable-tuple[number,size=2]",
          "iterable-iterable-iterable-Keypoint",
      ], "Got unknown normalization type '%s'." % (ntype,)
      _assert_exactly_n_shapes_partial(n=len(inputs))
      return [
          cls_oi([cls_single(points) for points in 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 14 for calling a global function with example usage: _normalize_polygons_and_line_strings(cls_single, cls_oi, axis_names, estimate_ntype_func, inputs, shapes) and returns: unknown, None, unknown, list, list, None, unknown, list, list, list, inputs, None, unknown, list, list, unknown, None