class_docstr: Apply image augmentors on several components, with shared augmentation parameters.
  
  Example:
  
      .. code-block:: python
  
          ds = MyDataFlow()   # produce [image(HWC), segmask(HW), keypoint(Nx2)]
          ds = AugmentImageComponents(
              ds, augs,
              index=(0,1), coords_index=(2,))
code: def _aug_mapper(self, dp):
      dp = copy_mod.copy(
          dp
      )  # always do a shallow copy, make sure the list is intact
      copy_func = (
          copy_mod.deepcopy if self._copy else lambda x: x
      )  # noqa
      with self._exception_handler.catch():
          major_image = self._index[
              0
          ]  # image to be used to get params. TODO better design?
          im = copy_func(dp[major_image])
          check_dtype(im)
          tfms = self.augs.get_transform(im)
          dp[major_image] = tfms.apply_image(im)
          for idx in self._index[1:]:
              check_dtype(dp[idx])
              dp[idx] = tfms.apply_image(copy_func(dp[idx]))
          for idx in self._coords_index:
              coords = copy_func(dp[idx])
              validate_coords(coords)
              dp[idx] = tfms.apply_coords(coords)
          return dp
  
imports: import copy
  import numpy
  from contextlib import contextmanager
  from ..utils import logger
  from ..utils.argtools import shape2d
  from .base import RNGDataFlow
  from .common import MapData, MapDataComponent
label_desc: Use image node_id 3 for calling the AugmentImageComponents obj's underlying member method code with example usage: obj._aug_mapper(dp) and returns: dp