Dieses Repository enthält die offizielle Implementierung für den Artikel „InsertDiffusion: Identity Preserving Visualization of Objects through a Training-Free Diffusion Architecture“.
Die Implementierung unterstützt zwei verschiedene Laufmodi:
Darüber hinaus bietet die Implementierung die Möglichkeit, die bereits vorhandenen oder generierten Bilder einzufärben. Wenn keine bereits farbigen Bilder verwendet werden, verbessert dies den Realismus drastisch.
Darüber hinaus kann entweder eine neue Umgebung von Grund auf erstellt werden (Hintergrundersetzungsmodus) oder ein bereits vorhandenes Bild verwendet und angepasst werden.
Alle Funktionen sind über die main.py
-CLI verfügbar und können auch in Ihre eigenen Projekte integriert werden. Um die CLI oder den Code zu verwenden, ist eine Umgebung mit Taschenlampe, Kissen, Pandas, Transformatoren und Diffusoren erforderlich.
Um ein Bild in einen neu erstellten Hintergrund einzufügen, führen Sie Folgendes aus:
python main.py --image " <path to your image> " --background_prompt " <your prompt> "
Also zum Beispiel:
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 "
Anstatt direkt eine Eingabeaufforderung bereitzustellen, können Sie die Funktionen zur automatischen Eingabeaufforderung nutzen, indem Sie die erforderlichen Informationen bereitstellen. Für Fahrräder müssen Sie den gewünschten Standort, den Index des Fahrrads und einen Pfad zum Datenblatt angeben. Bei Autos müssen Sie den gewünschten neuen Standort, den Fahrzeughersteller und den Fahrzeugtyp angeben. Für Produkte ist lediglich der neue Standort und ein Produkttyp erforderlich.
Weitere Optionen und das Einfügen in einen bestimmten Hintergrund finden Sie in der vollständigen CLI-Dokumentation unten.
Anstatt die CLI zu verwenden, können Sie die Prozedur mit dieser Python-Funktion in Ihren Code integrieren (stellen Sie erneut sicher, dass alle Abhängigkeiten installiert sind, und kopieren Sie das Utils-Modul in Ihr Projekt):
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
Wir haben eine zusätzliche Methode implementiert, um Biked-Bilder aus Punktwolken zu generieren und diese dann in einen Hintergrund einzufügen. Diese Methode funktioniert jedoch nicht gut und ist daher nicht von zentraler Bedeutung für unsere Forschung . Die Generierung aus Punktwolken wurde von Ioan-Daniel Craciun implementiert und basiert auf einem DDPM/DDIM, das von Jiajae Fan implementiert und trainiert wurde.
Um Bilder aus Punktwolken zu erstellen, entfernen Sie das Argument --image
aus Ihrem CLI-Aufruf. Im Punktmodus müssen Sie über --datasheet_path
einen Datenblattpfad angeben. Somit wird der minimale CLI-Befehl zu:
python main.py --point --datasheet_path " <path to datasheet> " --background_prompt " <your prompt> "
Sie können die automatische Eingabeaufforderung auch im Punktmodus verwenden.
Um die Generierung von Fahrrädern aus Punktwolken in Ihr Projekt zu integrieren, kopieren Sie den Ordner „utils“ und verwenden Sie die folgende Funktion:
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' )
Das von dieser Funktion zurückgegebene Bild kann zum Einfärben oder Einfügen verwendet werden.
Wenn Sie ein ungefärbtes Bild verwenden, fügen Sie --colorize
zu einem der vorherigen CLI-Aufrufe hinzu. Darüber hinaus müssen Sie über --colorization_prompt
eine Einfärbungsaufforderung bereitstellen oder die automatische Eingabeaufforderung verwenden, indem Sie über --color
eine Farbe angeben.
Ein Beispiel-CLI-Aufruf könnte sein:
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 "
Um die Kolorierung alternativ in Ihr Projekt zu integrieren, kopieren Sie das utils-Modul und verwenden Sie:
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
Hinweis : CLI befindet sich noch im Aufbau und kann sich ändern.
Hinweis : Gegebenenfalls stellen die Standardwerte die in unseren Experimenten ermittelten Parameter dar. Abhängig vom spezifischen Anwendungsfall können jedoch andere Werte optimal sein.
Argument | Typ | Beschreibung |
---|---|---|
--Bild | Zeichenfolge | Pfad zu einem Bild als Ausgangspunkt, sich gegenseitig ausschließend mit --points |
--Punkte | Wenn Punkte verwendet werden, läuft der Algorithmus im Punktwolkenmodus und generiert zunächst einen Fahrradumriss aus einer Punktwolke, gegenseitig ausschließend mit --image | |
--mask_threshold | int | Beim Inpainting gibt es eine Schwelle, um den weißen Hintergrund vom farbigen Vordergrund zu unterscheiden |
--background_prompt | Zeichenfolge | die Eingabeaufforderung für die Hintergrundgenerierung |
--negative_prompt | Zeichenfolge | Negative Aufforderung zur Hintergrundgenerierung |
--background_image | Zeichenfolge | Zeichenfolge an ein Hintergrundbild, das als Ausgangspunkt verwendet werden soll. Dies ist nur relevant, wenn die Stärke von --composition auf einen Wert kleiner als 1 eingestellt ist |
--composition_strength | schweben | Bestimmt, wie stark das Hintergrundbild des Startpunkts geändert werden soll. Es wird nur verwendet, wenn --background_image festgelegt ist und der Bereich 0-1 beträgt |
--auto_bike_prompt | Wenn festgelegte Eingabeaufforderungen automatisch mithilfe der Vorlage für Fahrräder erstellt werden, müssen --place, --datasheet_path und --bike_idx festgelegt werden | |
--auto_car_prompt | Wenn festgelegte Eingabeaufforderungen automatisch mithilfe der Vorlage für Autos erstellt werden, müssen --place, --car_manufacturer und --car_type festgelegt werden | |
--auto_product | Wenn festgelegte Eingabeaufforderungen automatisch mithilfe der Vorlage für Produkte erstellt werden, müssen --place und --product_type festgelegt werden | |
--Ort | Zeichenfolge | Beschreibung des Ortes, an dem das Objekt eingefügt werden soll, wird nur verwendet, wenn eine der Auto-Prompt-Vorlagen verwendet wird |
--Farbe | Zeichenfolge | Welche Farbe hat das Fahrrad, wenn Sie die automatische Eingabeaufforderung verwenden? |
--datasheet_path | Zeichenfolge | Wenn Sie die automatische Eingabeaufforderung für Fahrräder verwenden, gehen Sie zum Datenblatt, um nach dem Fahrradtyp zu suchen |
--bike_idx | int | Wenn Sie die automatische Eingabeaufforderung für Fahrräder verwenden, geben Sie im Datenblatt einen Index ein, um nach dem Fahrradtyp zu suchen |
--car_manufacturer | Zeichenfolge | Wenn Sie Autoprompting für Autos verwenden, geben Sie den Hersteller des Autos an, z. B. BMW |
--car_type | Zeichenfolge | Wenn Sie die automatische Eingabeaufforderung für Autos verwenden, geben Sie den Fahrzeugtyp an, z. B. SUV oder X5 |
--product_type | Zeichenfolge | Wenn Sie die automatische Eingabeaufforderung für Produkte verwenden, geben Sie den Produkttyp an, z. B. eine Lampe |
--inpainting_model | Zeichenfolge | welches Modell für die Hintergrundgenerierung verwendet werden soll (Huggingface-ID) |
--img2img_model | Zeichenfolge | Welches Modell soll für den Rediffusionsschritt verwendet werden (Huggingface-ID)? |
--img2img_strength | schweben | Wie viel vom Originalbild wird bei der Rediffusion verrauscht? |
--inpainting_steps | int | Wie viele Diffusionsschritte müssen für das Inpainting durchgeführt werden? |
--inpainting_guidance | schweben | Wie viel klassifikatorfreie Anleitung soll beim Inpainting angewendet werden? |
--img2img_guidance | schweben | Wie viel klassifikatorfreie Anleitung soll bei der Rediffusion angewendet werden? |
--output_folder | Zeichenfolge | Pfad zum Ordner, in dem Ausgabebilder gespeichert werden sollen |
--colorize | ob das Bild vor dem Inpainting eingefärbt werden soll | |
--colorization_model | Zeichenfolge | Welches Modell soll für die Kolorierung verwendet werden (Huggingface-ID) |
--upscaling_model | Zeichenfolge | welches Modell für die Hochskalierung verwendet werden soll, notwendig für die Kolorierung (Huggingface-ID) |
--colorization_prompt | Zeichenfolge | Aufforderung zur Einfärbung, nicht erforderlich, da datasheet_path und Farbe bereitgestellt werden |
--colorization_negative_prompt | Zeichenfolge | Negative Aufforderung zur Kolorierung |
--do_not_fill_holes | Lochfüllung für Kolorierungsmaske umschalten, nur relevant beim Kolorieren | |
--Erweiterung | int | Wie weit die Maske für die Kolorierung erweitert werden soll, ist nur beim Kolorieren relevant |
--colorization_strength | schweben | Wie viel Diffusion muss für die Kolorierung angewendet werden? Dies ist nur beim Kolorieren relevant |
--colorization_prompt_guidance | schweben | Wie viel klassifikatorfreie Anleitung soll bei der Kolorierung angewendet werden, nur relevant bei der Kolorierung? |
--Skala | schweben | wie stark das Fahrrad verkleinert oder vergrößert werden soll. Höhere Werte führen dazu, dass das Fahrrad mehr Platz im Rahmen einnimmt. Der Standardwert ist 1. |
--fraction_down | schweben | relative y-Position des (Mitte des) Fahrrads, höhere Werte platzieren das Fahrrad näher am unteren Rand des Bildes, Standard ist 0,5 (zentriert) |
--fraction_right | schweben | relative x-Position des (Mitte des) Fahrrads, höhere Werte platzieren das Fahrrad näher am rechten Rand des Bildes, Standard ist 0,5 (zentriert) |
--ckpt_id | Zeichenfolge | ID des Kontrollpunkts, der für die Erstellung von Fahrradumrissen aus Punktwolken verwendet werden soll, nur im Punktmodus relevant |
--bike_mask_dilation | int | wie stark die aus den Punktwolken generierten Masken erweitert werden sollen, nur relevant im Punktmodus |
--do_not_fill_bike_holes | ob Lochfüllung auf Fahrradmasken angewendet werden soll, nur relevant im Punktmodus | |
--wheel_design | int | Welches Raddesign für die Generierung von Fahrradumrissen verwendet werden soll, derzeit sind nur 0 und 1 implementiert, nur relevant im Punktmodus |
Ein zusätzliches Skript interactive.py
bietet eine Implementierung zur interaktiven Generierung von Bildern im Human-in-the-Loop-Stil. Das bedeutet, dass bei jedem Schritt fünf Optionen parallel generiert werden und der Benutzer aufgefordert wird, die beste Option auszuwählen. Anschließend wird nur das ausgewählte Bild für den nächsten Schritt verwendet.
Das Skript akzeptiert keine zusätzlichen CLI-Argumente. Der Benutzer wird aufgefordert, alle Entscheidungen zu treffen.
Um im interaktiven Modus auszuführen, führen Sie Folgendes aus:
python interactive.py
Den verwendeten Evaluierungscode oder unser Paper finden Sie unter ./evaluation
. Beachten Sie, dass quantitative Metriken mit dem folgenden CLI-Befehl berechnet wurden:
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> "
Mithilfe des bereitgestellten Notebooks wurden Metriken zur menschlichen Bewertung und Inferenzstatistiken berechnet.
Wenn Sie unsere Arbeit hilfreich finden und sie für Ihre Forschung oder Ihr Projekt nutzen möchten, zitieren Sie den Artikel bitte wie folgt:
@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 } ,
}