class_docstr: Feature extractor for AI-VAD.
  
  Args:
      n_velocity_bins (int): Number of discrete bins used for velocity histogram features.
      use_velocity_features (bool): Flag indicating if velocity features should be used.
      use_pose_features (bool): Flag indicating if pose features should be used.
      use_deep_features (bool): Flag indicating if deep features should be used.
code: def __init__(
      self,
      n_velocity_bins: int = 8,
      use_velocity_features: bool = True,
      use_pose_features: bool = True,
      use_deep_features: bool = True,
  ) -> None:
      super().__init__()
      assert (
          use_velocity_features
          or use_pose_features
          or use_deep_features
      ), "At least one feature stream must be enabled."
  
      self.use_velocity_features = use_velocity_features
      self.use_pose_features = use_pose_features
      self.use_deep_features = use_deep_features
  
      self.deep_extractor = DeepExtractor()
      self.velocity_extractor = VelocityExtractor(
          n_bins=n_velocity_bins
      )
      self.pose_extractor = PoseExtractor()
  
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 1 to create a new FeatureExtractor object from inherited base classes: nn with example: obj = FeatureExtractor(n_velocity_bins, use_velocity_features, use_pose_features, use_deep_features)