# JoyAI-Image-Edit-Plus

[JoyAI-Image](https://github.com/jd-opensource/JoyAI-Image), görüntü anlama, metinden görüntüye üretim ve talimat yönlendirmeli görüntü düzenleme için birleşik çok modlu temel bir modeldir. 8B'lik Çok Modlu Büyük Dil Modeli (MLLM) ile 16B'lik Çok Modlu Difüzyon Dönüştürücüsünü (MMDiT) birleştirir.

JoyAI-Image-Edit-Plus, **birden fazla referans görseli** ve bir metin talimatı kabul ederek, talimata göre referanslardaki öğeleri birleştiren yeni bir görsel üreten, çoklu görsel talimat yönlendirmeli düzenleme modelidir. Örnek başına 1–5 referans görselini destekler.

| Model | Açıklama | İndir |
|:-----:|:-----------:|:--------:|
| JoyAI-Image-Edit-Plus | Birden fazla referanstan öğe kompozisyonu ile çoklu görüntü talimat yönlendirmeli düzenleme | [Hugging Face](https://huggingface.co/jdopensource/JoyAI-Image-Edit-Plus-Diffusers) |

```python
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[[diffusers.JoyImageEditPlusPipeline]]

#### diffusers.JoyImageEditPlusPipeline[[diffusers.JoyImageEditPlusPipeline]]

```python
diffusers.JoyImageEditPlusPipeline(scheduler: FlowMatchEulerDiscreteScheduler, vae: AutoencoderKLWan, text_encoder: Qwen3VLForConditionalGeneration, tokenizer: Qwen2Tokenizer, transformer: JoyImageEditPlusTransformer3DModel, processor: Qwen3VLProcessor, text_token_max_length: int = 2048)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/joyimage/pipeline_joyimage_edit_plus.py#L129)

**Parametreler:**

scheduler ([FlowMatchEulerDiscreteScheduler](/docs/diffusers/main/tr/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler)) : Kodlanmış görüntü latentlerini gürültüden arındırmak için `transformer` ile birlikte kullanılacak bir zamanlayıcı.

vae ([AutoencoderKLWan](/docs/diffusers/main/tr/api/models/autoencoder_kl_wan#diffusers.AutoencoderKLWan)) : Görüntüleri latent temsillere kodlamak ve latent temsillerden görüntülere çözmek için kullanılan Varyasyonel Oto-Kodlayıcı (VAE) modeli.

text_encoder (`Qwen3VLForConditionalGeneration`) : Satır içi görüntü anlama ile prompt kodlaması için çok modlu metin kodlayıcı.

tokenizer (`Qwen2Tokenizer`) : Metin işleme için tokenizer.

transformer ([JoyImageEditPlusTransformer3DModel](/docs/diffusers/main/tr/api/models/transformer_joyimage_edit_plus#diffusers.JoyImageEditPlusTransformer3DModel)) : Kodlanmış görüntü latentlerini gürültüden arındırmak için kullanılan Koşullu Transformer (MMDiT) mimarisi.

processor (`Qwen3VLProcessor`) : Çok modlu girdiler (metin + görseller) için işlemci.

text_token_max_length (`int`, varsayılan `2048`) : Metin kodlama için maksimum token uzunluğu.

JoyImage Edit Plus kullanılarak çoklu görüntü talimat yönlendirmeli düzenleme için difüzyon hattı.

Farklı çözünürlüklere sahip birden fazla referans görüntüsünü destekler. Her referans görüntüsü bağımsız olarak VAE kodlanır ve yamalanır (patchified), ardından ortak gürültü azaltma (joint denoising) için hedef gürültü yamalarıyla birleştirilir.

#### __call__[[diffusers.JoyImageEditPlusPipeline.__call__]]

```python
__call__(images: list[PIL.Image.Image] | list[list[PIL.Image.Image]] | None = None, prompt: str | list[str] = None, height: int | None = None, width: int | None = None, num_inference_steps: int = 30, timesteps: list = None, sigmas: list = None, guidance_scale: float = 4.0, negative_prompt: str | list[str] | None = None, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_embeds_mask: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds_mask: typing.Optional[torch.Tensor] = None, output_type: str | None = 'pil', return_dict: bool = True, callback_on_step_end: typing.Union[typing.Callable[[int, int, dict], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = None, callback_on_step_end_tensor_inputs: list = ['latents'], max_sequence_length: int = 4096)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/joyimage/pipeline_joyimage_edit_plus.py#L441)

**Parametreler:**

images (`list[Image.Image]` veya `list[list[Image.Image]]`, *isteğe bağlı*) : Düzenleme için referans görüntüler. Her görüntünün farklı bir çözünürlüğe sahip olabilir. Düz bir liste sağlanırsa, birden fazla referansı olan tek bir örnek olarak ele alınır.

prompt (`str` veya `list[str]`, *isteğe bağlı*) : Görsel üretimi yönlendirmek için istem veya istemler. Tanımlanmamışsa, bunun yerine `prompt_embeds` geçirilmelidir.

height (`int`, *isteğe bağlı*) : Üretilen görüntünün piksel cinsinden yüksekliği. `None` ise, son referans görüntüden belirlenir.

width (`int`, *isteğe bağlı*) : Üretilen görüntünün piksel cinsinden genişliği. `None` ise, son referans görüntüsünden belirlenir.

num_inference_steps (`int`, *isteğe bağlı*, varsayılan `30`) : Gürültü azaltma adım sayısı. Daha fazla gürültü azaltma adımı, genellikle daha yavaş çıkarım pahasına daha yüksek kaliteli bir görüntüye yol açar.

timesteps (`list[int]`, *isteğe bağlı*) : Gürültü azaltma süreci için kullanılacak özel zaman adımları. Tanımlanmamışsa, eşit aralıklama kullanılır.

sigmas (`list[float]`, *isteğe bağlı*) : Gürültü azaltma süreci için kullanılacak özel sigmalar.

guidance_scale (`float`, *isteğe bağlı*, varsayılan `4.0`) : Classifier-free guidance ölçeği. Daha yüksek değerler, modelin `prompt` ile daha uyumlu görseller üretmesini teşvik eder; bunun bedeli ise daha düşük görsel kalitedir.

negative_prompt (`str` veya `list[str]`, *isteğe bağlı*) : Görsel üretimi yönlendirmemek için kullanılan istem veya istemler. Tanımlanmazsa, sınıflandırıcı-ücretsiz yönlendirme için boş bir istem kullanılır.

generator (`torch.Generator` veya `list[torch.Generator]`, *isteğe bağlı*) : Üretimi deterministik hale getirmek için bir veya [torch üreteci(leri)](https://pytorch.org/docs/stable/generated/torch.Generator.html) listesi.

latents (`torch.Tensor`, *isteğe bağlı*) : Görsel üretimi için girdi olarak kullanılacak önceden oluşturulmuş gürültülü latentler.

prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Önceden oluşturulmuş metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir.

prompt_embeds_mask (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş metin gömme vektörleri için dikkat maskesi.

negative_prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Önceden oluşturulmuş negatif metin gömme değerleri.

negative_prompt_embeds_mask (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş negatif metin gömme vektörleri için dikkat maskesi.

output_type (`str`, *isteğe bağlı*, varsayılan `"pil"`) : Üretilen görüntünün çıktı biçimi. `"pil"` (`PIL.Image.Image`), `"np"` (`np.ndarray`), `"pt"` (`torch.Tensor`) veya ham latent çıktı için `"latent"` arasında seçim yapın.

return_dict (`bool`, *isteğe bağlı*, varsayılan `True`) : Düz bir tuple yerine [JoyImageEditPlusPipelineOutput](/docs/diffusers/main/tr/api/pipelines/joyimage_edit_plus#diffusers.JoyImageEditPlusPipelineOutput) döndürülüp döndürülmemesi.

callback_on_step_end (`Callable`, *isteğe bağlı*) : Her gürültü azaltma adımının sonunda, şu argümanlarla çağrılan bir fonksiyon: pipeline, adım indeksi, timestep ve callback girdi tensörlerinin sözlüğü.

callback_on_step_end_tensor_inputs (`list[str]`, *isteğe bağlı*, varsayılan `["latents"]`) : `callback_on_step_end` işlevi için girdi gergileri listesi.

max_sequence_length (`int`, *isteğe bağlı*, varsayılan `4096`) : Metin kodlayıcısı için maksimum dizi uzunluğu.

**Dönüş:** [JoyImageEditPlusPipelineOutput](/docs/diffusers/main/tr/api/pipelines/joyimage_edit_plus#diffusers.JoyImageEditPlusPipelineOutput) veya `tuple`

`return_dict` `True` ise [JoyImageEditPlusPipelineOutput](/docs/diffusers/main/tr/api/pipelines/joyimage_edit_plus#diffusers.JoyImageEditPlusPipelineOutput) döndürülür, aksi halde ilk öğesi üretilen görsellerin listesi olan bir `tuple` döndürülür.

Üretim için pipeline çağrıldığında tetiklenen işlev.

Örnekler:
```python
>>> 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[[diffusers.JoyImageEditPlusPipeline.encode_prompt_multiple_images]]

```python
encode_prompt_multiple_images(prompt: str | list[str], device: typing.Optional[torch.device] = None, images: list[PIL.Image.Image] | None = None, max_sequence_length: int | None = None)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/joyimage/pipeline_joyimage_edit_plus.py#L229)

Qwen3-VL işlemcisi aracılığıyla satır içi token içeren istemleri kodlayın.

#### prepare_latents[[diffusers.JoyImageEditPlusPipeline.prepare_latents]]

```python
prepare_latents(batch_size: int, num_channels_latents: int, height: int, width: int, dtype: dtype, device: device, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType], reference_images: list[list[PIL.Image.Image]] | None = None, latents: typing.Optional[torch.Tensor] = None)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/joyimage/pipeline_joyimage_edit_plus.py#L274)

**Parametreler:**

latents : Hedef slot için isteğe bağlı önceden hesaplanmış gürültü. `H'` ve `W'` latent uzay boyutları olmak üzere şekli `(B, C, 1, H', W')`. `None` olduğunda rastgele gürültü örneklenir.

**Dönüş:** `padded_latents`

[B, max_patches, C, pt, ph, pw] target_mask: [B, max_patches] (hedef yamalar için True) shape_list: her bileşen için (t, h, w) demetlerinin örnek başına listesi

Hedef gürültü + referans görüntü latentleri ile 6D dolgulu latent tensör hazırlayın.

## JoyImageEditPlusPipelineOutput[[diffusers.JoyImageEditPlusPipelineOutput]]

#### diffusers.JoyImageEditPlusPipelineOutput[[diffusers.JoyImageEditPlusPipelineOutput]]

```python
diffusers.JoyImageEditPlusPipelineOutput(images: typing.Union[typing.List[PIL.Image.Image], numpy.ndarray])
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/joyimage/pipeline_output.py#L20)

JoyImage Edit Plus çoklu görüntü düzenleme hatları için çıktı sınıfı.

