Este repositorio contiene la implementación oficial del artículo "InsertDiffusion: Visualización de objetos que preserva la identidad a través de una arquitectura de difusión sin capacitación".
La implementación admite dos modos de ejecución diferentes:
Además, la implementación ofrece la opción de colorear las imágenes preexistentes o generadas. Cuando no se utilizan imágenes ya coloreadas, esto mejora drásticamente el realismo.
Además, se puede crear un nuevo entorno desde cero (modo de sustitución de fondo) o se puede utilizar y adaptar una imagen preexistente.
Todas las funciones están disponibles en la CLI main.py
y también se pueden integrar en sus propios proyectos. Para utilizar la CLI o el código se requiere un entorno con antorcha, almohada, pandas, transformadores y difusores.
Para insertar una imagen en un fondo recién creado, ejecute:
python main.py --image " <path to your image> " --background_prompt " <your prompt> "
Así por ejemplo:
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 "
En lugar de proporcionar un mensaje directamente, puede utilizar las funciones de mensaje automático proporcionando la información necesaria. Para bicicletas, debes proporcionar la ubicación deseada, el índice de la bicicleta y una ruta a la hoja de datos. Para los automóviles, deberá proporcionar la nueva ubicación deseada, el fabricante del automóvil y el tipo de automóvil. Para productos solo se requiere la nueva ubicación y un tipo de producto.
Para obtener más opciones e inserción en un fondo determinado, consulte la documentación CLI completa a continuación.
En lugar de usar la CLI, puede integrar el procedimiento en su código con esta función de Python (nuevamente asegúrese de tener todas las dependencias instaladas y copie el módulo de utilidades en su proyecto):
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
Implementamos un método adicional para generar imágenes en bicicleta a partir de nubes de puntos y luego insertarlas en un fondo. Sin embargo, este método no funciona bien y, por lo tanto, no es fundamental para nuestra investigación . La generación a partir de nubes de puntos fue implementada por Ioan-Daniel Craciun y se basa en un DDPM/DDIM implementado y entrenado por Jiajae Fan .
Para crear imágenes a partir de nubes de puntos, elimine el argumento --image
de su llamada CLI. En modo puntual, debe proporcionar una ruta de hoja de datos a través de --datasheet_path
. Por lo tanto, el comando CLI mínimo se convierte en:
python main.py --point --datasheet_path " <path to datasheet> " --background_prompt " <your prompt> "
También puede utilizar las indicaciones automáticas en modo puntual.
Para integrar la generación de bicicletas a partir de nubes de puntos en tu proyecto copia la carpeta utils y usa la siguiente función:
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' )
La imagen devuelta por esta función está lista para usarse para colorear o insertar.
Si está utilizando una imagen sin color, agregue --colorize
a una de las llamadas CLI anteriores. Además, debe proporcionar un mensaje de colorización a través de --colorization_prompt
o utilizar el mensaje automático proporcionando un color a través de --color
.
Un ejemplo de llamada CLI podría ser:
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 "
Alternativamente, para integrar la coloración en su proyecto, copie el módulo de utilidades y use:
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
Nota : CLI aún está en construcción y podría estar sujeta a cambios.
Nota : Cuando corresponda, los valores predeterminados representan los parámetros determinados en nuestros experimentos. Pero diferentes valores pueden ser óptimos según el caso de uso específico.
argumento | tipo | descripción |
---|---|---|
--imagen | cadena | ruta a una imagen para comenzar, mutuamente excluyente con --points |
--agujas | cuando se utilizan puntos, el algoritmo se ejecuta en modo de nube de puntos y genera primero un contorno de bicicleta a partir de una nube de puntos, mutuamente excluyente con --image | |
--mask_threshold | entero | para pintar, umbral para distinguir el fondo blanco del primer plano coloreado |
--fondo_prompt | cadena | el mensaje para la generación de fondo |
--prompt_negativo | cadena | mensaje negativo para la generación de fondo |
--imagen_de_fondo | cadena | cadena a una imagen de fondo que se usará como punto de partida, solo es relevante si la intensidad de la composición se establece en un valor menor que 1 |
--composition_strength | flotar | determina cuánto cambiar la imagen de fondo del punto de partida, solo se usa --background_image está configurado, rango 0-1 |
--auto_bike_prompt | Si las indicaciones establecidas se crearán automáticamente utilizando la plantilla para bicicletas, es necesario configurar --place, --datasheet_path y --bike_idx. | |
--auto_car_prompt | Si las indicaciones establecidas se crearán automáticamente utilizando la plantilla para automóviles, es necesario configurar --place, --car_manufacturer y --car_type | |
--auto_producto | Si las indicaciones establecidas se crearán automáticamente utilizando la plantilla para productos, es necesario configurar --place y --product_type | |
--lugar | cadena | descripción de la ubicación donde se insertará el objeto, solo se usa si se usa una de las plantillas de solicitud automática |
--color | cadena | Si se utiliza la indicación automática, ¿qué color tiene la bicicleta? |
--ruta_hoja_datos | cadena | si utiliza la indicación automática para bicicletas, ruta a la hoja de datos para buscar el tipo de bicicleta |
--bicicleta_idx | entero | si utiliza la indicación automática para bicicletas, indexe en la hoja de datos para buscar el tipo de bicicleta |
--car_manufacturer | cadena | Si se utiliza la indicación automática para automóviles, fabricante del automóvil, por ejemplo, BMW. |
--tipo_coche | cadena | Si utiliza la indicación automática para automóviles, tipo de automóvil, por ejemplo, SUV o X5. |
--tipo_producto | cadena | Si utiliza la indicación automática para productos, tipo de producto, por ejemplo, lámpara. |
--inpainting_modelo | cadena | qué modelo usar para la generación de fondo (huggingface id) |
--img2img_modelo | cadena | qué modelo usar para el paso de redifusión (identificación de Huggingface) |
--img2img_strength | flotar | ¿Cuánto ruido hay de la imagen original en la redifusión? |
--pasos_de_pintura | entero | ¿Cuántos pasos de difusión realizar para pintar? |
--inpainting_guidance | flotar | ¿Cuánta guía sin clasificador aplicar en la pintura? |
--img2img_guidance | flotar | ¿Cuánta guía sin clasificador aplicar en la redifusión? |
--carpeta_salida | cadena | ruta a la carpeta en la que se deben guardar las imágenes de salida |
--colorear | si colorear la imagen antes de pintarla | |
--colorización_modelo | cadena | qué modelo usar para colorear (huggingface id) |
--upscaling_model | cadena | qué modelo usar para la ampliación, necesario para la coloración (huggingface id) |
--colorización_prompt | cadena | Solicite coloración, no es necesario que se proporcione datasheet_path y color. |
--colorización_negativa_prompt | cadena | solicitud negativa de coloración |
--do_not_fill_holes | alternar relleno de orificios para máscara de coloración, solo relevante al colorear | |
--dilatación | entero | cuánto extender la máscara para colorear, solo es relevante al colorear |
--colorización_fuerza | flotar | cuánta difusión aplicar para colorear, solo es relevante al colorear |
--colorization_prompt_guidance | flotar | cuánta guía sin clasificador aplicar durante la coloración, solo es relevante al colorear |
--escala | flotar | cuánto reducir o mejorar la bicicleta, los valores más altos dan como resultado que la bicicleta ocupe más espacio en el cuadro; el valor predeterminado es 1. |
--fracción_abajo | flotar | Posición relativa y de la bicicleta (centro de la), los valores más altos colocan la bicicleta más cerca del borde inferior de la imagen, el valor predeterminado es 0,5 (centrado) |
--fracción_derecha | flotar | Posición relativa x de la bicicleta (centro de la), los valores más altos colocan la bicicleta más cerca del borde derecho de la imagen, el valor predeterminado es 0,5 (centrado) |
--ckpt_id | cadena | ID del punto de control que se utilizará para la creación de contornos de bicicletas a partir de nubes de puntos, solo relevante en el modo de puntos |
--bike_mask_dilatación | entero | cuánto extender las máscaras generadas a partir de las nubes de puntos, solo relevante en el modo de puntos |
--do_not_fill_bike_holes | si se debe aplicar relleno de agujeros a las máscaras de bicicleta, solo relevante en el modo puntual | |
--diseño_rueda | entero | qué diseño de rueda usar para la generación de contornos de bicicletas, actualmente solo se implementan 0 y 1, solo relevantes en el modo de puntos |
Un script adicional interactive.py
proporciona una implementación para generar imágenes interactivamente al estilo Human-in-the-Loop. Esto significa que en cada paso se generan cinco opciones en paralelo y se le pide al usuario que elija la mejor opción. Luego, solo se utiliza la imagen elegida para el siguiente paso.
El script no acepta argumentos CLI adicionales; se le pedirá al usuario que tome todas las decisiones.
Para ejecutar en modo interactivo ejecute:
python interactive.py
El código de evaluación utilizado o nuestro artículo se puede encontrar en ./evaluation
. Tenga en cuenta que las métricas cuantitativas se calcularon mediante el siguiente comando 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> "
Las métricas de evaluación humana y las estadísticas inferenciales se calcularon utilizando el cuaderno proporcionado.
Si encuentra útil nuestro trabajo y desea utilizarlo para su investigación o proyecto, cite el artículo de la siguiente manera:
@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 } ,
}