class_docstr: Preprocess one multimodal pd.DataFrame including image paths, image bytearrays, texts, numerical features,
  and categorical features. Each modality may have multiple columns.
  The preprocessor is designed to output model-agnostic features.
class_docstr_tok: ["Preprocess","one","multimodal","pd.DataFrame","including","image","paths",",","image","bytearrays",",","texts",",","numerical","features",",","and","categorical","features",".","Each","modality","may","have","multiple","columns",".","The","preprocessor","is","designed","to","output","model-agnostic","features","."]
docstr: Preprocess image + rois data.
  For image data we preprocess them by collecting their paths together. If one sample has multiple images
  in an image column, assume that their image paths are separated by ";".
  For rois data we simply convert them from a column of pandas dataframe to a list.
  This function needs to be called preceding the rois processor in "process_rois.py".
  
  Parameters
  ----------
  df
      The multimodal pd.DataFrame.
  
  Returns
  -------
  image_features
      All the image data stored in a dictionary.
  image_types
      The column types of these image data, e.g., image_path or image_identifier.
code: def transform_rois(
      self,
      df: pd.DataFrame,
  ) -> Tuple[Dict[str, List[List[str]]], Dict[str, str]]:
      """
      Preprocess image + rois data.
      For image data we preprocess them by collecting their paths together. If one sample has multiple images
      in an image column, assume that their image paths are separated by ";".
      For rois data we simply convert them from a column of pandas dataframe to a list.
      This function needs to be called preceding the rois processor in "process_rois.py".
  
      Parameters
      ----------
      df
          The multimodal pd.DataFrame.
  
      Returns
      -------
      image_features
          All the image data stored in a dictionary.
      image_types
          The column types of these image data, e.g., image_path or image_identifier.
      """
      assert (
          self._fit_called or self._fit_x_called
      ), "You will need to first call preprocessor.fit_x() before calling preprocessor.transform_rois."
  
      x = self.transform_image(df)
      ret_data = x[0]
      ret_type = x[1]
  
      for col_name in self._rois_feature_names:
          col_type = self._column_types[col_name]
  
          if col_type == ROIS:
              processed_data = df[col_name].tolist()
          else:
              raise ValueError(
                  f"Unknown image type {col_type} for column {col_name}"
              )
  
          ret_data[col_name] = processed_data
          ret_type[col_name] = self._column_types[col_name]
  
      return ret_data, ret_type
  
imports: import logging
  from typing import Any, Dict, List, Optional, Tuple, Union
  import numpy
  import pandas
  from nptyping import NDArray
  from omegaconf import DictConfig, OmegaConf
  from sklearn.base import BaseEstimator, TransformerMixin
  from sklearn.impute import SimpleImputer
  from sklearn.pipeline import Pipeline
  from sklearn.preprocessing import MinMaxScaler, StandardScaler
  from autogluon.features import CategoryFeatureGenerator
  from ..constants import AUTOMM, CATEGORICAL, DOCUMENT, DOCUMENT_IMAGE, IDENTIFIER, IMAGE, IMAGE_BYTEARRAY, IMAGE_PATH, LABEL, NER, NER_ANNOTATION, NULL, NUMERICAL, OVD, ROIS, SEMANTIC_SEGMENTATION, SEMANTIC_SEGMENTATION_GT, SEMANTIC_SEGMENTATION_IMG, TEXT, TEXT_NER
  from .label_encoder import CustomLabelEncoder
label_desc: Use image node_id 29 for calling the MultiModalFeaturePreprocessor obj's underlying member method code with example usage: obj.transform_rois(df) and returns: ret_data,  ret_type