class_docstr: Displays a base image and colored subsections on top of that image. Subsections can take the from of rectangles (e.g. object detection) or masks (e.g. image segmentation).
  Preprocessing: this component does *not* accept input.
  Postprocessing: expects a {Tuple[numpy.ndarray | PIL.Image | str, List[Tuple[numpy.ndarray | Tuple[int, int, int, int], str]]]} consisting of a base image and a list of subsections, that are either (x1, y1, x2, y2) tuples identifying object boundaries, or 0-1 confidence masks of the same shape as the image. A label is provided for each subsection.
  
  Demos: image_segmentation
class_docstr_tok: ["Displays","a","base","image","and","colored","subsections","on","top","of","that","image",".","Subsections","can","take","the","from","of","rectangles","(","e.g",".","object","detection",")","or","masks","(","e.g",".","image","segmentation",")",".","Preprocessing",":","this","component","does","*","not","*","accept","input",".","Postprocessing",":","expects","a","{","Tuple","[","numpy.ndarray","|","PIL.Image","|","str",",","List","[","Tuple","[","numpy.ndarray","|","Tuple","[","int",",","int",",","int",",","int","]",",","str","]","]","]","}","consisting","of","a","base","image","and","a","list","of","subsections",",","that","are","either","(","x1",",","y1",",","x2",",","y2",")","tuples","identifying","object","boundaries",",","or","0-1","confidence","masks","of","the","same","shape","as","the","image",".","A","label","is","provided","for","each","subsection",".","Demos",":","image_segmentation"]
docstr: Parameters:
      value: Tuple of base image and list of subsections, with each subsection a two-part tuple where the first element is a 4 element bounding box or a 0-1 confidence mask, and the second element is the label.
  Returns:
      Tuple of base image file and list of subsections, with each subsection a two-part tuple where the first element image path of the mask, and the second element is the label.
docstr_tok: ["Parameters",":","value",":","Tuple","of","base","image","and","list","of","subsections",",","with","each","subsection","a","two-part","tuple","where","the","first","element","is","a","4","element","bounding","box","or","a","0-1","confidence","mask",",","and","the","second","element","is","the","label",".","Returns",":","Tuple","of","base","image","file","and","list","of","subsections",",","with","each","subsection","a","two-part","tuple","where","the","first","element","image","path","of","the","mask",",","and","the","second","element","is","the","label","."]
code: def postprocess(
      self,
      value: tuple[
          np.ndarray | _Image.Image | str,
          list[tuple[np.ndarray | tuple[int, int, int, int], str]],
      ]
      | None,
  ) -> AnnotatedImageData | None:
      """
      Parameters:
          value: Tuple of base image and list of subsections, with each subsection a two-part tuple where the first element is a 4 element bounding box or a 0-1 confidence mask, and the second element is the label.
      Returns:
          Tuple of base image file and list of subsections, with each subsection a two-part tuple where the first element image path of the mask, and the second element is the label.
      """
      if value is None:
          return None
      base_img = value[0]
      if isinstance(base_img, str):
          base_img_path = base_img
          base_img = np.array(_Image.open(base_img))
      elif isinstance(base_img, np.ndarray):
          base_file = processing_utils.save_img_array_to_cache(
              base_img, cache_dir=self.GRADIO_CACHE
          )
          base_img_path = str(utils.abspath(base_file))
      elif isinstance(base_img, _Image.Image):
          base_file = processing_utils.save_pil_to_cache(
              base_img, cache_dir=self.GRADIO_CACHE
          )
          base_img_path = str(utils.abspath(base_file))
          base_img = np.array(base_img)
      else:
          raise ValueError(
              "AnnotatedImage only accepts filepaths, PIL images or numpy arrays for the base image."
          )
  
      sections = []
      color_map = self.color_map or {}
  
      def hex_to_rgb(value):
          value = value.lstrip("#")
          lv = len(value)
          return [
              int(value[i : i + lv // 3], 16)
              for i in range(0, lv, lv // 3)
          ]
  
      for mask, label in value[1]:
          mask_array = np.zeros((base_img.shape[0], base_img.shape[1]))
          if isinstance(mask, np.ndarray):
              mask_array = mask
          else:
              x1, y1, x2, y2 = mask
              border_width = 3
              mask_array[y1:y2, x1:x2] = 0.5
              mask_array[y1:y2, x1 : x1 + border_width] = 1
              mask_array[y1:y2, x2 - border_width : x2] = 1
              mask_array[y1 : y1 + border_width, x1:x2] = 1
              mask_array[y2 - border_width : y2, x1:x2] = 1
  
          if label in color_map:
              rgb_color = hex_to_rgb(color_map[label])
          else:
              rgb_color = [255, 0, 0]
          colored_mask = np.zeros(
              (base_img.shape[0], base_img.shape[1], 4)
          )
          solid_mask = np.copy(mask_array)
          solid_mask[solid_mask > 0] = 1
  
          colored_mask[:, :, 0] = rgb_color[0] * solid_mask
          colored_mask[:, :, 1] = rgb_color[1] * solid_mask
          colored_mask[:, :, 2] = rgb_color[2] * solid_mask
          colored_mask[:, :, 3] = mask_array * 255
  
          colored_mask_img = _Image.fromarray(
              (colored_mask).astype(np.uint8)
          )
  
          mask_file = processing_utils.save_pil_to_cache(
              colored_mask_img, cache_dir=self.GRADIO_CACHE
          )
          mask_file_path = str(utils.abspath(mask_file))
          sections.append(
              Annotation(
                  image=FileData(path=mask_file_path), label=label
              )
          )
  
      return AnnotatedImageData(
          image=FileData(path=base_img_path),
          annotations=sections,
      )
  
file_path: gradio/gradio/components/annotated_image.py
imports: from __future__ import annotations
  from typing import Any, List
  import numpy
  from gradio_client.documentation import document, set_documentation_group
  from PIL import Image
  from gradio import processing_utils, utils
  from gradio.components.base import Component
  from gradio.data_classes import FileData, GradioModel
  from gradio.events import Events
label_desc: Use image node_id 2 for calling the AnnotatedImage obj's underlying member method code with example usage: obj.postprocess(value) and returns: AnnotatedImageData, None, unknown