code: def get_all_exif_feature_names(image_dataset):
      """Get all exif feature names.
  
      :param image_dataset: The image dataset.
      :type image_dataset: pandas.DataFrame
      :return: The list of exif feature names.
      :rtype: List[Union[str, int]]]
      """
      exif_feature_names = set()
      for i in range(image_dataset.shape[0]):
          image = image_dataset.iloc[i, 0]
          if isinstance(image, str):
              image_pointer_path = get_image_pointer_from_path(image)
              with Image.open(image_pointer_path) as im:
                  exifdata = im.getexif()
                  for tag_id in exifdata:
                      # get the tag name, instead of human unreadable tag id
                      tag = TAGS.get(tag_id, tag_id)
                      if tag not in image_dataset.columns:
                          data = exifdata.get(tag_id)
                          if (
                              isinstance(data, str)
                              or isinstance(data, int)
                              or isinstance(data, float)
                              or isinstance(data, bytes)
                          ):
                              exif_feature_names.add(tag)
      return list(exif_feature_names)
  
file_path: responsible-ai-toolbox/responsibleai_vision/responsibleai_vision/utils/image_reader.py
imports: import base64
  from io import BytesIO
  from typing import Any, Tuple, Union
  from urllib.parse import urlparse
  import requests
  from numpy import asarray
  from PIL import Image
  from PIL.ExifTags import TAGS
  from requests.adapters import HTTPAdapter, Retry
  from responsibleai_vision.common.constants import AutoMLImagesModelIdentifier, CommonTags
label_desc: Use image node_id 4 for calling a global function with example usage: get_all_exif_feature_names(image_dataset) and returns: list