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","."]
code: def get_column_names(self, modality: str):
      if modality.startswith(IMAGE):
          if hasattr(self, "_image_path_names"):
              return self._image_path_names
          else:
              return self._image_feature_names
      elif modality == OVD:
          if hasattr(self, "_image_path_names"):
              return self._image_path_names + self._text_feature_names
          else:
              return (
                  self._image_feature_names + self._text_feature_names
              )
      elif modality == ROIS:
          return self._rois_feature_names
      elif modality == TEXT:
          return self._text_feature_names
      elif modality == CATEGORICAL:
          return self._categorical_feature_names
      elif modality == NUMERICAL:
          return self._numerical_feature_names
      elif modality.startswith(DOCUMENT):
          return self._document_feature_names
      elif modality == LABEL:
          return [
              self._label_column
          ]  # as a list to be consistent with others
      elif modality == SEMANTIC_SEGMENTATION_IMG:
          return self._semantic_segmentation_feature_names
      elif self.label_type == NER_ANNOTATION:
          return self.ner_feature_names + [self._label_column]
      else:
          raise ValueError(f"Unknown modality: {modality}.")
  
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 24 for calling the MultiModalFeaturePreprocessor obj's underlying member method code with example usage: obj.get_column_names(modality) and returns: self, self, unknown, unknown, self, self, self, self, self, list, self, unknown