Diffusers documentation

Teks-ke-gambar

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

and get access to the augmented documentation experience

to get started

Teks-ke-gambar

Ketika Anda memikirkan model difusi, teks-ke-gambar biasanya menjadi salah satu hal pertama yang terlintas di benak. Teks-ke-gambar menghasilkan gambar dari deskripsi teks (misalnya, “Astronaut in a jungle, cold color palette, muted colors, detailed, 8k”) yang juga dikenal sebagai prompt.

Secara garis besar, model difusi menerima prompt dan beberapa noise awal yang acak, lalu secara iteratif menghilangkan noise tersebut untuk membangun sebuah gambar. Proses denoising dipandu oleh prompt, dan setelah proses denoising berakhir setelah sejumlah langkah waktu yang telah ditentukan, representasi gambar didekode menjadi gambar.

Baca artikel blog Bagaimana cara kerja Stable Diffusion? untuk mempelajari lebih lanjut tentang cara kerja model difusi laten.

Anda dapat menghasilkan gambar dari prompt di 🤗 Diffusers dalam dua langkah:

  1. Muat checkpoint ke dalam kelas AutoPipelineForText2Image, yang secara otomatis mendeteksi kelas pipeline yang tepat untuk digunakan berdasarkan 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. Lewati prompt ke pipeline untuk menghasilkan gambar:
image = pipeline(
	"stained glass of darth vader, backlight, centered composition, masterpiece, photorealistic, 8k"
).images[0]
image

Model populer

Model text-to-image yang paling umum adalah Stable Diffusion v1.5, Stable Diffusion XL (SDXL), dan Kandinsky 2.2. Ada juga model ControlNet atau adapter yang dapat digunakan bersama model text-to-image untuk kontrol yang lebih langsung dalam menghasilkan gambar. Hasil dari masing-masing model sedikit berbeda karena arsitektur dan proses pelatihannya, tetapi terlepas dari model mana pun yang Anda pilih, cara penggunaannya lebih kurang sama. Mari kita gunakan prompt yang sama untuk setiap model dan bandingkan hasilnya.

Stable Diffusion v1.5

Stable Diffusion v1.5 adalah model difusi laten yang diinisialisasi dari Stable Diffusion v1-4, dan ditala ulang selama 595K langkah pada gambar 512x512 dari dataset LAION-Aesthetics V2. Anda dapat menggunakan model ini seperti:

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 adalah versi yang jauh lebih besar dari model Stable Diffusion sebelumnya, dan melibatkan proses model dua tahap yang menambahkan lebih banyak detail ke gambar. Model ini juga mencakup beberapa micro-conditionings tambahan untuk menghasilkan gambar berkualitas tinggi dengan subjek yang terpusat. Lihat panduan SDXL yang lebih komprehensif untuk mempelajari lebih lanjut tentang cara menggunakannya. Secara umum, Anda dapat menggunakan SDXL seperti:

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

Model Kandinsky sedikit berbeda dari model Stable Diffusion karena juga menggunakan model prior gambar untuk membuat embedding yang digunakan untuk menyelaraskan teks dan gambar dengan lebih baik dalam model difusi.

Cara termudah untuk menggunakan Kandinsky 2.2 adalah:

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

Model ControlNet adalah model atau adapter tambahan yang dilatih ulang (finetuned) di atas model teks-ke-gambar, seperti Stable Diffusion v1.5. Penggunaan model ControlNet dikombinasikan dengan model teks-ke-gambar menawarkan berbagai opsi untuk kontrol yang lebih eksplisit terhadap cara menghasilkan gambar. Dengan ControlNet, Anda menambahkan gambar input kondisional tambahan ke model. Misalnya, jika Anda menyediakan gambar pose manusia (biasanya direpresentasikan sebagai beberapa titik kunci yang terhubung menjadi kerangka) sebagai input kondisional, model akan menghasilkan gambar yang mengikuti pose dari gambar tersebut. Lihat panduan ControlNet yang lebih mendalam untuk mempelajari lebih lanjut tentang input kondisional lainnya dan cara menggunakannya.

Pada contoh ini, mari kita kondisikan ControlNet dengan gambar estimasi pose manusia. Muat model ControlNet yang telah dilatih sebelumnya pada estimasi pose manusia:

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")

Lewatkan controlnet ke AutoPipelineForText2Image, dan berikan prompt serta gambar estimasi pose:

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 (kondisi pose)

Konfigurasi parameter pipeline

Ada sejumlah parameter yang dapat dikonfigurasi dalam pipeline yang memengaruhi cara sebuah gambar dihasilkan. Anda dapat mengubah ukuran output gambar, menentukan prompt negatif untuk meningkatkan kualitas gambar, dan lainnya. Bagian ini membahas lebih dalam cara menggunakan parameter-parameter ini.

Tinggi dan lebar

Parameter height dan width mengontrol tinggi dan lebar (dalam piksel) dari gambar yang dihasilkan. Secara default, model Stable Diffusion v1.5 menghasilkan gambar berukuran 512x512, tetapi Anda dapat mengubahnya menjadi ukuran apa pun yang merupakan kelipatan dari 8. Sebagai contoh, untuk membuat gambar berbentuk persegi panjang:

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

