mirror of
https://github.com/KoboldAI/KoboldAI-Client.git
synced 2025-06-05 21:59:24 +02:00
Added new function text2img_api()
- sends prompt to locally hosted stable-diffusion-webui API and retrieves image result. info from SD API is embedded in png file as it is saved. image files are named with the current date at generation and saved in /stories/art/ Modified UI_2_generate_image() to call text2img_api() instead of text2img_horde Signed-off-by: Robert Vining <offers@robertrvining.com>
This commit is contained in:
58
aiserver.py
58
aiserver.py
@@ -81,7 +81,7 @@ import transformers.generation_utils
|
|||||||
|
|
||||||
# Text2img
|
# Text2img
|
||||||
import base64
|
import base64
|
||||||
from PIL import Image, ImageFont, ImageDraw, ImageFilter, ImageOps
|
from PIL import Image, ImageFont, ImageDraw, ImageFilter, ImageOps, PngImagePlugin
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
global tpu_mtj_backend
|
global tpu_mtj_backend
|
||||||
@@ -9098,7 +9098,7 @@ def UI_2_generate_image(data):
|
|||||||
#If we don't have a GPU, use horde if we're allowed to
|
#If we don't have a GPU, use horde if we're allowed to
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
if ((not koboldai_vars.hascuda or not os.path.exists("models/stable-diffusion-v1-4")) and koboldai_vars.img_gen_priority != 0) or koboldai_vars.img_gen_priority == 3:
|
if ((not koboldai_vars.hascuda or not os.path.exists("models/stable-diffusion-v1-4")) and koboldai_vars.img_gen_priority != 0) or koboldai_vars.img_gen_priority == 3:
|
||||||
b64_data = text2img_horde(", ".join(keys), art_guide = art_guide)
|
b64_data = text2img_api(", ".join(keys), art_guide = art_guide)
|
||||||
else:
|
else:
|
||||||
import psutil
|
import psutil
|
||||||
#We aren't being forced to use horde, so now let's figure out if we should use local
|
#We aren't being forced to use horde, so now let's figure out if we should use local
|
||||||
@@ -9108,9 +9108,9 @@ def UI_2_generate_image(data):
|
|||||||
elif torch.cuda.get_device_properties(0).total_memory > 6000000000 and koboldai_vars.img_gen_priority <= 1:
|
elif torch.cuda.get_device_properties(0).total_memory > 6000000000 and koboldai_vars.img_gen_priority <= 1:
|
||||||
#We could do it locally by swapping the model out
|
#We could do it locally by swapping the model out
|
||||||
print("Could do local or online")
|
print("Could do local or online")
|
||||||
b64_data = text2img_horde(", ".join(keys), art_guide = art_guide)
|
b64_data = text2img_api(", ".join(keys), art_guide = art_guide)
|
||||||
elif koboldai_vars.img_gen_priority != 0:
|
elif koboldai_vars.img_gen_priority != 0:
|
||||||
b64_data = text2img_horde(", ".join(keys), art_guide = art_guide)
|
b64_data = text2img_api(", ".join(keys), art_guide = art_guide)
|
||||||
logger.debug("Time to Generate Image {}".format(time.time()-start_time))
|
logger.debug("Time to Generate Image {}".format(time.time()-start_time))
|
||||||
koboldai_vars.picture = b64_data
|
koboldai_vars.picture = b64_data
|
||||||
koboldai_vars.picture_prompt = ", ".join(keys)
|
koboldai_vars.picture_prompt = ", ".join(keys)
|
||||||
@@ -9136,7 +9136,7 @@ def text2img_local(prompt, art_guide="", filename="new.png"):
|
|||||||
def get_image(pipe, prompt, num_inference_steps):
|
def get_image(pipe, prompt, num_inference_steps):
|
||||||
from torch import autocast
|
from torch import autocast
|
||||||
with autocast("cuda"):
|
with autocast("cuda"):
|
||||||
return pipe(prompt, num_inference_steps=num_inference_steps)["sample"][0]
|
return pipe(prompt, num_inference_steps=num_inference_steps).images[0]
|
||||||
image = tpool.execute(get_image, pipe, prompt, num_inference_steps=35)
|
image = tpool.execute(get_image, pipe, prompt, num_inference_steps=35)
|
||||||
buffered = BytesIO()
|
buffered = BytesIO()
|
||||||
image.save(buffered, format="JPEG")
|
image.save(buffered, format="JPEG")
|
||||||
@@ -9195,6 +9195,54 @@ def text2img_horde(prompt,
|
|||||||
koboldai_vars.generating_image = False
|
koboldai_vars.generating_image = False
|
||||||
logger.error(submit_req.text)
|
logger.error(submit_req.text)
|
||||||
|
|
||||||
|
#@logger.catch
|
||||||
|
def text2img_api(prompt,
|
||||||
|
art_guide = 'fantasy illustration, artstation, by Hugin Miyama by Taiki Kawakami, cinematic lighting',
|
||||||
|
filename = "story_art.png"):
|
||||||
|
logger.debug("Generating Image using external API")
|
||||||
|
koboldai_vars.generating_image = True
|
||||||
|
final_imgen_params = {
|
||||||
|
"prompt": "{}, {}".format(prompt, art_guide),
|
||||||
|
"n": 1,
|
||||||
|
"width": 512,
|
||||||
|
"height": 512,
|
||||||
|
"steps": 50,
|
||||||
|
"cfg_scale": 14,
|
||||||
|
"negative_prompt": " lowres, bad anatomy, bad hands out of frame, two heads, totem pole, several faces, extra fingers, mutated hands, (poorly drawn hands:1.21), (poorly drawn face:1.21), (mutation:1.331), (deformed:1.331), (ugly:1.21), blurry, (bad anatomy:1.21), (bad proportions:1.331), (extra limbs:1.21), glitchy, ((clip through table)), adherent bodies, slimy bodies, (badly visible legs), captions, words",
|
||||||
|
}
|
||||||
|
|
||||||
|
final_submit_dict = {
|
||||||
|
"prompt": "{}, {}".format(prompt, art_guide),
|
||||||
|
"params": final_imgen_params,
|
||||||
|
}
|
||||||
|
apiaddress = 'http://127.0.0.1:7860/sdapi/v1/txt2img'
|
||||||
|
payload_json = json.dumps(final_imgen_params)
|
||||||
|
logger.debug(final_submit_dict)
|
||||||
|
submit_req = requests.post(url=f'{apiaddress}', data=payload_json).json()
|
||||||
|
if submit_req:
|
||||||
|
results = submit_req
|
||||||
|
for i in results['images']:
|
||||||
|
final_src_img = Image.open(BytesIO(base64.b64decode(i.split(",",1)[1])))
|
||||||
|
buffer = BytesIO()
|
||||||
|
final_src_img.save(buffer, format="Webp", quality=95)
|
||||||
|
b64img = base64.b64encode(buffer.getvalue()).decode("utf8")
|
||||||
|
base64_bytes = b64img.encode('utf-8')
|
||||||
|
img_bytes = base64.b64decode(base64_bytes)
|
||||||
|
img = Image.open(BytesIO(img_bytes))
|
||||||
|
#dtnow = datetime.datetime.now()
|
||||||
|
#dt_string = dtnow().strftime("%H%M%S%d%m%Y")
|
||||||
|
dt_string = datetime.datetime.now().strftime("%H%M%S%d%m%Y")
|
||||||
|
final_filename = "stories/art/{}_{}".format(dt_string,filename)
|
||||||
|
pnginfo = PngImagePlugin.PngInfo()
|
||||||
|
pnginfo.add_text("parameters", str(results['info']))
|
||||||
|
img.save(final_filename, pnginfo=pnginfo)
|
||||||
|
logger.debug("Saved Image")
|
||||||
|
koboldai_vars.generating_image = False
|
||||||
|
return(b64img)
|
||||||
|
else:
|
||||||
|
koboldai_vars.generating_image = False
|
||||||
|
logger.error(submit_req.text)
|
||||||
|
|
||||||
#@logger.catch
|
#@logger.catch
|
||||||
def get_items_locations_from_text(text):
|
def get_items_locations_from_text(text):
|
||||||
# load model and tokenizer
|
# load model and tokenizer
|
||||||
|
Reference in New Issue
Block a user