import base64 import io import os import warnings from pathlib import Path from diffusers import logging as diffusers_logging from PIL import Image from transformers import logging as transformers_logging # actual size of a gig GIG = 1073741824 def directory_size(directory: Path) -> int: """ Return the aggregate size of all files in a directory (bytes). """ sum = 0 for root, dirs, files in os.walk(directory): for f in files: sum += Path(root, f).stat().st_size for d in dirs: sum += Path(root, d).stat().st_size return sum def image_to_dataURL(image: Image.Image, image_format: str = "PNG") -> str: """ Converts an image into a base64 image dataURL. """ buffered = io.BytesIO() image.save(buffered, format=image_format) mime_type = Image.MIME.get(image_format.upper(), "image/" + image_format.lower()) image_base64 = f"data:{mime_type};base64," + base64.b64encode(buffered.getvalue()).decode("UTF-8") return image_base64 class Chdir(object): """Context manager to chdir to desired directory and change back after context exits: Args: path (Path): The path to the cwd """ def __init__(self, path: Path): self.path = path self.original = Path().absolute() def __enter__(self): os.chdir(self.path) def __exit__(self, *args): os.chdir(self.original) class SilenceWarnings(object): """Context manager to temporarily lower verbosity of diffusers & transformers warning messages.""" def __enter__(self): """Set verbosity to error.""" self.transformers_verbosity = transformers_logging.get_verbosity() self.diffusers_verbosity = diffusers_logging.get_verbosity() transformers_logging.set_verbosity_error() diffusers_logging.set_verbosity_error() warnings.simplefilter("ignore") def __exit__(self, type, value, traceback): """Restore logger verbosity to state before context was entered.""" transformers_logging.set_verbosity(self.transformers_verbosity) diffusers_logging.set_verbosity(self.diffusers_verbosity) warnings.simplefilter("default")