百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Janus:DeepSeek 在多模态理解与生成的新突破

ztj100 2025-02-11 14:27 46 浏览 0 评论

DeepSeek 的爆发使其在多方面的研究都得到了更多关注;同时,人工智能领域的多模态技术正逐渐成为研究的热点,多模态理解与生成旨在让机器能够同时处理和理解多种类型的数据,如文本、图像和视频等,并生成有意义的输出。

DeepSeek 的 Janus 项目在这一领域崭露头角,其致力于实现统一的多模态理解和生成,推动人工智能技术的进一步发展。



简介

Janus 是 DeepSeek 团队推出的、旨在统一多模态理解和生成的一系列模型,项目地址为
https://github.com/deepseek-ai/Janus
。Janus 系列目前包括 3 个模型,分别是:Janus、JanusFlow 和 Janus-Pro。

Janus 模型 是一个新颖的自回归框架,其将多模态理解和生成统一起来,基于论文 《Janus: Decoupling Visual Encoding for Unified Multimodal Understanding and Generation》。

Janus 通过将视觉编码分解为独立的路径,同时仍然使用单一的统一 Transformer 架构进行处理,解决了先前方法的一些局限性。这种分解不仅缓解了视觉编码器在理解和生成任务之间的冲突,还增强了该框架的灵活性。Janus 超越了先前的统一模型,其与特定任务模型相比起来性能相当甚至更优。Janus 的简单性、高度灵活性和有效性使其成为下一代统一多模态模型的有力候选者。

JanusFlow 模型 引入了一种极简架构,该架构将自回归语言模型与修正流(一种生成式建模中的前沿方法)相结合,基于论文《JanusFlow: Harmonizing Autoregression and Rectified Flow for Unified Multimodal Understanding and Generation》

JanusFlow 模型表明修正流可以在大语言模型框架内直接进行训练,无需进行复杂的架构修改。大量实验表明,JanusFlow 在各自领域的性能与专业模型相当或更优,同时在标准基准测试中显著超越了现有的统一方法。这项工作朝着更高效、更通用的视觉 - 语言模型迈出了一步。

Janus-Pro 模型是先前作品 Janus 的进阶版本,基于论文《Janus-Pro: Unified Multimodal Understanding and Generation with Data and Model Scaling》。

Janus-Pro 相比 Janus 融入了以下几点:(1)优化的训练策略;(2)扩充的训练数据;(3)扩大模型规模。通过这些改进,Janus-Pro 在多模态理解和文本到图像的指令遵循能力方面都取得了显著进步,同时还提高了文本到图像生成的稳定性。



使用

Janus 模型可以直接从 Huggingface 下载使用:

  • Janus-1.3B:https://huggingface.co/deepseek-ai/Janus-1.3B
  • JanusFlow-1.3B:https://huggingface.co/deepseek-ai/JanusFlow-1.3B
  • Janus-Pro-1B:https://huggingface.co/deepseek-ai/Janus-Pro-1B
  • Janus-Pro-7B:https://huggingface.co/deepseek-ai/Janus-Pro-7B

此外,开发者们也可以自行安装部署,首先拉取仓库代码:

git clone https://github.com/deepseek-ai/Janus.git

Janus 模型要求 Python >= 3.8,首先安装依赖:

pip install -e .

我们可以简单地写一个从文本生成图片的样例。首先引入依赖:

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-1.3B"
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()

提供一个 prompt,描述指定要求生成的图片:

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 的生成方法,自行构建模型中的各层:

@torch.inference_mode()
def generate(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 in range(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 in range(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 != 0 else None)
        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 in range(parallel_size):
        save_path = os.path.join('generated_samples', "img_{}.jpg".format(i))
        PIL.Image.fromarray(visual_img[i]).save(save_path)

完成后,调用 generate 进行生成:

generate(vl_gpt, vl_chat_processor, prompt)


对于 JanusFlow,则可以指定对应的模型,其他使用方法基本保持不变:

model_path = "deepseek-ai/JanusFlow-1.3B"

Janus-Pro 也是类似的,一般来说 Janus-Pro 可能会提供更好的模型效果:

model_path = "deepseek-ai/Janus-Pro-7B"


更多的模型样例,可以参考 Huggingface 的模型下载页面,DeepSeek 提供了不少的在线 demo 可供参考使用。


总结

Janus 项目在多模态理解和生成领域具有重要的应用价值,是 DeepSeek 的武器库中重要的一员。其可以应用于多种场景,如根据文字提供设计稿、理解图片生成文字描述、完成多模态的理解任务等。通过统一的框架,Janus 为多模态任务的处理提供了更加便捷和高效的方式,能在未来的人工智能应用中发挥更大的作用,推动多模态技术的进一步发展。

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: