code: def post_process_image(
      cfg,
      model_output,
      pca=None,
  ):
      train_feature = np.array(
          [
              m if isinstance(m, list) else m.tolist()
              for m in model_output
          ]
      )
      train_feature = [
          torch.from_numpy(np.expand_dims(train_feature, axis=0))
      ]
  
      if cfg.IMG_RETRIEVAL.FEATS_PROCESSING_TYPE == "rmac":
          descriptor = get_rmac_descriptors(
              train_feature[0],
              cfg.IMG_RETRIEVAL.SPATIAL_LEVELS,
              normalize=cfg.IMG_RETRIEVAL.NORMALIZE_FEATURES,
              pca=pca,
          )
      elif cfg.IMG_RETRIEVAL.FEATS_PROCESSING_TYPE == "gem":
          descriptor = get_average_gem(
              train_feature,
              p=cfg.IMG_RETRIEVAL.GEM_POOL_POWER,
              add_bias=True,
          )
      else:
          descriptor = torch.mean(torch.stack(train_feature), dim=0)
          descriptor = descriptor.reshape(descriptor.shape[0], -1)
  
      # Optionally l2 normalize the features.
      if (
          cfg.IMG_RETRIEVAL.NORMALIZE_FEATURES
          and cfg.IMG_RETRIEVAL.FEATS_PROCESSING_TYPE != "rmac"
      ):
          # RMAC performs normalization within the algorithm, hence we skip it here.
          descriptor = l2n(descriptor, dim=1)
  
      # Optionally apply pca.
      if pca and cfg.IMG_RETRIEVAL.FEATS_PROCESSING_TYPE != "rmac":
          # RMAC performs pca within the algorithm, hence we skip it here.
          descriptor = pca.apply(descriptor)
  
      return descriptor.data.numpy()
  
imports: import logging
  import os
  import sys
  from argparse import Namespace
  from typing import Any, List
  import numpy
  import torch
  import torchvision
  from classy_vision.generic.util import copy_model_to_gpu, load_checkpoint
  from iopath.common.file_io import g_pathmgr
  from vissl.config import AttrDict
  from vissl.hooks import default_hook_generator
  from vissl.models import build_model
  from vissl.utils.checkpoint import get_checkpoint_folder, init_model_from_consolidated_weights
  from vissl.utils.distributed_launcher import launch_distributed
  from vissl.utils.env import set_env_vars, setup_path_manager
  from vissl.utils.extract_features_utils import ExtractedFeaturesLoader
  from vissl.utils.hydra_config import compose_hydra_configuration, convert_to_attrdict, print_cfg
  from vissl.utils.instance_retrieval_utils.data_util import CopyDaysDataset, GenericInstanceRetrievalDataset, get_average_gem, InstanceRetrievalDataset, InstanceRetrievalImageLoader, InstreDataset, is_copdays_dataset, is_instre_dataset, is_oxford_paris_dataset, is_revisited_dataset, is_whiten_dataset, l2n, MultigrainResize, RevisitedInstanceRetrievalDataset, WhiteningTrainingImageDataset
  from vissl.utils.instance_retrieval_utils.rmac import get_rmac_descriptors
  from vissl.utils.io import load_file, makedir, save_file
  from vissl.utils.logger import setup_logging, shutdown_logging
  from vissl.utils.pca import load_pca, train_and_save_pca
  from vissl.utils.perf_stats import PerfStats, PerfTimer
label_desc: Use image node_id 4 for calling a global function with example usage: post_process_image(cfg, model_output, pca) and returns: descriptor