code: def pb(
      name, images, max_outputs=3, display_name=None, description=None
  ):
      """Create a legacy image summary protobuf.
  
      This behaves as if you were to create an `op` with the same arguments
      (wrapped with constant tensors where appropriate) and then execute
      that summary op in a TensorFlow session.
  
      Arguments:
        name: A unique name for the generated summary, including any desired
          name scopes.
        images: An `np.array` representing pixel data with shape
          `[k, h, w, c]`, where `k` is the number of images, `w` and `h` are
          the width and height of the images, and `c` is the number of
          channels, which should be 1, 3, or 4.
        max_outputs: Optional `int`. At most this many images will be
          emitted. If more than this many images are provided, the first
          `max_outputs` many images will be used and the rest silently
          discarded.
        display_name: Optional name for this summary in TensorBoard, as a
          `str`. Defaults to `name`.
        description: Optional long-form description for this summary, as a
          `str`. Markdown is supported. Defaults to empty.
  
      Returns:
        A `tf.Summary` protobuf object.
      """
      # TODO(nickfelt): remove on-demand imports once dep situation is fixed.
      import tensorflow.compat.v1 as tf
  
      images = np.array(images).astype(np.uint8)
      if images.ndim != 4:
          raise ValueError(
              "Shape %r must have rank 4" % (images.shape,)
          )
  
      limited_images = images[:max_outputs]
      encoded_images = [
          encoder.encode_png(image) for image in limited_images
      ]
      (width, height) = (images.shape[2], images.shape[1])
      content = [str(width), str(height)] + encoded_images
      tensor = tf.make_tensor_proto(content, dtype=tf.string)
  
      if display_name is None:
          display_name = name
      summary_metadata = metadata.create_summary_metadata(
          display_name=display_name, description=description
      )
      tf_summary_metadata = tf.SummaryMetadata.FromString(
          summary_metadata.SerializeToString()
      )
  
      summary = tf.Summary()
      summary.value.add(
          tag="%s/image_summary" % name,
          metadata=tf_summary_metadata,
          tensor=tensor,
      )
      return summary
  
imports: import numpy
  from tensorboard.plugins.image import metadata
  from tensorboard.plugins.image import summary_v2
  from tensorboard.util import encoder
label_desc: Use image node_id 2 for calling a global function with example usage: pb(name, images, max_outputs, display_name, description) and returns: summary