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

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

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

相关推荐

从IDEA开始,迈进GO语言之门(idea got)

前言笔者在学习GO语言编程的时候,GO语言在国内还没有像JAVA/Php/Python那样普及,绕了不少的弯路,要开始入门学习一门编程语言,最好就先从选择一个好的编程语言的开发环境开始,有了这个开发环...

基于SpringBoot+MyBatis的私人影院java网上购票jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于SpringBoot...

基于springboot的个人服装管理系统java网上商城jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...

基于springboot的美食网站Java食品销售jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...

贸易管理进销存springboot云管货管账分析java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目描述贸易管理进销存spring...

SpringBoot+VUE员工信息管理系统Java人员管理jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍SpringBoot+V...

目前见过最牛的一个SpringBoot商城项目(附源码)还有人没用过吗

帮粉丝找了一个基于SpringBoot的天猫商城项目,快速部署运行,所用技术:MySQL,Druid,Log4j2,Maven,Echarts,Bootstrap...免费给大家分享出来前台演示...

SpringBoot+Mysql实现的手机商城附带源码演示导入视频

今天为大家带来的是基于SpringBoot+JPA+Thymeleaf框架的手机商城管理系统,商城系统分为前台和后台、前台用的是Bootstrap框架后台用的是SpringBoot+JPA都是现在主...

全网首发!马士兵内部共享—1658页《Java面试突击核心讲》

又是一年一度的“金九银十”秋招大热门,为助力广大程序员朋友“面试造火箭”,小编今天给大家分享的便是这份马士兵内部的面试神技——1658页《Java面试突击核心讲》!...

SpringBoot数据库操作的应用(springboot与数据库交互)

1.JDBC+HikariDataSource...

SpringBoot 整合 Flink 实时同步 MySQL

1、需求在Flink发布SpringBoot打包的jar包能够实时同步MySQL表,做到原表进行新增、修改、删除的时候目标表都能对应同步。...

SpringBoot + Mybatis + Shiro + mysql + redis智能平台源码分享

后端技术栈基于SpringBoot+Mybatis+Shiro+mysql+redis构建的智慧云智能教育平台基于数据驱动视图的理念封装element-ui,即使没有vue的使...

Springboot+Mysql舞蹈课程在线预约系统源码附带视频运行教程

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的Springboot+Mysql舞蹈课程在线预约系统,系统项目源代码在【猿来入此】获取!https://www.yuan...

SpringBoot+Mysql在线众筹系统源码+讲解视频+开发文档(参考论文

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的在线众筹管理系统,主要实现了普通用户在线参与众筹基本操作流程的全部功能,系统分普通用户、超级管理员等角色,除基础脚手架外...

Docker一键部署 SpringBoot 应用的方法,贼快贼好用

这两天发现个Gradle插件,支持一键打包、推送Docker镜像。今天我们来讲讲这个插件,希望对大家有所帮助!GradleDockerPlugin简介...

取消回复欢迎 发表评论: