Janus-Pro 概述

Janus-Pro-7B 是 DeepSeek 于 2025 年 1 月发布的开源统一多模态模型,核心创新在于解耦视觉编码(Decoupled Visual Encoding)——为「理解」和「生成」两条路径分别设计独立的视觉编码器,突破了传统统一多模态模型在理解与生成质量上的权衡困境。

核心架构

路径编码器功能
理解路径SigLIP 编码器提取高层语义特征,用于视觉理解
生成路径VQ Tokenizer将图像转换为离散 token,用于图像生成

图像理解:Visual Question Answering

from transformers import AutoModelForCausalLM
from janus.models import MultiModalityCausalLM, VLChatProcessor
from PIL import Image
import torch

model_path = "deepseek-ai/Janus-Pro-7B"
vl_chat_processor = VLChatProcessor.from_pretrained(model_path)
tokenizer = vl_chat_processor.tokenizer

vl_gpt = AutoModelForCausalLM.from_pretrained(
    model_path,
    trust_remote_code=True,
    torch_dtype=torch.bfloat16,
    device_map="auto"
).eval()

# 图像问答
conversation = [
    {
        "role": "<|User|>",
        "content": "\n这张图片中有什么?请详细描述。",
        "images": ["images/demo.jpg"],
    },
    {"role": "<|Assistant|>", "content": ""},
]

prepare_inputs = vl_chat_processor(
    conversations=conversation,
    images=[Image.open("images/demo.jpg")],
    force_batchify=True
).to(vl_gpt.device)

inputs_embeds = vl_gpt.prepare_inputs_embeds(**prepare_inputs)
outputs = vl_gpt.language_model.generate(
    inputs_embeds=inputs_embeds,
    attention_mask=prepare_inputs.attention_mask,
    pad_token_id=tokenizer.eos_token_id,
    max_new_tokens=512,
    do_sample=False,
)

answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(f"理解结果: {answer}")

图像生成:Text-to-Image

# 文本到图像生成
gen_conversation = [
    {
        "role": "<|User|>",
        "content": "生成一张图片:一只可爱的橘猫坐在窗台上,阳光洒在它身上。",
    },
    {"role": "<|Assistant|>", "content": ""},
]

gen_inputs = vl_chat_processor(
    conversations=gen_conversation,
    force_batchify=True
).to(vl_gpt.device)

gen_inputs_embeds = vl_gpt.prepare_inputs_embeds(**gen_inputs)
gen_outputs = vl_gpt.language_model.generate(
    inputs_embeds=gen_inputs_embeds,
    attention_mask=gen_inputs.attention_mask,
    pad_token_id=tokenizer.eos_token_id,
    max_new_tokens=2048,
    do_sample=True,
    temperature=0.8,
)

# 解码生成的视觉 token 为图像
generated_tokens = gen_outputs[0]
decoded_image = vl_gpt.gen_vision_model.decode_code(
    generated_tokens,
    shape=[384, 384]  # Janus-Pro 固定分辨率
)
decoded_image.save("generated_cat.png")
print("图像已保存为 generated_cat.png")

理解能力场景

场景示例 Prompt输出
图像描述"请详细描述这张图片"自然语言描述
视觉问答"图片中有几个人?"数量答案
OCR 文字识别"提取图片中的文字"文字内容
视觉推理"推测接下来会发生什么"推理分析

生成技巧

  • Prompt 要具体:描述场景、风格、颜色、构图
  • 支持风格化描述:"梵高风格"、"赛博朋克"、"水彩画"
  • 分辨率固定 384×384,不适合超大图像
  • temperature 控制创意度:0.5 偏写实,0.9 偏创意
  • 一次生成约需 5-15 秒(取决于硬件)

部署要求

配置最低推荐
GPU16GB 显存24GB+ 显存
内存32GB64GB
磁盘30GB50GB

Janus-Pro 可以在消费级 GPU(如 RTX 4090)上流畅运行,是入门多模态开发的理想选择。