class_docstr: Pose feature extractor.
  
  Extracts pose features based on estimated body landmark keypoints.
docstr: Extract pose features using a human keypoint estimation model.
  
  Args:
      batch (Tensor): Batch of RGB input images of shape (N, 3, H, W)
      boxes (Tensor): Bounding box coordinates of shaspe (M, 5). First column indicates batch index of the bbox.
  
  Returns:
      list[Tensor]: list of pose feature tensors for each image.
docstr_tok: ["Extract","pose","features","using","a","human","keypoint","estimation","model",".","Args",":","batch","(","Tensor",")",":","Batch","of","RGB","input","images","of","shape","(","N",",","3",",","H",",","W",")","boxes","(","Tensor",")",":","Bounding","box","coordinates","of","shaspe","(","M",",","5",")",".","First","column","indicates","batch","index","of","the","bbox",".","Returns",":","list","[","Tensor","]",":","list","of","pose","feature","tensors","for","each","image","."]
code: def forward(self, batch: Tensor, boxes: Tensor) -> list[Tensor]:
      """Extract pose features using a human keypoint estimation model.
  
      Args:
          batch (Tensor): Batch of RGB input images of shape (N, 3, H, W)
          boxes (Tensor): Bounding box coordinates of shaspe (M, 5). First column indicates batch index of the bbox.
  
      Returns:
          list[Tensor]: list of pose feature tensors for each image.
      """
      images, _ = self.transform(batch)
      features = self.backbone(images.tensors)
  
      image_sizes = [b.shape[-2:] for b in batch]
      scales = [
          Tensor(new) / Tensor([orig[0], orig[1]])
          for orig, new in zip(image_sizes, images.image_sizes)
      ]
  
      boxes = [
          box * scale.repeat(2).to(box.device)
          for box, scale in zip(boxes, scales)
      ]
  
      keypoint_features = self.roi_heads.keypoint_roi_pool(
          features, boxes, images.image_sizes
      )
      keypoint_features = self.roi_heads.keypoint_head(
          keypoint_features
      )
      keypoint_logits = self.roi_heads.keypoint_predictor(
          keypoint_features
      )
      keypoints_probs, _ = keypointrcnn_inference(
          keypoint_logits, boxes
      )
  
      keypoint_detections = self.transform.postprocess(
          [
              {"keypoints": keypoints, "boxes": box}
              for keypoints, box in zip(keypoints_probs, boxes)
          ],
          images.image_sizes,
          image_sizes,
      )
      return self._post_process(keypoint_detections)
  
imports: from __future__ import annotations
  from enum import Enum
  import torch
  from torch import Tensor, nn
  from torchvision.models.detection import KeypointRCNN_ResNet50_FPN_Weights, keypointrcnn_resnet50_fpn
  from torchvision.models.detection.roi_heads import keypointrcnn_inference
  from torchvision.ops import roi_align
  from torchvision.transforms import Normalize
  from anomalib.models.ai_vad.clip import clip
label_desc: Use image node_id 3 for calling the PoseExtractor obj's underlying member method code with example usage: obj.forward(batch, boxes) and returns: self