首页
学习
活动
专区
圈层
工具
发布

统一AI:了解DeepSeek的Janus Pro 7B如何在一个模型中融合图像理解与生成

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 可以在文本、图像和声音之间无缝交互。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/ORfpdvGsL29H7Bn2uHCIYG0g0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券