該存儲庫包含論文“InsertDiffusion:透過免訓練擴散架構實現對象的身份保留可視化”的官方實現。
此實作支援兩種不同的運行模式:
此外,此實作還提供了對預先存在的或生成的圖像進行著色的選項。當不使用已經彩色的影像時,這會大大提高真實感。
此外,可以從頭開始建立新環境(背景替換模式),也可以使用和調整預先存在的影像。
所有功能都可以從main.py
CLI 取得,也可以整合到您自己的專案中。要使用 CLI 或代碼,需要具有 torch、Pillow、pandas、變壓器和擴散器的環境。
若要將圖像插入新建立的背景中,請執行:
python main.py --image "" --background_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 "" --background_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 "" --gen_file_path "" --ref_file_path "" --masks_path ""
使用提供的筆記本計算人類評估指標和推論統計數據。
如果發現我們的工作有幫助並希望將其用於您的研究或項目,請按如下方式引用該論文:
@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 } ,
}