Этот репозиторий содержит официальную реализацию статьи «InsertDiffusion: визуализация объектов с сохранением идентичности посредством диффузионной архитектуры без обучения».
Реализация поддерживает два разных режима работы:
Кроме того, реализация предлагает возможность раскрашивать уже существующие или сгенерированные изображения. Если не использовать уже цветные изображения, это значительно повышает реализм.
Кроме того, новую среду можно либо создать с нуля (режим замены фона), либо использовать и адаптировать уже существующее изображение.
Все функции доступны из CLI main.py
, а также могут быть интегрированы в ваши собственные проекты. Для использования CLI или кода требуется среда с фонариком, подушкой, пандами, трансформаторами и диффузорами.
Чтобы вставить изображение во вновь созданный фон, выполните:
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 ниже.
Вместо использования CLI вы можете интегрировать процедуру в свой код с помощью этой функции Python (снова убедитесь, что установлены все зависимости, и скопируйте модуль 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
Мы реализовали дополнительный метод для создания изображений велосипедистов из облаков точек и их последующей вставки в фон. Однако этот метод не работает должным образом и поэтому не является центральным в нашем исследовании . Генерация из облаков точек была реализована Иоанном-Даниэлем Крачуном и основана на DDPM/DDIM, реализованном и обученном Jiajae Fan .
Чтобы создавать изображения из облаков точек, удалите аргумент --image
из вызова CLI. В точечном режиме вам необходимо указать путь к таблице данных через --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
Примечание . Интерфейс командной строки все еще находится в стадии разработки и может быть изменен.
Примечание . Там, где это применимо, значения по умолчанию представляют собой параметры, определенные в наших экспериментах. Но разные значения могут быть оптимальными в зависимости от конкретного варианта использования.
аргумент | тип | описание |
---|---|---|
--изображение | нить | путь к изображению, с которого нужно начать, взаимоисключающий с --points |
--очки | когда используются точки, алгоритм запускается в режиме облака точек и сначала генерирует контур велосипеда из облака точек, что является взаимоисключающим с --image | |
--mask_threshold | интервал | для рисования порог, позволяющий отличить белый фон от цветного переднего плана |
--background_prompt | нить | запрос на создание фона |
--negative_prompt | нить | отрицательный запрос на создание фона |
--background_image | нить | строка с фоновым изображением, которое будет использоваться в качестве отправной точки, актуально только в том случае, если для параметра --composition Strength установлено значение меньше 1. |
--composition_strength | плавать | определяет, насколько нужно изменить фоновое изображение начальной точки, используется только параметр --background_image, диапазон 0-1 |
--auto_bike_prompt | если запросы набора будут автоматически созданы с использованием шаблона для велосипедов, необходимо установить --place, --datasheet_path и --bike_idx | |
--auto_car_prompt | если заданные запросы будут автоматически созданы с использованием шаблона для автомобилей, необходимо установить --place, --car_manufacturer и --car_type | |
--auto_product | если заданные запросы будут автоматически созданы с использованием шаблона для продуктов, необходимо установить --place и --product_type | |
--место | нить | описание места, куда должен быть вставлен объект, используется только в том случае, если используется один из шаблонов автоматических подсказок. |
--цвет | нить | если вы используете автоподсказку, какой цвет у велосипеда |
--datasheet_path | нить | если вы используете автоподсказку для велосипедов, укажите путь к таблице данных для поиска типа велосипеда. |
--bike_idx | интервал | если вы используете автоподсказку для велосипедов, укажите индекс в таблице данных для поиска типа велосипеда. |
--car_manufacturer | нить | при использовании автоподсказки для автомобилей укажите производителя автомобиля, например BMW. |
--car_type | нить | если вы используете автоподсказку для автомобилей, укажите тип автомобиля, например внедорожник или X5. |
--product_type | нить | при использовании автоподсказки для продуктов укажите тип продукта, например, лампа. |
--inpainting_model | нить | какую модель использовать для генерации фона (идентификатор HuggingFace) |
--img2img_model | нить | какую модель использовать для этапа редиффузии (идентификатор HuggingFace) |
--img2img_strength | плавать | какая часть исходного изображения будет зашумлена при редиффузии |
--inpainting_steps | интервал | сколько шагов диффузии необходимо выполнить для рисования |
--inpainting_guidance | плавать | сколько руководств без классификаторов следует применять при рисовании |
--img2img_guidance | плавать | сколько руководств без классификаторов следует применять при редиффузии |
--output_folder | нить | путь к папке, в которой должны быть сохранены выходные изображения |
--раскрасить | раскрашивать ли изображение перед рисованием | |
--colorization_model | нить | какую модель использовать для раскраски (идентификатор HuggingFace) |
--upscaling_model | нить | какую модель использовать для апскейлинга, необходимо для колоризации (huggingface id) |
--colorization_prompt | нить | запрос на раскрашивание, необязательно, если указаны datasheet_path и цвет |
--colorization_negative_prompt | нить | негативная подсказка для раскрашивания |
--do_not_fill_holes | переключить заполнение отверстий для раскрашивающей маски, актуально только при раскрашивании | |
--расширение | интервал | насколько удлинить маску для раскрашивания, актуально только при раскрашивании |
--colorization_strength | плавать | сколько диффузии применять для раскрашивания, актуально только при раскрашивании |
--colorization_prompt_guidance | плавать | сколько рекомендаций без классификатора следует применять во время раскрашивания, актуально только при раскрашивании |
--шкала | плавать | насколько уменьшить или увеличить размер велосипеда; более высокие значения приводят к тому, что велосипед занимает больше места в раме, по умолчанию — 1. |
--fraction_down | плавать | относительное положение (центра) велосипеда по оси Y, более высокие значения помещают велосипед ближе к нижнему краю изображения, по умолчанию — 0,5 (по центру) |
--fraction_right | плавать | относительное положение x (центра) велосипеда, более высокие значения помещают велосипед ближе к правому краю изображения, по умолчанию — 0,5 (по центру) |
--ckpt_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 } ,
}