code: def log_local(
      self,
      save_dir,
      split,
      images,
      global_step,
      current_epoch,
      batch_idx,
  ):
      root = os.path.join(save_dir, "images", split)
      for k in images:
          grid = torchvision.utils.make_grid(images[k], nrow=4)
          if self.rescale:
              grid = (grid + 1.0) / 2.0  # -1,1 -> 0,1; c,h,w
          grid = grid.transpose(0, 1).transpose(1, 2).squeeze(-1)
          grid = grid.numpy()
          grid = (grid * 255).astype(np.uint8)
          filename = "{}_gs-{:06}_e-{:06}_b-{:06}.png".format(
              k, global_step, current_epoch, batch_idx
          )
          path = os.path.join(root, filename)
          os.makedirs(os.path.split(path)[0], exist_ok=True)
          Image.fromarray(grid).save(path)
  
imports: import argparse, os, sys, datetime, glob, importlib, csv
  import numpy
  import time
  import torch
  import torchvision
  import pytorch_lightning
  from packaging import version
  from omegaconf import OmegaConf
  from torch.utils.data import random_split, DataLoader, Dataset, Subset
  from functools import partial
  from PIL import Image
  from pytorch_lightning import seed_everything
  from pytorch_lightning.trainer import Trainer
  from pytorch_lightning.callbacks import ModelCheckpoint, Callback, LearningRateMonitor
  from pytorch_lightning.utilities.distributed import rank_zero_only
  from pytorch_lightning.utilities import rank_zero_info
  from ldm.data.base import Txt2ImgIterableBaseDataset
  from ldm.util import instantiate_from_config
label_desc: Use image node_id 3 for calling the ImageLogger obj's underlying member method code with example usage: obj.log_local(save_dir, split, images, global_step, current_epoch, batch_idx) without return types