code: def apply_to_keypoints(
      self,
      keypoints,
      deterministic_processor=None,
      rows=0,
      cols=0,
      **params,
  ):
      if len(keypoints) > 0:
          keypoints = convert_keypoints_from_albumentations(
              keypoints, "xy", rows=rows, cols=cols
          )
          keypoints_t = ia.KeypointsOnImage(
              [ia.Keypoint(*kp[:2]) for kp in keypoints], (rows, cols)
          )
          keypoints_t = deterministic_processor.augment_keypoints(
              [keypoints_t]
          )[0].keypoints
  
          bboxes_t = [
              [kp.x, kp.y] + list(kp_orig[2:])
              for (kp, kp_orig) in zip(keypoints_t, keypoints)
          ]
  
          keypoints = convert_keypoints_to_albumentations(
              bboxes_t, "xy", rows=rows, cols=cols
          )
      return keypoints
  
imports: import warnings
  from albumentations.core.bbox_utils import convert_bboxes_from_albumentations, convert_bboxes_to_albumentations
  from albumentations.core.keypoints_utils import convert_keypoints_from_albumentations, convert_keypoints_to_albumentations
  from ..augmentations import Perspective
  from ..core.transforms_interface import BasicTransform, DualTransform, ImageOnlyTransform, to_tuple
label_desc: Use image node_id 2 for calling the DualIAATransform obj's underlying member method code with example usage: obj.apply_to_keypoints(keypoints, deterministic_processor, rows, cols) and returns: keypoints