1
0
Fork 0
onnx-web/api/onnx_web/output.py

118 lines
3.1 KiB
Python
Raw Normal View History

2023-02-02 14:31:35 +00:00
from hashlib import sha256
from json import dumps
2023-02-02 14:31:35 +00:00
from logging import getLogger
from os import path
2023-02-02 14:31:35 +00:00
from struct import pack
from time import time
from typing import Any, List, Optional, Tuple
2023-02-05 13:53:26 +00:00
from PIL import Image
from .diffusion.load import get_scheduler_name
2023-02-05 13:53:26 +00:00
from .params import Border, ImageParams, Param, Size, UpscaleParams
2023-02-19 02:28:21 +00:00
from .server import ServerContext
from .utils import base_join
2023-02-02 14:31:35 +00:00
logger = getLogger(__name__)
2023-02-02 14:31:35 +00:00
def hash_value(sha, param: Param):
if param is None:
return
elif isinstance(param, bool):
sha.update(bytearray(pack("!B", param)))
2023-02-02 14:31:35 +00:00
elif isinstance(param, float):
2023-02-05 13:53:26 +00:00
sha.update(bytearray(pack("!f", param)))
2023-02-02 14:31:35 +00:00
elif isinstance(param, int):
2023-02-05 13:53:26 +00:00
sha.update(bytearray(pack("!I", param)))
2023-02-02 14:31:35 +00:00
elif isinstance(param, str):
2023-02-05 13:53:26 +00:00
sha.update(param.encode("utf-8"))
2023-02-02 14:31:35 +00:00
else:
2023-02-05 13:53:26 +00:00
logger.warn("cannot hash param: %s, %s", param, type(param))
2023-02-02 14:31:35 +00:00
def json_params(
outputs: List[str],
params: ImageParams,
size: Size,
upscale: Optional[UpscaleParams] = None,
border: Optional[Border] = None,
) -> Any:
json = {
"outputs": outputs,
2023-02-05 13:53:26 +00:00
"params": params.tojson(),
}
json["params"]["model"] = path.basename(params.model)
json["params"]["scheduler"] = get_scheduler_name(params.scheduler)
if border is not None:
json["border"] = border.tojson()
size = size.add_border(border)
if upscale is not None:
2023-02-05 13:53:26 +00:00
json["upscale"] = upscale.tojson()
size = upscale.resize(size)
2023-02-05 13:53:26 +00:00
json["size"] = size.tojson()
return json
2023-02-02 14:31:35 +00:00
def make_output_name(
ctx: ServerContext,
2023-02-02 14:31:35 +00:00
mode: str,
params: ImageParams,
size: Size,
2023-02-05 13:53:26 +00:00
extras: Optional[Tuple[Param]] = None,
) -> List[str]:
2023-02-02 14:31:35 +00:00
now = int(time())
sha = sha256()
hash_value(sha, mode)
hash_value(sha, params.model)
hash_value(sha, params.scheduler.__name__)
hash_value(sha, params.prompt)
hash_value(sha, params.negative_prompt)
hash_value(sha, params.cfg)
hash_value(sha, params.seed)
hash_value(sha, params.steps)
hash_value(sha, params.lpw)
hash_value(sha, params.eta)
hash_value(sha, params.batch)
hash_value(sha, params.inversion)
2023-02-02 14:31:35 +00:00
hash_value(sha, size.width)
hash_value(sha, size.height)
if extras is not None:
for param in extras:
hash_value(sha, param)
return [
f"{mode}_{params.seed}_{sha.hexdigest()}_{now}_{i}.{ctx.image_format}"
for i in range(params.batch)
]
2023-02-02 14:31:35 +00:00
def save_image(ctx: ServerContext, output: str, image: Image.Image) -> str:
path = base_join(ctx.output_path, output)
image.save(path, format=ctx.image_format)
2023-02-05 13:53:26 +00:00
logger.debug("saved output image to: %s", path)
return path
def save_params(
ctx: ServerContext,
output: str,
params: ImageParams,
size: Size,
upscale: Optional[UpscaleParams] = None,
border: Optional[Border] = None,
) -> str:
path = base_join(ctx.output_path, f"{output}.json")
json = json_params(output, params, size, upscale=upscale, border=border)
2023-02-05 13:53:26 +00:00
with open(path, "w") as f:
f.write(dumps(json))
2023-02-05 13:53:26 +00:00
logger.debug("saved image params to: %s", path)
2023-02-02 14:31:35 +00:00
return path