Skip to content

Commit 50974ff

Browse files
committed
inpaint: masked diffusion for inpainting models with inflated mask
1 parent f2fb03b commit 50974ff

1 file changed

Lines changed: 19 additions & 1 deletion

File tree

src/stable-diffusion.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3120,7 +3120,25 @@ sd_image_t* generate_image_internal(sd_ctx_t* sd_ctx,
31203120
}
31213121
cond.c_concat = concat_latent;
31223122
uncond.c_concat = empty_latent;
3123-
denoise_mask = nullptr;
3123+
// inflate the masked area by taking the max of the surrounding latent pixels, to avoid the edge artifacts
3124+
auto orig_denoise_mask = ggml_ext_dup_and_cpy_tensor(work_ctx, denoise_mask);
3125+
for (int ix = 0; ix < denoise_mask->ne[0]; ix++) {
3126+
for (int iy = 0; iy < denoise_mask->ne[1]; iy++) {
3127+
float max = ggml_ext_tensor_get_f32(orig_denoise_mask, ix, iy);
3128+
for (int x = ix - 1; x <= ix + 1; x++) {
3129+
for (int y = iy - 1; y <= iy + 1; y++) {
3130+
if (x >= 0 && x < denoise_mask->ne[0] && y >= 0 && y < denoise_mask->ne[1]) {
3131+
float v = ggml_ext_tensor_get_f32(orig_denoise_mask, x, y);
3132+
if (v > max) {
3133+
max = v;
3134+
}
3135+
}
3136+
}
3137+
}
3138+
ggml_ext_tensor_set_f32(denoise_mask, max, ix, iy);
3139+
}
3140+
}
3141+
// denoise_mask = nullptr;
31243142
} else if (sd_version_is_unet_edit(sd_ctx->sd->version)) {
31253143
auto empty_latent = ggml_dup_tensor(work_ctx, init_latent);
31263144
ggml_set_f32(empty_latent, 0);

0 commit comments

Comments
 (0)