mirror of
https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
synced 2024-06-07 21:20:49 +00:00
rework #5012 to also work for pictures dragged into the prompt and also add Clip skip + ENSD to parameters
This commit is contained in:
parent
488f831d52
commit
506d529d19
@ -1,6 +1,8 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
import math
|
import math
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
@ -12,7 +14,7 @@ from typing import Callable, List, OrderedDict, Tuple
|
|||||||
from functools import partial
|
from functools import partial
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
|
||||||
from modules import processing, shared, images, devices, sd_models
|
from modules import processing, shared, images, devices, sd_models, sd_samplers
|
||||||
from modules.shared import opts
|
from modules.shared import opts
|
||||||
import modules.gfpgan_model
|
import modules.gfpgan_model
|
||||||
from modules.ui import plaintext_to_html
|
from modules.ui import plaintext_to_html
|
||||||
@ -22,7 +24,6 @@ import piexif.helper
|
|||||||
import gradio as gr
|
import gradio as gr
|
||||||
import safetensors.torch
|
import safetensors.torch
|
||||||
|
|
||||||
|
|
||||||
class LruCache(OrderedDict):
|
class LruCache(OrderedDict):
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class Key:
|
class Key:
|
||||||
@ -214,39 +215,8 @@ def run_pnginfo(image):
|
|||||||
if image is None:
|
if image is None:
|
||||||
return '', '', ''
|
return '', '', ''
|
||||||
|
|
||||||
items = image.info
|
geninfo, items = images.read_info_from_image(image)
|
||||||
geninfo = ''
|
items = {**{'parameters': geninfo}, **items}
|
||||||
|
|
||||||
if "exif" in image.info:
|
|
||||||
exif = piexif.load(image.info["exif"])
|
|
||||||
exif_comment = (exif or {}).get("Exif", {}).get(piexif.ExifIFD.UserComment, b'')
|
|
||||||
try:
|
|
||||||
exif_comment = piexif.helper.UserComment.load(exif_comment)
|
|
||||||
except ValueError:
|
|
||||||
exif_comment = exif_comment.decode('utf8', errors="ignore")
|
|
||||||
|
|
||||||
items['exif comment'] = exif_comment
|
|
||||||
geninfo = exif_comment
|
|
||||||
|
|
||||||
for field in ['jfif', 'jfif_version', 'jfif_unit', 'jfif_density', 'dpi', 'exif',
|
|
||||||
'loop', 'background', 'timestamp', 'duration']:
|
|
||||||
items.pop(field, None)
|
|
||||||
|
|
||||||
geninfo = items.get('parameters', geninfo)
|
|
||||||
|
|
||||||
# nai prompt
|
|
||||||
if "Software" in items.keys() and items["Software"] == "NovelAI":
|
|
||||||
import json
|
|
||||||
json_info = json.loads(items["Comment"])
|
|
||||||
geninfo = f'{items["Description"]}\r\nNegative prompt: {json_info["uc"]}\r\n'
|
|
||||||
sampler = "Euler a"
|
|
||||||
if json_info["sampler"] == "k_euler_ancestral":
|
|
||||||
sampler = "Euler a"
|
|
||||||
elif json_info["sampler"] == "k_euler":
|
|
||||||
sampler = "Euler"
|
|
||||||
model_hash = '925997e9' # assuming this is the correct model hash
|
|
||||||
# not sure with noise and strength parameter
|
|
||||||
geninfo += f'Steps: {json_info["steps"]}, Sampler: {sampler}, CFG scale: {json_info["scale"]}, Seed: {json_info["seed"]}, Size: {image.width}x{image.height}, Model hash: {model_hash}' # , Denoising strength: {json_info["noise"]}'
|
|
||||||
|
|
||||||
info = ''
|
info = ''
|
||||||
for key, text in items.items():
|
for key, text in items.items():
|
||||||
|
@ -75,6 +75,7 @@ def integrate_settings_paste_fields(component_dict):
|
|||||||
'CLIP_stop_at_last_layers': 'Clip skip',
|
'CLIP_stop_at_last_layers': 'Clip skip',
|
||||||
'inpainting_mask_weight': 'Conditional mask weight',
|
'inpainting_mask_weight': 'Conditional mask weight',
|
||||||
'sd_model_checkpoint': 'Model hash',
|
'sd_model_checkpoint': 'Model hash',
|
||||||
|
'eta_noise_seed_delta': 'ENSD',
|
||||||
}
|
}
|
||||||
settings_paste_fields = [
|
settings_paste_fields = [
|
||||||
(component_dict[k], lambda d, k=k, v=v: ui.apply_setting(k, d.get(v, None)))
|
(component_dict[k], lambda d, k=k, v=v: ui.apply_setting(k, d.get(v, None)))
|
||||||
|
@ -15,6 +15,7 @@ import piexif.helper
|
|||||||
from PIL import Image, ImageFont, ImageDraw, PngImagePlugin
|
from PIL import Image, ImageFont, ImageDraw, PngImagePlugin
|
||||||
from fonts.ttf import Roboto
|
from fonts.ttf import Roboto
|
||||||
import string
|
import string
|
||||||
|
import json
|
||||||
|
|
||||||
from modules import sd_samplers, shared, script_callbacks
|
from modules import sd_samplers, shared, script_callbacks
|
||||||
from modules.shared import opts, cmd_opts
|
from modules.shared import opts, cmd_opts
|
||||||
@ -553,10 +554,45 @@ def save_image(image, path, basename, seed=None, prompt=None, extension='png', i
|
|||||||
return fullfn, txt_fullfn
|
return fullfn, txt_fullfn
|
||||||
|
|
||||||
|
|
||||||
|
def read_info_from_image(image):
|
||||||
|
items = image.info or {}
|
||||||
|
|
||||||
|
geninfo = items.pop('parameters', None)
|
||||||
|
|
||||||
|
if "exif" in items:
|
||||||
|
exif = piexif.load(items["exif"])
|
||||||
|
exif_comment = (exif or {}).get("Exif", {}).get(piexif.ExifIFD.UserComment, b'')
|
||||||
|
try:
|
||||||
|
exif_comment = piexif.helper.UserComment.load(exif_comment)
|
||||||
|
except ValueError:
|
||||||
|
exif_comment = exif_comment.decode('utf8', errors="ignore")
|
||||||
|
|
||||||
|
items['exif comment'] = exif_comment
|
||||||
|
geninfo = exif_comment
|
||||||
|
|
||||||
|
for field in ['jfif', 'jfif_version', 'jfif_unit', 'jfif_density', 'dpi', 'exif',
|
||||||
|
'loop', 'background', 'timestamp', 'duration']:
|
||||||
|
items.pop(field, None)
|
||||||
|
|
||||||
|
if items.get("Software", None) == "NovelAI":
|
||||||
|
try:
|
||||||
|
json_info = json.loads(items["Comment"])
|
||||||
|
sampler = sd_samplers.samplers_map.get(json_info["sampler"], "Euler a")
|
||||||
|
|
||||||
|
geninfo = f"""{items["Description"]}
|
||||||
|
Negative prompt: {json_info["uc"]}
|
||||||
|
Steps: {json_info["steps"]}, Sampler: {sampler}, CFG scale: {json_info["scale"]}, Seed: {json_info["seed"]}, Size: {image.width}x{image.height}, Clip skip: 2, ENSD: 31337"""
|
||||||
|
except Exception:
|
||||||
|
print(f"Error parsing NovelAI iamge generation parameters:", file=sys.stderr)
|
||||||
|
print(traceback.format_exc(), file=sys.stderr)
|
||||||
|
|
||||||
|
return geninfo, items
|
||||||
|
|
||||||
|
|
||||||
def image_data(data):
|
def image_data(data):
|
||||||
try:
|
try:
|
||||||
image = Image.open(io.BytesIO(data))
|
image = Image.open(io.BytesIO(data))
|
||||||
textinfo = image.text["parameters"]
|
textinfo, _ = read_info_from_image(image)
|
||||||
return textinfo, None
|
return textinfo, None
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
@ -18,7 +18,7 @@ from modules.script_callbacks import CFGDenoiserParams, cfg_denoiser_callback
|
|||||||
SamplerData = namedtuple('SamplerData', ['name', 'constructor', 'aliases', 'options'])
|
SamplerData = namedtuple('SamplerData', ['name', 'constructor', 'aliases', 'options'])
|
||||||
|
|
||||||
samplers_k_diffusion = [
|
samplers_k_diffusion = [
|
||||||
('Euler a', 'sample_euler_ancestral', ['k_euler_a'], {}),
|
('Euler a', 'sample_euler_ancestral', ['k_euler_a', 'k_euler_ancestral'], {}),
|
||||||
('Euler', 'sample_euler', ['k_euler'], {}),
|
('Euler', 'sample_euler', ['k_euler'], {}),
|
||||||
('LMS', 'sample_lms', ['k_lms'], {}),
|
('LMS', 'sample_lms', ['k_lms'], {}),
|
||||||
('Heun', 'sample_heun', ['k_heun'], {}),
|
('Heun', 'sample_heun', ['k_heun'], {}),
|
||||||
|
Loading…
Reference in New Issue
Block a user