From 83c24ff2e57e1c44a5dd6daf11f522840ef2cee8 Mon Sep 17 00:00:00 2001 From: Manuel Schmid Date: Sun, 3 Mar 2024 14:42:42 +0100 Subject: [PATCH 1/2] feat: add inpaint functionality for mask upload allows to quickly adjust the mask after automated generation --- modules/async_worker.py | 18 +++++++++++------- webui.py | 3 +-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/modules/async_worker.py b/modules/async_worker.py index fd785f07..c1c04b06 100644 --- a/modules/async_worker.py +++ b/modules/async_worker.py @@ -320,13 +320,17 @@ def worker(): inpaint_mask = inpaint_input_image['mask'][:, :, 0] if inpaint_mask_upload_checkbox: - if isinstance(inpaint_mask_image_upload, np.ndarray): - if inpaint_mask_image_upload.ndim == 3: - H, W, C = inpaint_image.shape - inpaint_mask_image_upload = resample_image(inpaint_mask_image_upload, width=W, height=H) - inpaint_mask_image_upload = np.mean(inpaint_mask_image_upload, axis=2) - inpaint_mask_image_upload = (inpaint_mask_image_upload > 127).astype(np.uint8) * 255 - inpaint_mask = np.maximum(inpaint_mask, inpaint_mask_image_upload) + if isinstance(inpaint_mask_image_upload, dict): + if (isinstance(inpaint_mask_image_upload['image'], np.ndarray) + and isinstance(inpaint_mask_image_upload['mask'], np.ndarray) + and inpaint_mask_image_upload['image'].ndim == 3): + inpaint_mask_image_upload = np.maximum(inpaint_mask_image_upload['image'], inpaint_mask_image_upload['mask'][:, :, 0]) + if isinstance(inpaint_mask_image_upload, np.ndarray) and inpaint_mask_image_upload.ndim == 3: + H, W, C = inpaint_image.shape + inpaint_mask_image_upload = resample_image(inpaint_mask_image_upload, width=W, height=H) + inpaint_mask_image_upload = np.mean(inpaint_mask_image_upload, axis=2) + inpaint_mask_image_upload = (inpaint_mask_image_upload > 127).astype(np.uint8) * 255 + inpaint_mask = np.maximum(inpaint_mask, inpaint_mask_image_upload) if int(inpaint_erode_or_dilate) != 0: inpaint_mask = erode_or_dilate(inpaint_mask, inpaint_erode_or_dilate) diff --git a/webui.py b/webui.py index 08ed29da..79b946e5 100644 --- a/webui.py +++ b/webui.py @@ -209,8 +209,7 @@ with shared.gradio_root: example_inpaint_prompts.click(lambda x: x[0], inputs=example_inpaint_prompts, outputs=inpaint_additional_prompt, show_progress=False, queue=False) with gr.Column(visible=False) as inpaint_mask_generation_col: - inpaint_mask_image = grh.Image(label='Mask Upload', source='upload', type='numpy', - height=500) + inpaint_mask_image = grh.Image(label='Mask Upload', source='upload', type='numpy', tool='sketch', height=500, brush_color="#FFFFFF", mask_opacity=1) inpaint_mask_model = gr.Dropdown(label='Mask generation model', choices=flags.inpaint_mask_models, value=modules.config.default_inpaint_mask_model) From bf63506e8978ef19979abca9bdabc6ccf7c2f223 Mon Sep 17 00:00:00 2001 From: Manuel Schmid Date: Sun, 3 Mar 2024 15:02:03 +0100 Subject: [PATCH 2/2] fix: merge full array shapes, not only single channel of mask --- modules/async_worker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/async_worker.py b/modules/async_worker.py index c1c04b06..31b7cb07 100644 --- a/modules/async_worker.py +++ b/modules/async_worker.py @@ -324,7 +324,7 @@ def worker(): if (isinstance(inpaint_mask_image_upload['image'], np.ndarray) and isinstance(inpaint_mask_image_upload['mask'], np.ndarray) and inpaint_mask_image_upload['image'].ndim == 3): - inpaint_mask_image_upload = np.maximum(inpaint_mask_image_upload['image'], inpaint_mask_image_upload['mask'][:, :, 0]) + inpaint_mask_image_upload = np.maximum(inpaint_mask_image_upload['image'], inpaint_mask_image_upload['mask']) if isinstance(inpaint_mask_image_upload, np.ndarray) and inpaint_mask_image_upload.ndim == 3: H, W, C = inpaint_image.shape inpaint_mask_image_upload = resample_image(inpaint_mask_image_upload, width=W, height=H)