Diffusers documentation

Văn bản sang hình ảnh

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Văn bản sang hình ảnh

Khi bạn nghĩ đến các mô hình khuếch tán, text-to-image thường là một trong những điều đầu tiên xuất hiện trong tâm trí. Text-to-image tạo ra một hình ảnh từ mô tả bằng văn bản (ví dụ: “Astronaut in a jungle, cold color palette, muted colors, detailed, 8k”), còn được gọi là prompt.

Ở cấp độ tổng quan, một mô hình khuếch tán nhận một prompt cùng một nhiễu ban đầu ngẫu nhiên, sau đó lặp lại quá trình loại bỏ nhiễu để xây dựng hình ảnh. Quá trình loại bỏ nhiễu được điều hướng bởi prompt, và khi quá trình loại bỏ nhiễu kết thúc sau một số bước thời gian đã định trước, biểu diễn hình ảnh sẽ được giải mã thành hình ảnh.

Đọc bài đăng trên blog Stable Diffusion hoạt động như thế nào? để tìm hiểu thêm về cách một mô hình khuếch tán tiềm ẩn hoạt động.

Bạn có thể tạo hình ảnh từ một prompt trong 🤗 Diffusers theo hai bước:

  1. Tải checkpoint vào lớp AutoPipelineForText2Image, lớp này sẽ tự động phát hiện lớp pipeline phù hợp để sử dụng dựa trên checkpoint:
from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
  1. Truyền một prompt vào pipeline để tạo ảnh:
image = pipeline(
	"stained glass of darth vader, backlight, centered composition, masterpiece, photorealistic, 8k"
).images[0]
image

Các mô hình phổ biến

Các mô hình text-to-image phổ biến nhất là Stable Diffusion v1.5, Stable Diffusion XL (SDXL) và Kandinsky 2.2. Ngoài ra còn có các mô hình hoặc adapter ControlNet có thể dùng cùng với mô hình text-to-image để kiểm soát trực tiếp hơn trong quá trình tạo ảnh. Kết quả từ mỗi mô hình sẽ hơi khác nhau do kiến trúc và quy trình huấn luyện, nhưng bất kể bạn chọn mô hình nào, cách sử dụng chúng cũng gần như giống nhau. Hãy dùng cùng một prompt cho từng mô hình và so sánh kết quả của chúng.

Stable Diffusion v1.5

Stable Diffusion v1.5 là một mô hình khuếch tán tiềm ẩn được khởi tạo từ Stable Diffusion v1-4, và được tinh chỉnh trong 595K bước trên các ảnh 512x512 từ bộ dữ liệu LAION-Aesthetics V2. Bạn có thể sử dụng mô hình này như sau:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image

Stable Diffusion XL

SDXL là phiên bản lớn hơn nhiều so với các mô hình Stable Diffusion trước đó, và bao gồm quy trình mô hình hai giai đoạn, bổ sung thêm nhiều chi tiết hơn cho hình ảnh. Nó cũng bao gồm một số micro-conditionings bổ sung để tạo ra các hình ảnh chất lượng cao với chủ thể được đặt ở vị trí trung tâm. Hãy xem hướng dẫn SDXL chi tiết hơn để tìm hiểu cách sử dụng nó. Nhìn chung, bạn có thể sử dụng SDXL như sau:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image

Kandinsky 2.2

Mô hình Kandinsky hơi khác so với các mô hình Stable Diffusion vì nó cũng sử dụng một mô hình tiên nghiệm hình ảnh để tạo ra các embedding, được dùng để căn chỉnh tốt hơn giữa văn bản và hình ảnh trong mô hình khuếch tán.

Cách dễ nhất để sử dụng Kandinsky 2.2 là:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"kandinsky-community/kandinsky-2-2-decoder", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image

ControlNet

Các mô hình ControlNet là các mô hình phụ trợ hoặc bộ thích ứng được tinh chỉnh trên các mô hình từ văn bản sang hình ảnh, chẳng hạn như Stable Diffusion v1.5. Việc sử dụng các mô hình ControlNet kết hợp với các mô hình từ văn bản sang hình ảnh mang lại nhiều lựa chọn để kiểm soát rõ ràng hơn cách tạo hình ảnh. Với ControlNet, bạn thêm một hình ảnh đầu vào điều kiện bổ sung cho mô hình. Ví dụ, nếu bạn cung cấp một hình ảnh tư thế con người (thường được biểu diễn dưới dạng nhiều điểm chính được kết nối thành một bộ xương) làm đầu vào điều kiện, mô hình sẽ tạo ra một hình ảnh tuân theo tư thế của hình ảnh đó. Xem hướng dẫn chi tiết hơn về ControlNet để tìm hiểu thêm về các đầu vào điều kiện khác và cách sử dụng chúng.

Trong ví dụ này, hãy điều kiện hóa ControlNet bằng một hình ảnh ước lượng tư thế con người. Tải mô hình ControlNet được huấn luyện trước trên các ước lượng tư thế con người:

from diffusers import ControlNetModel, AutoPipelineForText2Image
from diffusers.utils import load_image
import torch

controlnet = ControlNetModel.from_pretrained(
	"lllyasviel/control_v11p_sd15_openpose", dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
pose_image = load_image("https://huggingface.co/lllyasviel/control_v11p_sd15_openpose/resolve/main/images/control.png")

Truyền controlnet vào AutoPipelineForText2Image, và cung cấp prompt cùng hình ảnh ước lượng tư thế:

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", controlnet=controlnet, dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", image=pose_image, generator=generator).images[0]
image
Stable Diffusion v1.5
Stable Diffusion XL
Kandinsky 2.2
ControlNet (điều kiện tư thế)

Cấu hình tham số pipeline

Có một số tham số có thể được cấu hình trong pipeline, ảnh hưởng đến cách hình ảnh được tạo ra. Bạn có thể thay đổi kích thước đầu ra của hình ảnh, chỉ định một prompt tiêu cực để cải thiện chất lượng hình ảnh, và nhiều hơn nữa. Phần này đi sâu vào cách sử dụng các tham số này.

Chiều cao và chiều rộng

Các tham số height và width kiểm soát chiều cao và chiều rộng (tính bằng pixel) của hình ảnh được tạo ra. Mặc định, mô hình Stable Diffusion v1.5 xuất ra hình ảnh 512x512, nhưng bạn có thể thay đổi thành bất kỳ kích thước nào là bội số của 8. Ví dụ, để tạo một hình ảnh chữ nhật:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
image = pipeline(
	"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", height=768, width=512
).images[0]
image

Các mô hình khác có thể có kích thước ảnh mặc định khác nhau tùy thuộc vào kích thước ảnh trong tập dữ liệu huấn luyện. Ví dụ, kích thước ảnh mặc định của SDXL là 1024x1024 và việc sử dụng các giá trị height và width thấp hơn có thể dẫn đến ảnh có chất lượng thấp hơn. Hãy chắc chắn rằng bạn kiểm tra tài liệu tham khảo API của mô hình trước!

Thang độ dẫn

Tham số guidance_scale ảnh hưởng đến mức độ mà prompt tác động lên quá trình tạo ảnh. Giá trị thấp hơn cho phép mô hình có “sự sáng tạo” để tạo ra các hình ảnh liên quan lỏng lẻo hơn đến prompt. Các giá trị guidance_scale cao hơn thúc đẩy mô hình bám sát prompt hơn, và nếu giá trị này quá cao, bạn có thể quan sát thấy một số lỗi (artifacts) trong hình ảnh được tạo ra.

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
image = pipeline(
	"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", guidance_scale=3.5
).images[0]
image
guidance_scale = 2.5
guidance_scale = 7.5
guidance_scale = 10.5

Negative prompt

Tương tự như cách một prompt định hướng quá trình tạo ra, một negative prompt sẽ điều hướng mô hình tránh xa những thứ bạn không muốn mô hình tạo ra. Điều này thường được sử dụng để cải thiện chất lượng hình ảnh tổng thể bằng cách loại bỏ các đặc điểm kém hoặc xấu của hình ảnh như “low resolution” hoặc “bad details”. Bạn cũng có thể sử dụng negative prompt để loại bỏ hoặc thay đổi nội dung và phong cách của một hình ảnh.

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
image = pipeline(
	prompt="Astronaut in a jungle, cold color palette, muted colors, detailed, 8k",
	negative_prompt="ugly, deformed, disfigured, poor details, bad anatomy",
).images[0]
image
negative_prompt = "xấu, biến dạng, méo mó, chi tiết kém, giải phẫu sai"
negative_prompt = "astronaut"

Generator

Một đối tượng torch.Generator cho phép tái lập kết quả trong một pipeline bằng cách đặt seed thủ công. Bạn có thể sử dụng Generator để tạo các lô ảnh và cải tiến dần một ảnh được tạo từ seed, như được mô tả chi tiết trong hướng dẫn Cải thiện chất lượng ảnh với tạo sinh tất định.

