AI 领域迎来重大升级。DeepSeek,这家为一些最具创新性的开源模型提供支持的研究实验室,推出了Janus Pro 7B— 一个免费的多模态 AI,它不仅能以惊人的准确度理解图像,还能从文本生成高质量的视觉内容。
告别单用途模型。Janus Pro 来了,它将统一 AI 的眼睛和想象力。让我们来分析一下这次发布为何备受关注,以及你今天就可以如何使用它。
大多数 AI 模型都专注于一项任务:要么分析图像,要么生成图像。例如,像 LLaVA 这样的模型擅长描述视觉内容,但无法创建它们,而 Stable Diffusion 生成艺术作品,但无法回答关于照片的问题。
Janus Pro 7B 弥合了这一差距。这是一个经过训练的单一模型,可以:
•分析图像(描述场景、识别地标、回答关于视觉内容的问题)。
•生成图像(将文本提示转化为逼真的或艺术性的输出)。
这种“双重能力”在开源 AI 中非常罕见,使得 Janus Pro 成为开发者、创作者和企业的通用工具。
性能:它真的有多好?
DeepSeek 的基准测试显示,Janus Pro 的表现优于流行的开源竞争对手:
它在图像理解方面击败了 LLava-v-1.5 模型,并且在图像生成方面优于 Stable Diffusion、pixArt 和 DALL-E。
底层原理:Janus Pro 如何工作
传统的模型通常对这两项任务使用单一的视觉处理方法,这可能导致性能欠佳,因为理解和生成图像需要不同的方法。为了解决这个问题,Janus 将视觉处理分成了两个不同的路径:
1.理解路径:该路径侧重于通过提取高级语义特征来解释图像,从而使模型能够理解图像的内容。
2.生成路径:该路径旨在创建图像,将视觉数据转换为离散表示,以促进详细的图像合成。
这两个路径都集成到一个统一的 Transformer 架构中,使 Janus 能够有效地处理理解和生成任务。
训练数据:
•9000 万个样本用于理解(图像标题、图表、文档)。
•7200 万个合成美学样本用于高质量的图像生成。
这种“真实”数据和合成数据的结合确保了模型输出的准确性和视觉吸引力。
如何立即使用 Janus Pro
最好的部分是什么?它是免费的,并且可以通过多种方式访问:
1. Hugging Face:
• 访问 DeepSeek 的 Hugging Face Space。
2. 在本地运行:
•GitHub 代码:从 DeepSeek 的 GitHub 克隆该仓库。
## create environment with python version Python >= 3.8
pip install -e .简单推理示例多模态理解
import torch
from transformers importAutoModelForCausalLM
from janus.modelsimportMultiModalityCausalLM, VLChatProcessor
from janus.utils.ioimport load_pil_images
## specify the path to the model
model_path = "deepseek-ai/Janus-Pro-7B"
vl_chat_processor: VLChatProcessor = VLChatProcessor.from_pretrained(model_path)
tokenizer = vl_chat_processor.tokenizer
vl_gpt: MultiModalityCausalLM = AutoModelForCausalLM.from_pretrained(
model_path, trust_remote_code=True
)
vl_gpt = vl_gpt.to(torch.bfloat16).cuda().eval()
conversation = [
{
"role": "<|User|>",
"content": f"<image_placeholder>\n{question}",
"images": [image],
},
{"role": "<|Assistant|>", "content": ""},
]
## load images and prepare for inputs
pil_images = load_pil_images(conversation)
prepare_inputs = vl_chat_processor(
conversations=conversation, images=pil_images, force_batchify=True
).to(vl_gpt.device)
## # run image encoder to get the image embeddings
inputs_embeds = vl_gpt.prepare_inputs_embeds(**prepare_inputs)
## # run the model to get the response
outputs = vl_gpt.language_model.generate(
inputs_embeds=inputs_embeds,
attention_mask=prepare_inputs.attention_mask,
pad_token_id=tokenizer.eos_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
max_new_tokens=512,
do_sample=False,
use_cache=True,
)
answer = tokenizer.decode(outputs[0].cpu().tolist(), skip_special_tokens=True)
print(f"{prepare_inputs['sft_format'][0]}", answer)文本到图像生成
import os
import PIL.Image
import torch
import numpy as np
from transformers import AutoModelForCausalLM
from janus.models import MultiModalityCausalLM, VLChatProcessor指定模型路径
model_path = "deepseek-ai/Janus-Pro-7B"
vl_chat_processor: VLChatProcessor = VLChatProcessor.from_pretrained(model_path)
tokenizer = vl_chat_processor.tokenizer
vl_gpt: MultiModalityCausalLM = AutoModelForCausalLM.from_pretrained(
model_path, trust_remote_code=True
)
vl_gpt = vl_gpt.to(torch.bfloat16).cuda().eval()
conversation = [
{
"role": "<|User|>",
"content": "A stunning princess from kabul in red, white traditional clothing, blue eyes, brown hair",
},
{"role": "<|Assistant|>", "content": ""},
]
sft_format = vl_chat_processor.apply_sft_template_for_multi_turn_prompts(
conversations=conversation,
sft_format=vl_chat_processor.sft_format,
system_prompt="",
)
prompt = sft_format + vl_chat_processor.image_start_tag
@torch.inference_mode()
defgenerate(
mmgpt: MultiModalityCausalLM,
vl_chat_processor: VLChatProcessor,
prompt: str,
temperature: float = 1,
parallel_size: int = 16,
cfg_weight: float = 5,
image_token_num_per_image: int = 576,
img_size: int = 384,
patch_size: int = 16,
):
input_ids = vl_chat_processor.tokenizer.encode(prompt)
input_ids = torch.LongTensor(input_ids)
tokens = torch.zeros((parallel_size*2, len(input_ids)), dtype=torch.int).cuda()
for i inrange(parallel_size*2):
tokens[i, :] = input_ids
if i % 2 != 0:
tokens[i, 1:-1] = vl_chat_processor.pad_id
inputs_embeds = mmgpt.language_model.get_input_embeddings()(tokens)
generated_tokens = torch.zeros((parallel_size, image_token_num_per_image), dtype=torch.int).cuda()
for i inrange(image_token_num_per_image):
outputs = mmgpt.language_model.model(inputs_embeds=inputs_embeds, use_cache=True, past_key_values=outputs.past_key_values if i != 0elseNone)
hidden_states = outputs.last_hidden_state
logits = mmgpt.gen_head(hidden_states[:, -1, :])
logit_cond = logits[0::2, :]
logit_uncond = logits[1::2, :]
logits = logit_uncond + cfg_weight * (logit_cond-logit_uncond)
probs = torch.softmax(logits / temperature, dim=-1)
next_token = torch.multinomial(probs, num_samples=1)
generated_tokens[:, i] = next_token.squeeze(dim=-1)
next_token = torch.cat([next_token.unsqueeze(dim=1), next_token.unsqueeze(dim=1)], dim=1).view(-1)
img_embeds = mmgpt.prepare_gen_img_embeds(next_token)
inputs_embeds = img_embeds.unsqueeze(dim=1)
dec = mmgpt.gen_vision_model.decode_code(generated_tokens.to(dtype=torch.int), shape=[parallel_size, 8, img_size//patch_size, img_size//patch_size])
dec = dec.to(torch.float32).cpu().numpy().transpose(0, 2, 3, 1)
dec = np.clip((dec + 1) / 2 * 255, 0, 255)
visual_img = np.zeros((parallel_size, img_size, img_size, 3), dtype=np.uint8)
visual_img[:, :, :] = dec
os.makedirs('generated_samples', exist_ok=True)
for i inrange(parallel_size):
save_path = os.path.join('generated_samples', "img_{}.jpg".format(i))
PIL.Image.fromarray(visual_img[i]).save(save_path)
generate(
vl_gpt,
vl_chat_processor,
prompt,
)
对于本地 Gradio 演示,您可以使用以下命令运行:
pip install -e .[gradio]
python demo/app_januspro.py用例:Janus Pro 的优势
• 内容创作:在一个工作流程中生成博客图片并撰写标题。
• 教育:将教科书图表转化为交互式解释。
• 电子商务:从照片中自动生成产品描述。
• 可访问性:为视障用户描述图像。
需要考虑的局限性
• 计算需求:7B 参数模型需要不错的硬件(建议使用 GPU 进行生成)。
• 偏见风险:与所有 AI 一样,输出结果可能反映训练数据中的偏见。请务必审查结果。
更大的前景
Janus Pro 不仅仅是另一个 AI 模型,它更是迈向真正统一的 AI 系统的一步。通过结合理解和生成,DeepSeek 正在推动开源 AI 接近 GPT-4o 等专有巨头的能力。
对于开发者来说,这意味着视觉和语言模型之间的孤岛更少了。对于用户来说,这是一个未来的一瞥,在这个未来中,AI 可以在文本、图像和声音之间无缝交互。