多模态开发
进阶
DeepSeek 多模态开发实战:Janus-Pro 图像理解与生成
2026-08
16 分钟阅读
#Janus-Pro
#多模态
#图像理解
#图像生成
#视觉编码
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 秒(取决于硬件)
部署要求
| 配置 | 最低 | 推荐 |
|---|
| GPU | 16GB 显存 | 24GB+ 显存 |
| 内存 | 32GB | 64GB |
| 磁盘 | 30GB | 50GB |
Janus-Pro 可以在消费级 GPU(如 RTX 4090)上流畅运行,是入门多模态开发的理想选择。