该存储库包含论文“InsertDiffusion:通过免训练扩散架构实现对象的身份保留可视化”的官方实现。
该实现支持两种不同的运行模式:
此外,该实现还提供了对预先存在的或生成的图像进行着色的选项。当不使用已经彩色的图像时,这会大大提高真实感。
此外,可以从头开始创建新环境(背景替换模式),也可以使用和调整预先存在的图像。
所有功能都可以从main.py
CLI 获得,也可以集成到您自己的项目中。要使用 CLI 或代码,需要具有 torch、Pillow、pandas、变压器和扩散器的环境。
要将图像插入到新创建的背景中,请执行:
python main.py --image " <path to your image> " --background_prompt " <your prompt> "
例如:
python main.py --image " ./test_images/bikes/166.png " --background_prompt " a bicycle centered in frame in munich, 8k, red gemini, 50mm, f2.8, cinematic "
您可以通过提供必要的信息来使用自动提示功能,而不是直接提供提示。对于自行车,您需要提供所需的位置、自行车的索引以及数据表的路径。对于汽车,您必须提供所需的新位置、汽车制造商和汽车类型。对于产品,仅需要新位置和产品类型。
有关更多选项和插入给定背景,请参阅下面的完整 CLI 文档。
您可以使用此 python 函数将该过程集成到您的代码中,而不是使用 CLI(再次确保安装了所有依赖项并将 utils 模块复制到您的项目中):
from utils import get_mask_from_image , sd_inpainting , sd_img2img , paste_image
def insert_diffusion ( image : Image , mask_threshold : int , prompt : str , negative_prompt : str , img2img_model : str , inpainting_model : str , img2img_strength : float , inpainting_steps : int , inpainting_guidance : float , img2img_guidance : float , background_image : Image = None , composition_strength : float = 1 ) -> Image :
mask = get_mask_from_image ( image , mask_threshold )
if background_image is not None :
image = paste_image ( image , background_image )
inpainted = sd_inpainting ( inpainting_model , image , mask , prompt , negative_prompt , inpainting_guidance , inpainting_steps , inpainting_strength = composition_strength )
result = sd_img2img ( img2img_model , inpainted , prompt , negative_prompt , img2img_strength , img2img_guidance )
return result
我们实现了另一种方法来从点云生成自行车图像,然后将它们插入背景中。然而,这种方法效果不佳,因此不是我们研究的核心。点云生成由Ioan-Daniel Craciun实施,并基于由Jiajae Fan实施和训练的 DDPM/DDIM。
要从点云创建图像,请从 CLI 调用中删除--image
参数。在点模式下,您必须通过--datasheet_path
提供数据表路径。因此,最小的 CLI 命令变为:
python main.py --point --datasheet_path " <path to datasheet> " --background_prompt " <your prompt> "
您还可以在点模式下使用自动提示。
要将点云生成自行车集成到您的项目中,请复制 utils 文件夹并使用以下函数:
from utils import get_mask_and_background
from utils import inpaint as bike_inpainting
def bike_diffusion ( parameter_csv_path : str , device : torch . device , ckpt_id : str = '29000' , mask_dilation : int = 5 , mask_fill_holes : bool = True , bike_idx : int = 0 , wheel_design_type : int = 0 , width : int = 256 , height : int = 256 ):
assert wheel_design_type == 0 or wheel_design_type == 1
mask , background = get_mask_and_background ( parameter_csv_path , bike_idx , wheel_design_type , width , height )
bike_img = bike_inpainting ( background , mask , device , 50 , ckpt_id , mask_dilation , mask_fill_holes )
return bike_img . convert ( 'RGB' )
此函数返回的图像已准备好用于着色或插入。
如果您使用的是未着色的图像,请将--colorize
添加到之前的 CLI 调用之一。此外,您需要通过--colorization_prompt
提供着色提示,或通过--color
提供颜色来使用自动提示。
CLI 调用示例如下:
python main.py --image " ./test_images/bike_outline/168.png " --colorize --datasheet_path " ./csv/df_parameters_final.csv " --place " beach at sunset " --color " purple " --bike_idx 5 "
或者,要将着色集成到您的项目中,请复制 utils 模块并使用:
from utils import sd_colorization
def colorization ( image : Image , colorization_model : str , upscaling_model : str , colorization_prompt : str , colorization_negative_prompt : str , fill_holes : bool , dilation : int , strength : float , prompt_guidance : float ):
colorized = sd_colorization ( colorization_model , upscaling_model , image , colorization_prompt , negative_prompt = colorization_negative_prompt , fill_holes = fill_holes , dilation_iterations = dilation , colorization_strength = strength , prompt_guidance = prompt_guidance )
return colorized
注意:CLI 仍在构建中,可能会发生变化。
注意:适用的默认值代表我们实验中确定的参数。但根据具体用例,不同的值可能是最佳的。
争论 | 类型 | 描述 |
---|---|---|
- 图像 | 细绳 | 起始图像的路径,与 --points 互斥 |
--点 | 当使用点时,算法以点云模式运行,并首先从点云生成自行车轮廓,与 --image 互斥 | |
--掩码阈值 | 整数 | 用于修复,从彩色前景中辨别白色背景的阈值 |
--背景提示 | 细绳 | 后台生成的提示 |
--否定提示 | 细绳 | 后台生成的负面提示 |
--背景图像 | 细绳 | 字符串到用作起点的背景图像,仅当 --compositionstrength 设置为小于 1 的值时才相关 |
--成分强度 | 漂浮 | 决定改变多少起始点背景图片,唯一用到的是--background_image设置,范围0-1 |
--自动自行车提示 | 如果设置提示将使用自行车模板自动创建,则需要设置 --place、--datasheet_path 和 --bike_idx | |
--自动汽车提示 | 如果设置提示将使用汽车模板自动创建,则需要设置 --place、--car_manufacturer 和 --car_type | |
--自动产品 | 如果设置提示将使用产品模板自动创建,则需要设置 --place 和 --product_type | |
- 地方 | 细绳 | 对象插入位置的描述,仅在使用自动提示模板之一时使用 |
- 颜色 | 细绳 | 如果使用自动提示,自行车有什么颜色 |
--数据表路径 | 细绳 | 如果对自行车使用自动提示,则用于查找自行车类型的数据表路径 |
--bike_idx | 整数 | 如果对自行车使用自动提示,请在数据表中建立索引以查找自行车类型 |
--汽车制造商 | 细绳 | 如果对汽车使用自动提示,则为汽车制造商,例如 BMW |
--汽车类型 | 细绳 | 如果使用汽车自动提示,请输入汽车类型,例如 SUV 或 X5 |
--产品类型 | 细绳 | 如果对产品使用自动提示,请输入产品类型,例如灯 |
--inpainting_model | 细绳 | 使用哪个模型来生成背景(huggingface id) |
--img2img_model | 细绳 | 用于再扩散步骤的模型(huggingface id) |
--img2img_强度 | 漂浮 | 原始图像的再扩散中有多少噪声 |
--inpainting_steps | 整数 | 修复要执行多少个扩散步骤 |
--inpainting_guidance | 漂浮 | 在修复中应用多少无分类器指导 |
--img2img_guidance | 漂浮 | 在再扩散中应用多少无分类器指导 |
--输出文件夹 | 细绳 | 保存输出图像的文件夹路径 |
--着色 | 修复之前是否对图像进行着色 | |
--着色_模型 | 细绳 | 使用哪个模型进行着色(huggingface id) |
--upscaling_model | 细绳 | 使用哪个模型进行放大、着色所需的模型(huggingface id) |
--colorization_prompt | 细绳 | 提示着色,不需要提供 datasheet_path 和 color |
--colorization_negative_prompt | 细绳 | 着色的负面提示 |
--do_not_fill_holes | 用于着色蒙版的切换孔填充,仅在着色时相关 | |
- 扩张 | 整数 | 着色遮罩扩展多少,仅在着色时相关 |
--着色_强度 | 漂浮 | 着色时应用多少扩散,仅在着色时相关 |
--colorization_prompt_guidance | 漂浮 | 在着色过程中应用多少无分类器指导,仅在着色时相关 |
- 规模 | 漂浮 | 自行车缩小或升级的程度,较高的值会导致自行车在车架中占用更多空间,默认值为 1。 |
--fraction_down | 漂浮 | 自行车(中心)的相对 y 位置,较高的值使自行车更靠近图像的下边缘,默认值为 0.5(居中) |
--fraction_right | 漂浮 | 自行车(中心)的相对 x 位置,较高的值使自行车更靠近图像的右边缘,默认值为 0.5(居中) |
--ckpt_id | 细绳 | 用于从点云创建自行车轮廓的检查点 ID,仅在点模式下相关 |
--bike_mask_dilation | 整数 | 扩展点云生成的蒙版多少,仅在点模式下相关 |
--do_not_fill_bike_holes | 是否对自行车面罩应用孔填充,仅在点模式下相关 | |
--wheel_design | 整数 | 使用哪种车轮设计来生成自行车轮廓,目前仅实现 0 和 1,仅在点模式下相关 |
附加脚本interactive.py
提供了以人机交互方式交互生成图像的实现。这意味着,每一步都会并行生成五个选项,并要求用户选择最佳选项。然后,仅选择的图像用于下一步。
脚本不接受任何其他 CLI 参数,系统将提示用户做出所有决定。
要以交互模式运行,请执行:
python interactive.py
使用的评估代码或我们的论文可以在./evaluation
下找到。请注意,定量指标是使用以下 CLI 命令计算的:
python evaluate.py --exp_name " <experiment name> " --gen_file_path " <path to generated images> " --ref_file_path " <path to reference files> " --masks_path " <only used for composition, path to masks> "
使用提供的笔记本计算人类评估指标和推断统计数据。
如果发现我们的工作有帮助并希望将其用于您的研究或项目,请按如下方式引用该论文:
@misc { 2407.10592 ,
Author = { Phillip Mueller and Jannik Wiese and Ioan Craciun and Lars Mikelsons } ,
Title = { InsertDiffusion: Identity Preserving Visualization of Objects through a Training-Free Diffusion Architecture } ,
Year = { 2024 } ,
Eprint = { arXiv:2407.10592 } ,
}