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

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

ztj100 2025-02-11 14:27 37 浏览 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 为多模态任务的处理提供了更加便捷和高效的方式,能在未来的人工智能应用中发挥更大的作用,推动多模态技术的进一步发展。

相关推荐

Vue3非兼容变更——函数式组件(vue 兼容)

在Vue2.X中,函数式组件有两个主要应用场景:作为性能优化,因为它们的初始化速度比有状态组件快得多;返回多个根节点。然而在Vue3.X中,有状态组件的性能已经提高到可以忽略不计的程度。此外,有状态组...

利用vue.js进行组件化开发,一学就会(一)

组件原理/组成组件(Component)扩展HTML元素,封装可重用的代码,核心目标是为了可重用性高,减少重复性的开发。组件预先定义好行为的ViewModel类。代码按照template\styl...

Vue3 新趋势:10 个最强 X 操作!(vue.3)

Vue3为前端开发带来了诸多革新,它不仅提升了性能,还提供了...

总结 Vue3 组件管理 12 种高级写法,灵活使用才能提高效率

SFC单文件组件顾名思义,就是一个.vue文件只写一个组件...

前端流行框架Vue3教程:17. _组件数据传递

_组件数据传递我们之前讲解过了组件之间的数据传递,...

前端流行框架Vue3教程:14. 组件传递Props效验

组件传递Props效验Vue组件可以更细致地声明对传入的props的校验要求...

前端流行框架Vue3教程:25. 组件保持存活

25.组件保持存活当使用...

5 个被低估的 Vue3 实战技巧,让你的项目性能提升 300%?

前端圈最近都在卷性能优化和工程化,你还在用老一套的Vue3开发方法?作为摸爬滚打多年的老前端,今天就把私藏的几个Vue3实战技巧分享出来,帮你在开发效率、代码质量和项目性能上实现弯道超车!一、...

绝望!Vue3 组件频繁崩溃?7 个硬核技巧让性能暴涨 400%!

前端的兄弟姐妹们五一假期快乐,谁还没在Vue3项目上栽过跟头?满心欢喜写好的组件,一到实际场景就频频崩溃,页面加载慢得像蜗牛,操作卡顿到让人想砸电脑。用户疯狂吐槽,领导脸色难看,自己改代码改到怀疑...

前端流行框架Vue3教程:15. 组件事件

组件事件在组件的模板表达式中,可以直接使用...

Vue3,看这篇就够了(vue3 从入门到实战)

一、前言最近很多技术网站,讨论的最多的无非就是Vue3了,大多数都是CompositionAPI和基于Proxy的原理分析。但是今天想着跟大家聊聊,Vue3对于一个低代码平台的前端更深层次意味着什么...

前端流行框架Vue3教程:24.动态组件

24.动态组件有些场景会需要在两个组件间来回切换,比如Tab界面...

前端流行框架Vue3教程:12. 组件的注册方式

组件的注册方式一个Vue组件在使用前需要先被“注册”,这样Vue才能在渲染模板时找到其对应的实现。组件注册有两种方式:全局注册和局部注册...

焦虑!Vue3 组件频繁假死?6 个奇招让页面流畅度狂飙 500%!

前端圈的朋友们,谁还没在Vue3项目上踩过性能的坑?满心期待开发出的组件,一到高并发场景就频繁假死,用户反馈页面点不动,产品经理追着问进度,自己调试到心态炸裂!别以为这是个例,不少人在电商大促、数...

前端流行框架Vue3教程:26. 异步组件

根据上节课的代码,我们在切换到B组件的时候,发现并没有网络请求:异步组件:...

取消回复欢迎 发表评论: