Some checks failed
Self-hosted runner (nightly-past-ci-caller) / Get number (push) Has been cancelled
Self-hosted runner (nightly-past-ci-caller) / TensorFlow 2.11 (push) Has been cancelled
Self-hosted runner (nightly-past-ci-caller) / TensorFlow 2.10 (push) Has been cancelled
Self-hosted runner (nightly-past-ci-caller) / TensorFlow 2.9 (push) Has been cancelled
Self-hosted runner (nightly-past-ci-caller) / TensorFlow 2.8 (push) Has been cancelled
Self-hosted runner (nightly-past-ci-caller) / TensorFlow 2.7 (push) Has been cancelled
Self-hosted runner (nightly-past-ci-caller) / TensorFlow 2.6 (push) Has been cancelled
Self-hosted runner (nightly-past-ci-caller) / TensorFlow 2.5 (push) Has been cancelled
Self-hosted runner (benchmark) / Benchmark (aws-g5-4xlarge-cache) (push) Has been cancelled
Build documentation / build (push) Has been cancelled
Build documentation / build_other_lang (push) Has been cancelled
CodeQL Security Analysis / CodeQL Analysis (push) Has been cancelled
New model PR merged notification / Notify new model (push) Has been cancelled
PR CI / pr-ci (push) Has been cancelled
Slow tests on important models (on Push - A10) / Get all modified files (push) Has been cancelled
Secret Leaks / trufflehog (push) Has been cancelled
Update Transformers metadata / build_and_package (push) Has been cancelled
Slow tests on important models (on Push - A10) / Model CI (push) Has been cancelled
Check Tiny Models / Check tiny models (push) Has been cancelled
Self-hosted runner (Intel Gaudi3 scheduled CI caller) / Model CI (push) Has been cancelled
Self-hosted runner (Intel Gaudi3 scheduled CI caller) / Pipeline CI (push) Has been cancelled
Self-hosted runner (Intel Gaudi3 scheduled CI caller) / Example CI (push) Has been cancelled
Self-hosted runner (Intel Gaudi3 scheduled CI caller) / DeepSpeed CI (push) Has been cancelled
Self-hosted runner (Intel Gaudi3 scheduled CI caller) / Trainer/FSDP CI (push) Has been cancelled
Nvidia CI - Flash Attn / Setup (push) Has been cancelled
Nvidia CI - Flash Attn / Model CI (push) Has been cancelled
Nvidia CI / Setup (push) Has been cancelled
Nvidia CI / Model CI (push) Has been cancelled
Nvidia CI / Torch pipeline CI (push) Has been cancelled
Nvidia CI / Example CI (push) Has been cancelled
Nvidia CI / Trainer/FSDP CI (push) Has been cancelled
Nvidia CI / DeepSpeed CI (push) Has been cancelled
Nvidia CI / Quantization CI (push) Has been cancelled
Nvidia CI / Kernels CI (push) Has been cancelled
Doctests / Setup (push) Has been cancelled
Doctests / Call doctest jobs (push) Has been cancelled
Doctests / Send results to webhook (push) Has been cancelled
Extras Smoke Test / Get supported Python versions (push) Has been cancelled
Extras Smoke Test / Test extras on Python ${{ matrix.python-version }} (push) Has been cancelled
Extras Smoke Test / Check Slack token availability (push) Has been cancelled
Extras Smoke Test / Notify failures to Slack (push) Has been cancelled
Self-hosted runner (AMD scheduled CI caller) / Trigger Scheduled AMD CI (push) Has been cancelled
Stale Bot / Close Stale Issues (push) Has been cancelled
234 lines
8.5 KiB
Markdown
234 lines
8.5 KiB
Markdown
<!--Copyright 2025 The HuggingFace Team. All rights reserved.
|
||
|
||
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
|
||
the License. You may obtain a copy of the License at
|
||
|
||
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
||
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
|
||
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
||
specific language governing permissions and limitations under the License.
|
||
|
||
⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
|
||
rendered properly in your Markdown viewer.
|
||
|
||
-->
|
||
*This model was published in HF papers on 2024-10-17 and contributed to Hugging Face Transformers on 2025-04-17.*
|
||
|
||
# Janus
|
||
|
||
## Overview
|
||
|
||
The Janus Model was originally proposed in [Janus: Decoupling Visual Encoding for Unified Multimodal Understanding and Generation](https://huggingface.co/papers/2410.13848) by DeepSeek AI team and later refined in [Janus-Pro: Unified Multimodal Understanding and Generation with Data and Model Scaling](https://huggingface.co/papers/2501.17811). Janus is a vision-language model that can generate both image and text output, it can also take both images and text as input.
|
||
|
||
> [!NOTE]
|
||
> The model doesn't generate both images and text in an interleaved format. The user has to pass a parameter indicating whether to generate text or image.
|
||
|
||
The abstract from the original paper is the following:
|
||
|
||
*In this paper, we introduce Janus, an autoregressive framework that unifies multimodal understanding and generation. Prior research often relies on a single visual encoder for both tasks, such as Chameleon. However, due to the differing levels of information granularity required by multimodal understanding and generation, this approach can lead to suboptimal performance, particularly in multimodal understanding. To address this issue, we decouple visual encoding into separate pathways, while still leveraging a single, unified transformer architecture for processing. The decoupling not only alleviates the conflict between the visual encoder's roles in understanding and generation, but also enhances the framework's flexibility. For instance, both the multimodal understanding and generation components can independently select their most suitable encoding methods. Experiments show that Janus surpasses previous unified model and matches or exceeds the performance of task-specific models. The simplicity, high flexibility, and effectiveness of Janus make it a strong candidate for next-generation unified multimodal models.*
|
||
|
||
The abstract from the aforementioned `Janus-Pro` paper, released afterwards, is the following:
|
||
|
||
*In this work, we introduce Janus-Pro, an advanced version of the previous work Janus. Specifically, Janus-Pro incorporates (1) an optimized training strate (2) expanded training data, and (3) scaling to larger model size. With these improvements, Janus-Pro achieves significant advancements in both multimodal understanding and text-to-image instruction-following capabilities, while also enhancing the stability of text-to-image generation. We hope this work will inspire further exploration in the field. Code and models are publicly available.*
|
||
|
||
This model was contributed by [Yaswanth Gali](https://huggingface.co/yaswanthgali) and [Hugo Silva](https://huggingface.co/hugosilva664).
|
||
The original code can be found [here](https://github.com/deepseek-ai/Janus).
|
||
|
||
## Usage Example
|
||
|
||
### Single image inference
|
||
|
||
Here is the example of visual understanding with a single image.
|
||
|
||
> [!NOTE]
|
||
> Note that the model has been trained with a specific prompt format for chatting. Use `processor.apply_chat_template(my_conversation_dict)` to correctly format your prompts.
|
||
|
||
```python
|
||
|
||
from transformers import JanusForConditionalGeneration, JanusProcessor
|
||
|
||
|
||
model_id = "deepseek-community/Janus-Pro-1B"
|
||
# Prepare Input for generation.
|
||
messages = [
|
||
{
|
||
"role": "user",
|
||
"content": [
|
||
{'type':'image', 'url': 'http://images.cocodataset.org/val2017/000000039769.jpg'},
|
||
{'type':"text", "text":"What do you see in this image?."}
|
||
]
|
||
},
|
||
]
|
||
|
||
# Set generation mode to `text` to perform text generation.
|
||
processor = JanusProcessor.from_pretrained(model_id)
|
||
model = JanusForConditionalGeneration.from_pretrained(model_id,
|
||
device_map="auto")
|
||
|
||
inputs = processor.apply_chat_template(
|
||
messages,
|
||
add_generation_prompt=True,
|
||
generation_mode="text",
|
||
tokenize=True,
|
||
return_dict=True,
|
||
return_tensors="pt",
|
||
).to(model.device)
|
||
|
||
output = model.generate(**inputs, max_new_tokens=40,generation_mode='text',do_sample=True)
|
||
text = processor.decode(output[0], skip_special_tokens=True)
|
||
print(text)
|
||
```
|
||
|
||
### Multi image inference
|
||
|
||
Janus can perform inference with multiple images as input, where images can belong to the same prompt or different prompts in batched inference, where the model processes many conversations in parallel. Here is how you can do it:
|
||
|
||
```python
|
||
|
||
from transformers import JanusForConditionalGeneration, JanusProcessor
|
||
|
||
|
||
model_id = "deepseek-community/Janus-Pro-1B"
|
||
|
||
image_urls = [
|
||
"http://images.cocodataset.org/val2017/000000039769.jpg",
|
||
"https://www.ilankelman.org/stopsigns/australia.jpg",
|
||
"https://huggingface.co/microsoft/kosmos-2-patch14-224/resolve/main/snowman.jpg"
|
||
]
|
||
|
||
messages = [
|
||
[
|
||
{
|
||
"role": "user",
|
||
"content": [
|
||
{"type": "text", "text": "What’s the difference between"},
|
||
{"type": "image", "url": image_urls[0]},
|
||
{"type": "text", "text": " and "},
|
||
{"type": "image", "url": image_urls[1]}
|
||
]
|
||
}
|
||
],
|
||
[
|
||
{
|
||
"role": "user",
|
||
"content": [
|
||
{"type": "image", "url": image_urls[2]},
|
||
{"type": "text", "text": "What do you see in this image?"}
|
||
]
|
||
}
|
||
]
|
||
]
|
||
|
||
# Load model and processor
|
||
processor = JanusProcessor.from_pretrained(model_id)
|
||
model = JanusForConditionalGeneration.from_pretrained(
|
||
model_id, device_map="auto"
|
||
)
|
||
|
||
inputs = processor.apply_chat_template(
|
||
messages,
|
||
add_generation_prompt=True,
|
||
generation_mode="text",
|
||
tokenize=True,
|
||
padding=True,
|
||
return_dict=True,
|
||
return_tensors="pt"
|
||
).to(model.device)
|
||
|
||
# Generate response
|
||
output = model.generate(**inputs, max_new_tokens=40, generation_mode='text', do_sample=False)
|
||
text = processor.batch_decode(output, skip_special_tokens=True)
|
||
print(text)
|
||
```
|
||
|
||
## Text to Image generation
|
||
|
||
Janus can also generate images given a prompt.
|
||
|
||
```python
|
||
from transformers import JanusForConditionalGeneration, JanusProcessor
|
||
|
||
|
||
# Set generation mode to `image` to prepare inputs for image generation..
|
||
|
||
model_id = "deepseek-community/Janus-Pro-1B"
|
||
processor = JanusProcessor.from_pretrained(model_id)
|
||
model = JanusForConditionalGeneration.from_pretrained(model_id,
|
||
device_map="auto")
|
||
|
||
messages = [
|
||
{
|
||
"role": "user",
|
||
"content": [
|
||
{"type": "text", "text": "A dog running under the rain."},
|
||
],
|
||
}
|
||
]
|
||
|
||
prompt = processor.apply_chat_template(messages, add_generation_prompt=True)
|
||
inputs = processor(text=prompt,generation_mode="image",return_tensors="pt").to(model.device)
|
||
|
||
# Set num_return_sequence parameter to generate multiple images per prompt.
|
||
model.generation_config.num_return_sequences = 2
|
||
outputs = model.generate(**inputs,
|
||
generation_mode="image",
|
||
do_sample=True,
|
||
use_cache=True,
|
||
)
|
||
# Perform post-processing on the generated token ids.
|
||
decoded_image = model.decode_image_tokens(outputs)
|
||
images = processor.postprocess(list(decoded_image.float()),return_tensors="PIL.Image.Image").to(model.device)
|
||
# Save the image
|
||
for i, image in enumerate(images['pixel_values']):
|
||
image.save(f"result{i}.png")
|
||
```
|
||
|
||
## JanusConfig
|
||
|
||
[[autodoc]] JanusConfig
|
||
|
||
## JanusVisionConfig
|
||
|
||
[[autodoc]] JanusVisionConfig
|
||
|
||
## JanusVQVAEConfig
|
||
|
||
[[autodoc]] JanusVQVAEConfig
|
||
|
||
## JanusProcessor
|
||
|
||
[[autodoc]] JanusProcessor
|
||
- __call__
|
||
|
||
## JanusImageProcessor
|
||
|
||
[[autodoc]] JanusImageProcessor
|
||
- preprocess
|
||
|
||
## JanusImageProcessorPil
|
||
|
||
[[autodoc]] JanusImageProcessorPil
|
||
- preprocess
|
||
|
||
## JanusVisionModel
|
||
|
||
[[autodoc]] JanusVisionModel
|
||
- forward
|
||
|
||
## JanusVQVAE
|
||
|
||
[[autodoc]] JanusVQVAE
|
||
- forward
|
||
|
||
## JanusModel
|
||
|
||
[[autodoc]] JanusModel
|
||
- forward
|
||
- get_image_features
|
||
|
||
## JanusForConditionalGeneration
|
||
|
||
[[autodoc]] JanusForConditionalGeneration
|
||
- forward
|