Model lain mungkin memiliki ukuran gambar default yang berbeda tergantung pada ukuran gambar dalam dataset pelatihan. Misalnya, ukuran gambar default SDXL adalah 1024x1024 dan penggunaan nilai height dan width yang lebih rendah dapat menghasilkan gambar dengan kualitas yang lebih rendah. Pastikan Anda memeriksa referensi API model terlebih dahulu!

Skala panduan

Parameter guidance_scale memengaruhi seberapa besar prompt memengaruhi generasi gambar. Nilai yang lebih rendah memberikan “kreativitas” pada model untuk menghasilkan gambar yang lebih longgar kaitannya dengan prompt. Nilai guidance_scale yang lebih tinggi mendorong model untuk mengikuti prompt dengan lebih ketat, dan jika nilai ini terlalu tinggi, Anda mungkin akan mengamati beberapa artefak pada gambar yang dihasilkan.

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

Prompt negatif

Sama seperti prompt yang memandu proses generasi, negative prompt mengarahkan model menjauh dari hal-hal yang tidak Anda inginkan untuk dihasilkan. Hal ini umum digunakan untuk meningkatkan kualitas gambar secara keseluruhan dengan menghilangkan fitur gambar yang buruk atau jelek, seperti “low resolution” atau “bad details”. Anda juga dapat menggunakan negative prompt untuk menghapus atau memodifikasi konten dan gaya gambar.

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 = "ugly, deformed, disfigured, poor details, bad anatomy"
negative_prompt = "astronaut"

Generator

Objek torch.Generator memungkinkan reproduktibilitas dalam sebuah pipeline dengan mengatur seed manual. Anda dapat menggunakan Generator untuk menghasilkan batch gambar dan secara iteratif meningkatkan kualitas gambar yang dihasilkan dari seed, seperti yang dijelaskan dalam panduan Meningkatkan kualitas gambar dengan generasi deterministik.

Anda dapat mengatur seed dan Generator seperti yang ditunjukkan di bawah ini. Membuat gambar dengan Generator harus mengembalikan hasil yang sama setiap kali, bukan secara acak menghasilkan gambar baru.

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

Kontrol generasi gambar

Ada beberapa cara untuk memberikan kendali lebih besar terhadap cara sebuah gambar dihasilkan di luar mengonfigurasi parameter pipeline, seperti penimbangan prompt dan model ControlNet.

Penimbangan prompt

Prompt weighting adalah teknik untuk meningkatkan atau menurunkan pentingnya konsep dalam prompt guna menekankan atau meminimalkan fitur tertentu dalam gambar. Kami merekomendasikan penggunaan pustaka Compel untuk membantu Anda menghasilkan prompt embeddings yang berbobot.

Pelajari cara membuat prompt embeddings di panduan Prompt weighting. Contoh ini berfokus pada cara menggunakan prompt embeddings di pipeline.

Setelah Anda membuat embeddings, Anda dapat meneruskannya ke parameter prompt_embeds (dan negative_prompt_embeds jika Anda menggunakan negative prompt) di 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

Seperti yang Anda lihat di bagian ControlNet, model-model ini menawarkan cara yang lebih fleksibel dan akurat untuk menghasilkan gambar dengan memasukkan input gambar kondisional tambahan. Setiap model ControlNet dilatih sebelumnya pada jenis gambar kondisional tertentu untuk menghasilkan gambar baru yang menyerupainya. Misalnya, jika Anda mengambil model ControlNet yang dilatih sebelumnya pada peta kedalaman, Anda dapat memberikan peta kedalaman sebagai input kondisional dan model akan menghasilkan gambar yang mempertahankan informasi spasial di dalamnya. Ini lebih cepat dan mudah daripada menentukan informasi kedalaman dalam prompt. Anda bahkan dapat menggabungkan beberapa input kondisional dengan Multi-ControlNet!

Terdapat banyak jenis input kondisional yang dapat Anda gunakan, dan 🤗 Diffusers mendukung ControlNet untuk model Stable Diffusion dan SDXL. Lihat panduan ControlNet yang lebih komprehensif untuk mempelajari cara menggunakan model-model ini.

Optimalkan

Model difusi berukuran besar, dan sifat iteratif dari proses denoising gambar sangat mahal secara komputasi dan intensif. Namun, hal ini tidak berarti Anda memerlukan akses ke GPU yang sangat kuat - atau bahkan banyak GPU - untuk menggunakannya. Terdapat banyak teknik optimasi untuk menjalankan model difusi pada sumber daya konsumen dan tier gratis. Misalnya, Anda dapat memuat bobot model dalam presisi setengah (half-precision) untuk menghemat memori GPU dan meningkatkan kecepatan, atau memindahkan seluruh model ke GPU untuk menghemat lebih banyak memori.

PyTorch 2.0 juga mendukung mekanisme perhatian yang lebih hemat memori yang disebut scaled dot product attention yang secara otomatis diaktifkan jika Anda menggunakan PyTorch 2.0. Anda dapat menggabungkan ini dengan torch.compile untuk mempercepat kode Anda lebih lanjut:

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)

Untuk tips lebih lanjut tentang cara mengoptimalkan kode Anda untuk menghemat memori dan mempercepat inferensi, baca panduan Accelerate inference dan Reduce memory usage.

Update on GitHub