Bạn có thể đặt seed và Generator như minh họa bên dưới. Việc tạo ảnh bằng Generator sẽ trả về cùng một kết quả mỗi lần thay vì ngẫu nhiên tạo ra một ảnh mới.

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
generator = torch.Generator(device="cuda").manual_seed(30)
image = pipeline(
	"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k",
	generator=generator,
).images[0]
image

Kiểm soát tạo ảnh

Có một số cách để kiểm soát chặt chẽ hơn cách một hình ảnh được tạo ra, ngoài việc cấu hình các tham số của pipeline, chẳng hạn như trọng số prompt và các mô hình ControlNet.

Trọng số prompt

Trọng số hóa prompt là kỹ thuật để tăng hoặc giảm mức độ quan trọng của các khái niệm trong prompt nhằm nhấn mạnh hoặc làm giảm một số đặc điểm nhất định trong hình ảnh. Chúng tôi khuyên bạn nên sử dụng thư viện Compel để hỗ trợ tạo các embedding prompt có trọng số.

Tìm hiểu cách tạo prompt embeddings trong hướng dẫn Prompt weighting. Ví dụ này tập trung vào cách sử dụng prompt embeddings trong pipeline.

Sau khi tạo xong các embeddings, bạn có thể truyền chúng vào tham số prompt_embeds (và negative_prompt_embeds nếu bạn đang dùng negative prompt) trong pipeline.

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
image = pipeline(
	prompt_embeds=prompt_embeds, # generated from Compel
	negative_prompt_embeds=negative_prompt_embeds, # generated from Compel
).images[0]

ControlNet

Như bạn đã thấy trong phần ControlNet, các mô hình này cung cấp một cách linh hoạt và chính xác hơn để tạo hình ảnh bằng cách tích hợp thêm một đầu vào ảnh điều kiện. Mỗi mô hình ControlNet được tiền huấn luyện trên một loại ảnh điều kiện cụ thể để tạo ra các hình ảnh mới có sự tương đồng với nó. Ví dụ, nếu bạn sử dụng một mô hình ControlNet được tiền huấn luyện trên các bản đồ độ sâu, bạn có thể cung cấp cho mô hình một bản đồ độ sâu làm đầu vào điều kiện và nó sẽ tạo ra một hình ảnh giữ nguyên thông tin không gian trong đó. Cách này nhanh chóng và dễ dàng hơn so với việc chỉ định thông tin độ sâu trong một prompt. Bạn thậm chí có thể kết hợp nhiều đầu vào điều kiện với Multi-ControlNet!

Có nhiều loại đầu vào điều kiện bạn có thể sử dụng, và 🤗 Diffusers hỗ trợ ControlNet cho các mô hình Stable Diffusion và SDXL. Hãy xem hướng dẫn ControlNet chi tiết hơn để tìm hiểu cách sử dụng các mô hình này.

Tối ưu

Mô hình khuếch tán có kích thước lớn, và bản chất lặp lại của quá trình khử nhiễu ảnh đòi hỏi chi phí tính toán cao và tiêu tốn tài nguyên. Nhưng điều này không có nghĩa là bạn cần quyền truy cập vào các GPU mạnh - hoặc thậm chí là nhiều GPU - để sử dụng chúng. Có nhiều kỹ thuật tối ưu hóa để chạy các mô hình khuếch tán trên tài nguyên dành cho người dùng phổ thông và miễn phí. Ví dụ, bạn có thể nạp trọng số mô hình ở độ chính xác nửa (half-precision) để tiết kiệm bộ nhớ GPU và tăng tốc độ, hoặc chuyển toàn bộ mô hình sang GPU để tiết kiệm thêm bộ nhớ.

PyTorch 2.0 cũng hỗ trợ một cơ chế chú ý tiết kiệm bộ nhớ hơn gọi là scaled dot product attention, được bật tự động nếu bạn đang sử dụng PyTorch 2.0. Bạn có thể kết hợp điều này với torch.compile để tăng tốc mã của mình hơn nữa:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16").to("cuda")  # or "mps", "xpu", "cpu"
pipeline.unet = torch.compile(pipeline.unet, mode="reduce-overhead", fullgraph=True)

Để biết thêm các mẹo về cách tối ưu hóa mã của bạn nhằm tiết kiệm bộ nhớ và tăng tốc suy luận, hãy đọc các hướng dẫn Accelerate inference và Reduce memory usage.

Update on GitHub