basujindal / stable-diffusion

Optimized Stable Diffusion modified to run on lower GPU VRAM
Other
3.14k stars 469 forks source link

Store prompts/parameters in EXIF #111

Open sowbug opened 2 years ago

sowbug commented 2 years ago

It would be cool to (optionally) embed the information in each file's EXIF metadata needed to reproduce it. Having the seed and the prompt in the filename/folder is nice, but it's not always enough information, and if your --n_samples is larger than 1, then the prompt is no longer part of the filename, so individual files have even less metadata.

sowbug commented 2 years ago

Screenshot from 2022-09-02 15-18-35

Here's what it might look like. Other advantages:

sowbug commented 2 years ago

Here is a Python snippet that works for PNG:

from libxmp import XMPFiles, consts, XMPMeta
import time

xmpfile = XMPFiles(file_path="PNG-metadata-test.png", open_forupdate=True)
xmp = xmpfile.get_xmp()
if xmp is None:
  xmp = XMPMeta()
xmp.append_array_item(consts.XMP_NS_DC, 'description', 'the time is %s' % time.asctime(), {'prop_array_is_ordered':True, 'prop_value_is_array':True})
xmpfile.put_xmp(xmp)
xmpfile.close_file()

On my Ubuntu Cinnamon system, this works as expected. Note that I needed to install libxml (pip install python-xmp-toolkit)

sowbug commented 2 years ago

Please take a look at 50d0f0eab52fda64b002092dd7525855c2b59d2d. It mostly does what I had in mind. Outstanding issues are listed in the commit message. Another issue I just thought of is that JSON might be a better format than str(argparse), because it's just as human-readable, but it's more machine-readable.

Anyway, this definitely scratches my own itch for now. If anyone else finds it useful, I'll be happy to turn it into a PR.

Screenshot from 2022-09-05 16-49-44

basujindal commented 2 years ago

Hi, sorry for the late reply, and thanks for adding this amazing feature; I will merge the commits as soon as possible. Thanks again!

sowbug commented 2 years ago

Please wait until I submit a PR, as I don't think the current implementation's quality is high enough. The problem is that installation of a certain required library is difficult, and I don't want you to incur a support load for anyone who runs into trouble.

sowbug commented 2 years ago

This is good to review. It works for both txt2img and img2txt, and JPEG and PNG file formats. It introduces no platform-specific dependencies. I've manually tested on Debian.