fix(api): reduce copies, fix function signatures
This commit is contained in:
parent
ef06b45599
commit
f5ed77a349
|
@ -13,21 +13,6 @@ def blend_imult(a):
|
||||||
return 1.0 - blend_mult(a)
|
return 1.0 - blend_mult(a)
|
||||||
|
|
||||||
|
|
||||||
def blend_mask_source(source: Tuple[int, int, int], mask: Tuple[int, int, int], noise: Tuple[int, int, int]) -> Tuple[int, int, int]:
|
|
||||||
'''
|
|
||||||
Blend operation, linear interpolation from noise to source based on mask: `(s * (1 - m)) + (n * m)`
|
|
||||||
Black = noise
|
|
||||||
White = source
|
|
||||||
'''
|
|
||||||
return (
|
|
||||||
int((source[0] * blend_mult(mask[0])) +
|
|
||||||
(noise[0] * blend_imult(mask[0]))),
|
|
||||||
int((source[1] * blend_mult(mask[1])) +
|
|
||||||
(noise[1] * blend_imult(mask[1]))),
|
|
||||||
int((source[2] * blend_mult(mask[2])) +
|
|
||||||
(noise[2] * blend_imult(mask[2]))),
|
|
||||||
)
|
|
||||||
|
|
||||||
def blend_source_mask(source: Tuple[int, int, int], mask: Tuple[int, int, int], noise: Tuple[int, int, int]) -> Tuple[int, int, int]:
|
def blend_source_mask(source: Tuple[int, int, int], mask: Tuple[int, int, int], noise: Tuple[int, int, int]) -> Tuple[int, int, int]:
|
||||||
'''
|
'''
|
||||||
Blend operation, linear interpolation from source to noise based on mask: `(s * (1 - m)) + (n * m)`
|
Blend operation, linear interpolation from source to noise based on mask: `(s * (1 - m)) + (n * m)`
|
||||||
|
@ -44,14 +29,20 @@ def blend_source_mask(source: Tuple[int, int, int], mask: Tuple[int, int, int],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def mask_filter_gaussian(mask_image: Image, dims: Tuple[int, int], origin: Tuple[int, int], rounds=3) -> Tuple[float, float, float]:
|
def mask_filter_none(mask_image: Image, dims: Tuple[int, int], origin: Tuple[int, int], fill='white') -> Image:
|
||||||
|
width, height = dims
|
||||||
|
|
||||||
|
noise = Image.new('RGB', (width, height), fill)
|
||||||
|
noise.paste(mask_image, origin)
|
||||||
|
|
||||||
|
return noise
|
||||||
|
|
||||||
|
|
||||||
|
def mask_filter_gaussian(mask_image: Image, dims: Tuple[int, int], origin: Tuple[int, int], rounds=3) -> Image:
|
||||||
'''
|
'''
|
||||||
Gaussian blur, source image centered on white canvas.
|
Gaussian blur, source image centered on white canvas.
|
||||||
'''
|
'''
|
||||||
width, height = dims
|
noise = mask_filter_none(mask_image, dims, origin)
|
||||||
|
|
||||||
noise = Image.new('RGB', (width, height), 'white')
|
|
||||||
noise.paste(mask_image, origin)
|
|
||||||
|
|
||||||
for i in range(rounds):
|
for i in range(rounds):
|
||||||
blur = noise.filter(ImageFilter.GaussianBlur(5))
|
blur = noise.filter(ImageFilter.GaussianBlur(5))
|
||||||
|
@ -60,7 +51,7 @@ def mask_filter_gaussian(mask_image: Image, dims: Tuple[int, int], origin: Tuple
|
||||||
return noise
|
return noise
|
||||||
|
|
||||||
|
|
||||||
def noise_source_fill(source_image: Image, dims: Tuple[int, int], origin: Tuple[int, int], fill='white') -> Tuple[float, float, float]:
|
def noise_source_fill(source_image: Image, dims: Tuple[int, int], origin: Tuple[int, int], fill='white') -> Image:
|
||||||
'''
|
'''
|
||||||
Identity transform, source image centered on white canvas.
|
Identity transform, source image centered on white canvas.
|
||||||
'''
|
'''
|
||||||
|
@ -72,7 +63,7 @@ def noise_source_fill(source_image: Image, dims: Tuple[int, int], origin: Tuple[
|
||||||
return noise
|
return noise
|
||||||
|
|
||||||
|
|
||||||
def noise_source_gaussian(source_image: Image, dims: Tuple[int, int], origin: Tuple[int, int], rounds=3) -> Tuple[float, float, float]:
|
def noise_source_gaussian(source_image: Image, dims: Tuple[int, int], origin: Tuple[int, int], rounds=3) -> Image:
|
||||||
'''
|
'''
|
||||||
Gaussian blur, source image centered on white canvas.
|
Gaussian blur, source image centered on white canvas.
|
||||||
'''
|
'''
|
||||||
|
@ -85,7 +76,7 @@ def noise_source_gaussian(source_image: Image, dims: Tuple[int, int], origin: Tu
|
||||||
return noise
|
return noise
|
||||||
|
|
||||||
|
|
||||||
def noise_source_uniform(source_image: Image, dims: Tuple[int, int], origin: Tuple[int, int]) -> Tuple[float, float, float]:
|
def noise_source_uniform(source_image: Image, dims: Tuple[int, int], origin: Tuple[int, int]) -> Image:
|
||||||
width, height = dims
|
width, height = dims
|
||||||
size = width * height
|
size = width * height
|
||||||
|
|
||||||
|
@ -107,7 +98,7 @@ def noise_source_uniform(source_image: Image, dims: Tuple[int, int], origin: Tup
|
||||||
return noise
|
return noise
|
||||||
|
|
||||||
|
|
||||||
def noise_source_normal(source_image: Image, dims: Tuple[int, int], origin: Tuple[int, int]) -> Tuple[float, float, float]:
|
def noise_source_normal(source_image: Image, dims: Tuple[int, int], origin: Tuple[int, int]) -> Image:
|
||||||
width, height = dims
|
width, height = dims
|
||||||
size = width * height
|
size = width * height
|
||||||
|
|
||||||
|
@ -129,7 +120,7 @@ def noise_source_normal(source_image: Image, dims: Tuple[int, int], origin: Tupl
|
||||||
return noise
|
return noise
|
||||||
|
|
||||||
|
|
||||||
def noise_source_histogram(source_image: Image, dims: Tuple[int, int], origin: Tuple[int, int]) -> Tuple[float, float, float]:
|
def noise_source_histogram(source_image: Image, dims: Tuple[int, int], origin: Tuple[int, int]) -> Image:
|
||||||
r, g, b = source_image.split()
|
r, g, b = source_image.split()
|
||||||
width, height = dims
|
width, height = dims
|
||||||
size = width * height
|
size = width * height
|
||||||
|
@ -180,9 +171,9 @@ def expand_image(
|
||||||
full_source = Image.new('RGB', dims, fill)
|
full_source = Image.new('RGB', dims, fill)
|
||||||
full_source.paste(source_image, origin)
|
full_source.paste(source_image, origin)
|
||||||
|
|
||||||
full_mask = Image.new('RGB', dims, fill)
|
full_mask = mask_filter(mask_image, dims, origin)
|
||||||
full_mask = mask_filter_gaussian(full_mask, dims, origin)
|
# full_mask = Image.new('RGB', dims, fill)
|
||||||
full_mask.paste(mask_image, origin)
|
# full_mask.paste(mask_image, origin)
|
||||||
|
|
||||||
full_noise = noise_source(source_image, dims, origin)
|
full_noise = noise_source(source_image, dims, origin)
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,18 @@ from struct import pack
|
||||||
from os import environ, makedirs, path, scandir
|
from os import environ, makedirs, path, scandir
|
||||||
from typing import Any, Dict, Tuple, Union
|
from typing import Any, Dict, Tuple, Union
|
||||||
|
|
||||||
from .image import expand_image, noise_source_gaussian, noise_source_histogram, noise_source_normal, noise_source_fill, noise_source_uniform, blend_source_mask, blend_imult, blend_mask_source, blend_mult
|
from .image import (
|
||||||
|
expand_image,
|
||||||
|
# mask filters
|
||||||
|
mask_filter_gaussian,
|
||||||
|
mask_filter_none,
|
||||||
|
# noise sources
|
||||||
|
noise_source_gaussian,
|
||||||
|
noise_source_histogram,
|
||||||
|
noise_source_normal,
|
||||||
|
noise_source_fill,
|
||||||
|
noise_source_uniform,
|
||||||
|
)
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
@ -79,9 +90,9 @@ noise_sources = {
|
||||||
'normal': noise_source_normal,
|
'normal': noise_source_normal,
|
||||||
'uniform': noise_source_uniform,
|
'uniform': noise_source_uniform,
|
||||||
}
|
}
|
||||||
blend_modes = {
|
mask_filters = {
|
||||||
'mask-source': blend_mask_source,
|
'none': mask_filter_none,
|
||||||
'source-mask': blend_source_mask,
|
'gaussian': mask_filter_gaussian,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -294,7 +305,7 @@ def run_inpaint_pipeline(
|
||||||
top: int,
|
top: int,
|
||||||
bottom: int,
|
bottom: int,
|
||||||
noise_source: Any,
|
noise_source: Any,
|
||||||
blend_op: Any
|
mask_filter: Any
|
||||||
):
|
):
|
||||||
pipe = load_pipeline(OnnxStableDiffusionInpaintPipeline,
|
pipe = load_pipeline(OnnxStableDiffusionInpaintPipeline,
|
||||||
model, provider, scheduler)
|
model, provider, scheduler)
|
||||||
|
@ -309,7 +320,7 @@ def run_inpaint_pipeline(
|
||||||
mask_image,
|
mask_image,
|
||||||
(left, right, top, bottom),
|
(left, right, top, bottom),
|
||||||
noise_source=noise_source,
|
noise_source=noise_source,
|
||||||
blend_op=blend_op)
|
mask_filter=mask_filter)
|
||||||
|
|
||||||
if environ.get('DEBUG') is not None:
|
if environ.get('DEBUG') is not None:
|
||||||
source_image.save('./last-source.png')
|
source_image.save('./last-source.png')
|
||||||
|
@ -391,9 +402,9 @@ def introspect():
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@app.route('/api/settings/blends')
|
@app.route('/api/settings/masks')
|
||||||
def list_blend_sources():
|
def list_mask_filters():
|
||||||
return jsonify(list(blend_modes.keys()))
|
return jsonify(list(mask_filters.keys()))
|
||||||
|
|
||||||
|
|
||||||
@app.route('/api/settings/models')
|
@app.route('/api/settings/models')
|
||||||
|
@ -505,9 +516,9 @@ def inpaint():
|
||||||
bottom = get_and_clamp_int(
|
bottom = get_and_clamp_int(
|
||||||
request.args, 'bottom', 0, config_params.get('height').get('max'), 0)
|
request.args, 'bottom', 0, config_params.get('height').get('max'), 0)
|
||||||
|
|
||||||
|
mask_filter= get_from_map(request.args, 'filter', mask_filters, 'none')
|
||||||
noise_source = get_from_map(
|
noise_source = get_from_map(
|
||||||
request.args, 'noise', noise_sources, 'histogram')
|
request.args, 'noise', noise_sources, 'histogram')
|
||||||
blend_op = get_from_map(request.args, 'blend', blend_modes, 'mask-source')
|
|
||||||
|
|
||||||
(output_file, output_full) = make_output_path(
|
(output_file, output_full) = make_output_path(
|
||||||
'inpaint', seed, (prompt, cfg, steps, height, width, seed, left, right, top, bottom))
|
'inpaint', seed, (prompt, cfg, steps, height, width, seed, left, right, top, bottom))
|
||||||
|
@ -536,7 +547,7 @@ def inpaint():
|
||||||
top,
|
top,
|
||||||
bottom,
|
bottom,
|
||||||
noise_source,
|
noise_source,
|
||||||
blend_op)
|
mask_filter)
|
||||||
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
'output': output_file,
|
'output': output_file,
|
||||||
|
|
Loading…
Reference in New Issue