BrushNet: A Plug-and-Play Image Inpainting Model with Decomposed Dual-Branch Diffusion

Introduction

code

ECCV 2024.

提出了一个双分支的扩散inpainting模型,同时改模块可以即插即用用到其他微调的模型中。

Methods

首先对比了其他的两种inpainting思路。

第一种是直接微调unet对mask区域进行inpainting,然后再与原先未mask的区域拼合。但是指出这样边缘会很割裂,同时没有学习上下文语义信息

第二种是将mask,noise和image拼在一起,进行去噪过程。这种又可以分为两种,一种为dedicated inpainting models。这种受prompt的影响比较大,因为在早期prompt就会和latent information进行计算。另一种是通过controlnet微调,这种方法可能更能够保留结构相似度,而不是像素对应。

本文提出的pipeline如上图所示,从预训练unet中copy权重,然后进行微调,对应的层之间初始化为zero convolution,并且text embedding只参与去噪的过程。

同时为了缓解inpainting不在同一图层的情况,提出了一个后处理方式,即对mask图区域进行一次高斯模糊,让过渡更平滑。

if blended:
    image_np=np.array(image)
    init_image_np=cv2.imread(image_path)[:,:,::-1]
    mask_np = 1.*(cv2.imread(mask_path).sum(-1)>255)[:,:,np.newaxis]

    # blur, you can adjust the parameters for better performance
    mask_blurred = cv2.GaussianBlur(mask_np*255, (21, 21), 0)/255
    mask_blurred = mask_blurred[:,:,np.newaxis]
    mask_np = 1-(1-mask_np) * (1-mask_blurred)

    image_pasted=init_image_np * (1-mask_np) + image_np*mask_np
    image_pasted=image_pasted.astype(image_np.dtype)
    image=Image.fromarray(image_pasted)

由于模型并没有更改预训练unet的参数,所以文中称其为即插即用。同时在通过1*1卷积与预训练unet结合时,可以调整参数改变保留原始未mask区域的程度,具有一定的灵活性。

Experiments

提出了BrushBench用来评估,提出了BrushData用于训练

不同模型的对比:

即插即用效果:

灵活控制:


BrushNet: A Plug-and-Play Image Inpainting Model with Decomposed Dual-Branch Diffusion
https://dreamerland.cn/2024/10/28/图像编辑/BrushNet/
作者
Silva31
发布于
2024年10月28日
许可协议