code: def forward(self, df: pd.DataFrame) -> pd.DataFrame:
      def _forward(row: pd.Series) -> np.ndarray:
          rgb_img = row[0]
  
          composed = Compose([Resize((224, 224)), ToTensor()])
          transformed_img = composed(
              Image.fromarray(rgb_img[:, :, ::-1])
          ).unsqueeze(0)
          transformed_img.requires_grad_()
          outputs = self.model(transformed_img)
          score_max_index = outputs.argmax()
          score_max = outputs[0, score_max_index]
          score_max.backward()
          saliency, _ = torch.max(
              transformed_img.grad.data.abs(), dim=1
          )
  
          return saliency
  
      ret = pd.DataFrame()
      ret["saliency"] = df.apply(_forward, axis=1)
      return ret
  
file_path: evadb/evadb/functions/saliency_feature_extractor.py
imports: import numpy
  import pandas
  import torch
  import torchvision
  from PIL import Image
  from torchvision.transforms import Compose, Resize, ToTensor
  from evadb.catalog.catalog_type import NdArrayType
  from evadb.functions.abstract.abstract_function import AbstractFunction
  from evadb.functions.decorators.decorators import forward, setup
  from evadb.functions.decorators.io_descriptors.data_types import PandasDataframe
  from evadb.functions.gpu_compatible import GPUCompatible
label_desc: Use image node_id 4 for calling the SaliencyFeatureExtractor obj's underlying member method code with example usage: obj.forward(df) and returns: ret, saliency