Diffusers documentation

JoyAI-Image-Edit-Plus

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

JoyAI-Image-Edit-Plus

JoyAI-Image adalah model dasar multimodal terpadu untuk pemahaman gambar, pembuatan gambar dari teks, dan pengeditan gambar yang dipandu instruksi. Model ini menggabungkan Multimodal Large Language Model (MLLM) 8B dengan Multimodal Diffusion Transformer (MMDiT) 16B.

JoyAI-Image-Edit-Plus adalah model pengeditan yang dipandu instruksi untuk multi-gambar, yang menerima beberapa gambar referensi dan instruksi teks untuk menghasilkan gambar baru yang menggabungkan elemen dari gambar referensi sesuai dengan instruksi. Model ini mendukung 1–5 gambar referensi per sampel.

ModelDeskripsiUnduh
JoyAI-Image-Edit-PlusPengeditan berbasis instruksi multi-gambar dengan komposisi elemen dari beberapa referensiHugging Face
import torch
from PIL import Image
from diffusers import JoyImageEditPlusPipeline

pipeline = JoyImageEditPlusPipeline.from_pretrained(
    "jdopensource/JoyAI-Image-Edit-Plus-Diffusers", dtype=torch.bfloat16
)
pipeline.to("cuda")  # or "mps", "xpu", "cpu"

images = [
    Image.open("reference_0.png").convert("RGB"),
    Image.open("reference_1.png").convert("RGB"),
]

target_h, target_w = pipeline.image_processor.get_default_height_width(images[-1])

output = pipeline(
    images=images,
    prompt="Combine the person from the second image with the scene from the first image.",
    negative_prompt="low quality, blurry, deformed",
    height=target_h,
    width=target_w,
    num_inference_steps=30,
    guidance_scale=4.0,
    generator=torch.Generator("cuda").manual_seed(42),
).images[0]
output.save("joyimage_edit_plus_output.png")

JoyImageEditPlusPipeline

kelas diffusers.JoyImageEditPlusPipeline

< >

( scheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLWantext_encoder: Qwen3VLForConditionalGenerationtokenizer: Qwen2Tokenizertransformer: JoyImageEditPlusTransformer3DModelprocessor: Qwen3VLProcessortext_token_max_length: int = 2048 )

Parameter

  • scheduler (FlowMatchEulerDiscreteScheduler) — Scheduler yang digunakan bersama transformer untuk menghilangkan noise pada latens gambar yang telah dikodekan.
  • vae (AutoencoderKLWan) — Model Variational Auto-Encoder (VAE) untuk mengodekan dan mendekodekan gambar ke dan dari representasi laten.
  • text_encoder (Qwen3VLForConditionalGeneration) — Pengkode teks multimodal untuk pengkodean prompt dengan pemahaman gambar inline.
  • tokenizer (Qwen2Tokenizer) — Tokenizer untuk pemrosesan teks.
  • transformer (JoyImageEditPlusTransformer3DModel) — Arsitektur Conditional Transformer (MMDiT) untuk mendenoise latens gambar yang telah dikodekan.
  • processor (Qwen3VLProcessor) — Pemroses untuk input multimodal (teks + gambar).
  • text_token_max_length (int, defaultnya 2048) — Panjang token maksimum untuk pengkodean teks.

Pipeline difusi untuk pengeditan berbasis instruksi multi-gambar menggunakan JoyImage Edit Plus.

Mendukung beberapa gambar referensi dengan resolusi yang berbeda. Setiap gambar referensi di-VAE-encode dan di-patchify secara independen, kemudian digabungkan dengan patch noise target untuk denoising bersama.

__call__

< >

