code: def collect(self, record):
      # remove_invisible=False, therefore all points getting in are also getting out
      assert len(self.adapter._albu_out["keypoints"]) == len(
          self._kpts_xy
      )
  
      tfmed_kpts = self._remove_albu_outside_keypoints(
          tfms_kpts=self.adapter._albu_out["keypoints"],
          kpts_visible=self._kpts_visible,
          size_no_padding=self.adapter._size_no_padding,
      )
      # flatten list of keypoints
      flat_kpts = list(chain.from_iterable(tfmed_kpts))
      # group keypoints from same instance
      group_kpts = [
          flat_kpts[i : i + len(flat_kpts) // len(self._kpts)]
          for i in range(
              0,
              len(flat_kpts),
              len(flat_kpts) // len(self._kpts),
          )
      ]
      assert len(group_kpts) == len(self._kpts)
  
      kpts = [
          KeyPoints.from_xyv(group_kpt, original_kpt.metadata)
          for group_kpt, original_kpt in zip(group_kpts, self._kpts)
      ]
      kpts = self.adapter._filter_attribute(kpts)
      record.detection.set_keypoints(kpts)
  
imports: import albumentations
  from itertools import chain
  from icevision.imports import *
  from icevision.utils import *
  from icevision.core import *
  from icevision.tfms.transform import *
  from icevision.tfms.albumentations.albumentations_helpers import get_size_without_padding, get_transform
label_desc: Use image node_id 2 for calling the AlbumentationsKeypointsComponent obj's underlying member method code with example usage: obj.collect(record) without return types