code: def _testtube(self, pl_module, images, batch_idx, split):
      for k in images:
          grid = torchvision.utils.make_grid(images[k])
          grid = (grid + 1.0) / 2.0  # -1,1 -> 0,1; c,h,w
  
          tag = f"{split}/{k}"
          pl_module.logger.experiment.add_image(
              tag, grid, global_step=pl_module.global_step
          )
  
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 2 for calling the ImageLogger obj's underlying member method code with example usage: obj._testtube(pl_module, images, batch_idx, split) without return types