( images: list[PIL.Image.Image] | list[list[PIL.Image.Image]] | None = Noneprompt: str | list[str] = Noneheight: int | None = Nonewidth: int | None = Nonenum_inference_steps: int = 30timesteps: list = Nonesigmas: list = Noneguidance_scale: float = 4.0negative_prompt: str | list[str] | None = Nonegenerator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_embeds_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds_mask: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truecallback_on_step_end: typing.Union[typing.Callable[[int, int, dict], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = Nonecallback_on_step_end_tensor_inputs: list = ['latents']max_sequence_length: int = 4096 ) → JoyImageEditPlusPipelineOutput or tuple

Parameter

  • images (list[Image.Image] atau list[list[Image.Image]], opsional) — Gambar referensi untuk pengeditan. Setiap gambar dapat memiliki resolusi yang berbeda. Jika daftar datar (flat list) diberikan, daftar tersebut dianggap sebagai satu sampel dengan beberapa referensi.
  • prompt (str atau list[str], opsional) — Prompt atau prompt-prompt untuk mengarahkan generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan prompt_embeds sebagai gantinya.
  • height (int, opsional) — Tinggi gambar yang dihasilkan dalam piksel. Jika None, ditentukan dari gambar referensi terakhir.
  • width (int, opsional) — Lebar gambar yang dihasilkan dalam piksel. Jika None, ditentukan dari gambar referensi terakhir.
  • num_inference_steps (int, opsional, default 30) — Jumlah langkah denoising. Semakin banyak langkah denoising, biasanya menghasilkan gambar dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat.
  • timesteps (list[int], opsional) — Timesteps kustom untuk digunakan dalam proses denoising. Jika tidak didefinisikan, spasi yang sama digunakan.
  • sigmas (list[float], opsional) — Sigmas kustom untuk digunakan dalam proses denoising.
  • guidance_scale (float, opsional, default 4.0) — Skala panduan bebas klasifikator. Nilai yang lebih tinggi mendorong model untuk menghasilkan gambar yang lebih selaras dengan prompt dengan mengorbankan kualitas gambar yang lebih rendah.
  • negative_prompt (str atau list[str], opsional) — Prompt atau prompt-prompt yang tidak digunakan untuk mengarahkan generasi gambar. Jika tidak didefinisikan, prompt kosong digunakan untuk classifier-free guidance.
  • generator (torch.Generator atau list[torch.Generator], opsional) — Satu atau daftar generator torch untuk membuat proses generasi menjadi deterministik.
  • latents (torch.Tensor, opsional) — Latents berisik yang telah dibuat sebelumnya untuk digunakan sebagai input untuk generasi gambar.
  • prompt_embeds (torch.Tensor, opsional) — Embedding teks yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks.
  • prompt_embeds_mask (torch.Tensor, opsional) — Mask perhatian untuk embedding teks yang telah dibuat sebelumnya.
  • negative_prompt_embeds (torch.Tensor, opsional) — Embedding teks negatif yang telah dibuat sebelumnya.
  • negative_prompt_embeds_mask (torch.Tensor, opsional) — Attention mask untuk embedding teks negatif yang telah dibuat sebelumnya.
  • output_type (str, opsional, default "pil") — Format output dari gambar yang dihasilkan. Pilih antara "pil" (PIL.Image.Image), "np" (np.ndarray), "pt" (torch.Tensor), atau "latent" untuk output laten mentah.
  • return_dict (bool, opsional, default True) — Apakah akan mengembalikan JoyImageEditPlusPipelineOutput alih-alih tuple biasa.
  • callback_on_step_end (Callable, opsional) — Fungsi yang dipanggil di akhir setiap langkah denoising dengan argumen: pipeline, indeks langkah, timestep, dan dict dari input tensor callback.
  • callback_on_step_end_tensor_inputs (list[str], opsional, defaultnya ["latents"]) — Daftar input tensor untuk fungsi callback_on_step_end.
  • max_sequence_length (int, opsional, defaultnya 4096) — Panjang maksimum urutan untuk text encoder.

Mengembalikan

JoyImageEditPlusPipelineOutput atau tuple

Jika return_dict adalah True, JoyImageEditPlusPipelineOutput dikembalikan, selain itu sebuah tuple dikembalikan di mana elemen pertama adalah daftar gambar yang dihasilkan.

Fungsi yang dipanggil saat memanggil pipeline untuk generasi.

Contoh:

>>> import torch
>>> from diffusers import JoyImageEditPlusPipeline
>>> from diffusers.utils import load_image

>>> model_id = "jdopensource/JoyAI-Image-Edit-Plus-Diffusers"
>>> pipe = JoyImageEditPlusPipeline.from_pretrained(model_id, torch_dtype=torch.bfloat16)
>>> pipe.to("cuda")

>>> images = [
...     load_image("dog.png"),
...     load_image("person.png"),
... ]
>>> output = pipe(
...     images=images,
...     prompt="Let the person lovingly play with the dog.",
...     height=1024,
...     width=1024,
...     num_inference_steps=30,
...     guidance_scale=4.0,
...     generator=torch.manual_seed(42),
... )
>>> output.images[0].save("output.png")

encode_prompt_multiple_images

< >

( prompt: str | list[str]device: typing.Optional[torch.device] = Noneimages: list[PIL.Image.Image] | None = Nonemax_sequence_length: int | None = None )

Enkode prompt dengan token <image> inline melalui prosesor Qwen3-VL.

prepare_latents

< >

( batch_size: intnum_channels_latents: intheight: intwidth: intdtype: dtypedevice: devicegenerator: typing.Union[torch.Generator, list[torch.Generator], NoneType]reference_images: list[list[PIL.Image.Image]] | None = Nonelatents: typing.Optional[torch.Tensor] = None ) → padded_latents

Parameter

  • latents — Noise pra-hitung opsional untuk slot target. Bentuk (B, C, 1, H', W') di mana H' dan W' adalah dimensi ruang laten. Ketika None, noise acak diambil.

Mengembalikan

padded_latents

[B, max_patches, C, pt, ph, pw] target_mask: [B, max_patches] (True untuk patch target) shape_list: daftar per sampel dari tuple (t, h, w) untuk setiap komponen

Siapkan tensor laten bantalan 6D dengan target noise + laten gambar referensi.

JoyImageEditPlusPipelineOutput

kelas diffusers.JoyImageEditPlusPipelineOutput

< >

( images: typing.Union[typing.List[PIL.Image.Image], numpy.ndarray] )

Kelas output untuk pipeline pengeditan multi-gambar JoyImage Edit Plus.

Update on GitHub