Diffusers documentation
Shap-E
Shap-E
El modelo Shap-E fue propuesto en Shap-E: Generating Conditional 3D Implicit Functions por Alex Nichol y Heewoo Jun de OpenAI.
El resumen del artículo es:
Presentamos Shap-E, un modelo generativo condicional para activos 3D. A diferencia del trabajo reciente en modelos generativos 3D, que produce una única representación de salida, Shap-E genera directamente los parámetros de funciones implícitas que pueden renderizarse tanto como mallas texturizadas como campos de radiancia neuronal. Entrenamos Shap-E en dos etapas: primero, entrenamos un codificador que mapea de forma determinista los activos 3D a los parámetros de una función implícita; segundo, entrenamos un modelo de difusión condicional sobre las salidas del codificador. Cuando se entrena en un gran conjunto de datos de pares de datos 3D y texto, nuestros modelos resultantes son capaces de generar activos 3D complejos y diversos en cuestión de segundos. En comparación con Point-E, un modelo generativo explícito sobre nubes de puntos, Shap-E converge más rápido y alcanza una calidad de muestra comparable o superior, a pesar de modelar un espacio de salida de mayor dimensión y con múltiples representaciones.
El código original se puede encontrar en openai/shap-e.
Consulte la sección reutilizar componentes entre pipelines para aprender a cargar eficientemente los mismos componentes en varios pipelines.
Asegúrate de tener instaladas las siguientes bibliotecas.
# uncomment to install the necessary libraries in Colab
#!pip install -q diffusers transformers accelerate trimeshTexto a 3D
Para generar un gif de un objeto 3D, pase un prompt de texto al ShapEPipeline. El pipeline genera una lista de fotogramas de imagen que se utilizan para crear el objeto 3D.
import torch
from diffusers import ShapEPipeline
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
pipe = ShapEPipeline.from_pretrained("openai/shap-e", dtype=torch.float16, variant="fp16")
pipe = pipe.to(device)
guidance_scale = 15.0
prompt = ["A firecracker", "A birthday cupcake"]
images = pipe(
prompt,
guidance_scale=guidance_scale,
num_inference_steps=64,
frame_size=256,
).imagesAhora usa la función export_to_gif() para convertir la lista de fotogramas de imagen en un gif del objeto 3D.
from diffusers.utils import export_to_gif
export_to_gif(images[0], "firecracker_3d.gif")
export_to_gif(images[1], "cake_3d.gif")
Imagen a 3D
Para generar un objeto 3D a partir de otra imagen, use ShapEImg2ImgPipeline. Puede usar una imagen existente o generar una completamente nueva. Vamos a usar el modelo Kandinsky 2.1 para generar una nueva imagen.
from diffusers import DiffusionPipeline
import torch
prior_pipeline = DiffusionPipeline.from_pretrained("kandinsky-community/kandinsky-2-1-prior", dtype=torch.float16, use_safetensors=True).to("cuda") # or "mps", "xpu", "cpu"
pipeline = DiffusionPipeline.from_pretrained("kandinsky-community/kandinsky-2-1", dtype=torch.float16, use_safetensors=True).to("cuda")
prompt = "A cheeseburger, white background"
image_embeds, negative_image_embeds = prior_pipeline(prompt, guidance_scale=1.0).to_tuple()
image = pipeline(
prompt,
image_embeds=image_embeds,
negative_image_embeds=negative_image_embeds,
).images[0]
image.save("burger.png")Pasa la hamburguesa al ShapEImg2ImgPipeline para generar una representación 3D de la misma.
from PIL import Image
from diffusers import ShapEImg2ImgPipeline
from diffusers.utils import export_to_gif
pipe = ShapEImg2ImgPipeline.from_pretrained("openai/shap-e-img2img", dtype=torch.float16, variant="fp16").to("cuda") # or "mps", "xpu", "cpu"
guidance_scale = 3.0
image = Image.open("burger.png").resize((256, 256))
images = pipe(
image,
guidance_scale=guidance_scale,
num_inference_steps=64,
frame_size=256,
).images
gif_path = export_to_gif(images[0], "burger_3d.gif")
Generar malla
Shap-E es un modelo flexible que también puede generar mallas con texturas para ser renderizadas en aplicaciones posteriores. En este ejemplo, se convierte la salida en un archivo glb porque la biblioteca 🤗 Datasets admite la visualización de mallas de archivos glb, que pueden ser renderizados por el visor de Dataset.
Puede generar salidas de malla tanto para ShapEPipeline como para ShapEImg2ImgPipeline especificando el parámetro output_type como "mesh":
import torch
from diffusers import ShapEPipeline
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
pipe = ShapEPipeline.from_pretrained("openai/shap-e", dtype=torch.float16, variant="fp16")
pipe = pipe.to(device)
guidance_scale = 15.0
prompt = "A birthday cupcake"
images = pipe(prompt, guidance_scale=guidance_scale, num_inference_steps=64, frame_size=256, output_type="mesh").imagesUse la función export_to_ply() para guardar la malla de salida como un archivo ply:
Puedes guardar opcionalmente la salida de la malla como un archivo
objcon la funciónexport_to_obj(). La posibilidad de guardar la salida de la malla en una variedad de formatos la hace más flexible para su uso posterior.
from diffusers.utils import export_to_ply
ply_path = export_to_ply(images[0], "3d_cake.ply")
print(f"Saved to folder: {ply_path}")Luego, puedes convertir el archivo ply en un archivo glb con la biblioteca trimesh:
import trimesh
mesh = trimesh.load("3d_cake.ply")
mesh_export = mesh.export("3d_cake.glb", file_type="glb")Por defecto, la salida de la malla se enfoca desde el punto de vista inferior, pero puedes cambiar el punto de vista predeterminado aplicando una transformación de rotación:
import trimesh
import numpy as np
mesh = trimesh.load("3d_cake.ply")
rot = trimesh.transformations.rotation_matrix(-np.pi / 2, [1, 0, 0])
mesh = mesh.apply_transform(rot)
mesh_export = mesh.export("3d_cake.glb", file_type="glb")Sube el archivo de malla a tu repositorio de datos para visualizarlo con el visor de datos (Dataset viewer)!

ShapEPipeline
clase diffusers.ShapEPipeline
< source >( prior: PriorTransformertext_encoder: CLIPTextModelWithProjectiontokenizer: CLIPTokenizerscheduler: HeunDiscreteSchedulershap_e_renderer: ShapERenderer )
Parámetros
- prior (PriorTransformer) — El prior unCLIP canónico para aproximar el embedding de imagen a partir del embedding de texto.
- text_encoder (CLIPTextModelWithProjection) — Codificador de texto congelado.
- tokenizer (CLIPTokenizer) —
Un
CLIPTokenizerpara tokenizar texto. - scheduler (HeunDiscreteScheduler) —
Un scheduler para usar en combinación con el modelo
priorpara generar el embedding de la imagen. - shap_e_renderer (
ShapERenderer) — El renderizador de Shap-E proyecta los latentes generados en los parámetros de un MLP para crear objetos 3D con el método de renderizado NeRF.
Pipeline para generar la representación latente de un activo 3D y renderizarlo con el método NeRF.
Este modelo hereda de DiffusionPipeline. Consulta la documentación de la clase superior para los métodos genéricos implementados en todas las tuberías (descarga, guardado, ejecución en un dispositivo específico, etc.).
__call__
< source >( prompt: strnum_images_per_prompt: int = 1num_inference_steps: int = 25generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneguidance_scale: float = 4.0frame_size: int = 64output_type: str | None = 'pil'return_dict: bool = True ) → ShapEPipelineOutput or tuple
Parámetros
- prompt (
strolist[str]) — El prompt o los prompts para guiar la generación de la imagen. - num_images_per_prompt (
int, opcional, valor predeterminado 1) — El número de imágenes que se generarán por indicación. - num_inference_steps (
int, opcional, valor predeterminado 25) — El número de pasos de desruido. Más pasos de desruido suelen conducir a una imagen de mayor calidad a costa de una inferencia más lenta. - generator (
torch.Generatorolist[torch.Generator], opcional) — Untorch.Generatorpara hacer que la generación sea determinista. - latents (
torch.Tensor, opcional) — Latentes ruidosos pregenerados muestreados de una distribución gaussiana, que se utilizarán como entradas para la generación de imágenes. Se pueden usar para ajustar la misma generación con diferentes prompts. Si no se proporciona, se genera un tensor de latentes mediante muestreo usando elgeneratoraleatorio suministrado. - guidance_scale (
float, opcional, valor predeterminado 4.0) — Un valor de escala de guía más alto anima al modelo a generar imágenes estrechamente vinculadas alpromptde texto a costa de una menor calidad de imagen. La escala de guía se habilita cuandoguidance_scale > 1. - frame_size (
int, opcional, valor predeterminado 64) — El ancho y la altura de cada cuadro de imagen de la salida 3D generada. - output_type (
str, opcional, valor predeterminado"pil") — El formato de salida de la imagen generada. Elija entre"pil"(PIL.Image.Image),"np"(np.array),"latent"(torch.Tensor) o malla (MeshDecoderOutput). - return_dict (
bool, opcional, valor predeterminadoTrue) — Indica si se debe devolver un ShapEPipelineOutput en lugar de una tupla simple.
Devuelve
ShapEPipelineOutput o tuple
Si return_dict es True, se devuelve ShapEPipelineOutput,
en caso contrario se devuelve una tuple cuyo primer elemento es una lista con las imágenes generadas.
La función de llamada para el pipeline de generación.
Ejemplos:
>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from diffusers.utils import export_to_gif
>>> device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
>>> repo = "openai/shap-e"
>>> pipe = DiffusionPipeline.from_pretrained(repo, torch_dtype=torch.float16)
>>> pipe = pipe.to(device)
>>> guidance_scale = 15.0
>>> prompt = "a shark"
>>> images = pipe(
... prompt,
... guidance_scale=guidance_scale,
... num_inference_steps=64,
... frame_size=256,
... ).images
>>> gif_path = export_to_gif(images[0], "shark_3d.gif")ShapEImg2ImgPipeline
clase diffusers.ShapEImg2ImgPipeline
< source >( prior: PriorTransformerimage_encoder: CLIPVisionModelimage_processor: CLIPImageProcessorPilscheduler: HeunDiscreteSchedulershap_e_renderer: ShapERenderer )
Parámetros
- prior (PriorTransformer) — El prior unCLIP canónico para aproximar el embedding de imagen a partir del embedding de texto.
- image_encoder (CLIPVisionModel) — Codificador de imágenes congelado.
- image_processor (CLIPImageProcessor) —
Un
CLIPImageProcessorpara procesar imágenes. - scheduler (HeunDiscreteScheduler) —
Un scheduler para usar en combinación con el modelo
priorpara generar el embedding de la imagen. - shap_e_renderer (
ShapERenderer) — El renderizador de Shap-E proyecta los latentes generados en los parámetros de un MLP para crear objetos 3D con el método de renderizado NeRF.
Pipeline para generar la representación latente de un activo 3D y renderizarlo con el método NeRF a partir de una imagen.
Este modelo hereda de DiffusionPipeline. Consulta la documentación de la clase superior para los métodos genéricos implementados en todas las tuberías (descarga, guardado, ejecución en un dispositivo específico, etc.).
__call__
< source >( image: PIL.Image.Image | list[PIL.Image.Image]num_images_per_prompt: int = 1num_inference_steps: int = 25generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneguidance_scale: float = 4.0frame_size: int = 64output_type: str | None = 'pil'return_dict: bool = True ) → ShapEPipelineOutput or tuple
Parámetros
- image (
torch.Tensor,PIL.Image.Image,np.ndarray,list[torch.Tensor],list[PIL.Image.Image]olist[np.ndarray]) —Imageo tensor que representa un lote de imágenes para usarse como punto de partida. También puede aceptar latentes de imagen como image, pero si se pasan latentes directamente, no se vuelven a codificar. - num_images_per_prompt (
int, opcional, valor predeterminado 1) — El número de imágenes que se generarán por indicación. - num_inference_steps (
int, opcional, valor predeterminado 25) — El número de pasos de desruido. Más pasos de desruido suelen conducir a una imagen de mayor calidad a costa de una inferencia más lenta. - generator (
torch.Generatorolist[torch.Generator], opcional) — Untorch.Generatorpara hacer que la generación sea determinista. - latents (
torch.Tensor, opcional) — Latentes ruidosos pregenerados muestreados de una distribución gaussiana, que se utilizarán como entradas para la generación de imágenes. Se pueden usar para ajustar la misma generación con diferentes prompts. Si no se proporciona, se genera un tensor de latentes mediante muestreo usando elgeneratoraleatorio suministrado. - guidance_scale (
float, opcional, valor predeterminado 4.0) — Un valor de escala de guía más alto anima al modelo a generar imágenes estrechamente vinculadas alpromptde texto a costa de una menor calidad de imagen. La escala de guía se habilita cuandoguidance_scale > 1. - frame_size (
int, opcional, valor predeterminado 64) — El ancho y la altura de cada cuadro de imagen de la salida 3D generada. - output_type (
str, opcional, valor predeterminado"pil") — El formato de salida de la imagen generada. Elija entre"pil"(PIL.Image.Image),"np"(np.array),"latent"(torch.Tensor) o malla (MeshDecoderOutput). - return_dict (
bool, opcional, valor predeterminadoTrue) — Indica si se debe devolver un ShapEPipelineOutput en lugar de una tupla simple.
Devuelve
ShapEPipelineOutput o tuple
Si return_dict es True, se devuelve ShapEPipelineOutput,
en caso contrario se devuelve una tuple cuyo primer elemento es una lista con las imágenes generadas.
La función de llamada para el pipeline de generación.
Ejemplos:
>>> from PIL import Image
>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from diffusers.utils import export_to_gif, load_image
>>> device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
>>> repo = "openai/shap-e-img2img"
>>> pipe = DiffusionPipeline.from_pretrained(repo, torch_dtype=torch.float16)
>>> pipe = pipe.to(device)
>>> guidance_scale = 3.0
>>> image_url = "https://hf.co/datasets/diffusers/docs-images/resolve/main/shap-e/corgi.png"
>>> image = load_image(image_url).convert("RGB")
>>> images = pipe(
... image,
... guidance_scale=guidance_scale,
... num_inference_steps=64,
... frame_size=256,
... ).images
>>> gif_path = export_to_gif(images[0], "corgi_3d.gif")ShapEPipelineOutput
clase diffusers.pipelines.shap_e.pipeline_shap_e.ShapEPipelineOutput
< source >( images: list[list[PIL.Image.Image]] | list[list[numpy.ndarray]] )
Clase de salida para ShapEPipeline y ShapEImg2ImgPipeline.