Emu3:开启多模态人工智能新纪元 —— 视频、图像、文本三合一模型
随着人工智能技术的不断进步,人们对能够处理多种模态数据的模型需求日益增长。图像、文本和视频作为三种主要的信息载体,各自具有独特的优势和特点。然而,传统的人工智能模型往往只能处理单一类型的数据,无法充分发挥多模态数据的潜力。为了打破这一局限,北京智源人工智能研究院的科研团队经过不懈努力,成功研发出了 Emu3 原生多模态世界模型。
一、Emu3 的技术特点
1. 多模态统一理解与生成
Emu3 实现了视频、图像、文本三种模态的统一理解与生成。这意味着它可以同时处理和关联不同模态的数据,从而更好地理解和模拟物理世界。例如,当给定一段文本描述时,Emu3 可以生成相应的图像或视频;反之,当输入一张图像或一段视频时,它也能够生成准确的文本描述。这种多模态的交互能力为人工智能在各个领域的应用提供了更广阔的空间。
2. 创新的技术架构
Emu3 只基于下一个 token 预测,无需扩散模型或组合式方法。它将图像、文本和视频编码为一个离散空间,在多模态混合序列上从头开始联合训练一个 transformer 模型。这种创新的架构设计不仅简化了模型的复杂性,还提高了模型的灵活性和效率。同时,它也为多模态人工智能的发展提供了新的思路和方法。
3. 卓越的性能表现
在图像生成、视觉语言理解、视频生成任务中,Emu3 的表现超过了 SDXL、LLava - 1.6、OpenSORA 等知名开源模型。这充分证明了 Emu3 在多模态处理方面的强大实力。例如,在图像生成任务中,Emu3 能够生成更加逼真、细腻的图像,细节丰富度和色彩还原度都达到了很高的水平;在视觉语言理解任务中,它能够准确地理解图像中的内容,并生成与之对应的文本描述;在视频生成任务中,它可以生成高质量、流畅的视频,具有很高的视觉效果和艺术价值。
二、Emu3 的应用前景
1. 机器人大脑
Emu3 的多模态处理能力可以为机器人提供更加智能的大脑。通过对图像、文本和视频的综合理解,机器人可以更好地感知周围环境,与人类进行更加自然的交互,并执行更加复杂的任务。例如,在家庭服务机器人中,Emu3 可以帮助机器人识别不同的物品、理解人类的指令,并根据环境变化做出相应的反应。
2. 自动驾驶
在自动驾驶领域,Emu3 可以通过对摄像头拍摄的图像和视频进行实时分析,识别道路标志、车辆和行人等物体,并预测它们的运动轨迹。同时,它还可以结合地图信息和交通规则等文本数据,为自动驾驶系统提供更加准确的决策依据。这将大大提高自动驾驶的安全性和可靠性。
3. 多模态对话和推理
Emu3 可以应用于多模态对话和推理系统中,实现更加自然、智能的人机交互。例如,在智能客服领域,它可以通过对用户的语音、图像和文本输入进行综合分析,理解用户的问题,并给出准确的回答;在智能教育领域,它可以根据学生的学习情况和需求,生成个性化的教学内容和辅导方案。
三、Emu3 本地部署实践
1、克隆代码
git clone https://github.com/baaivision/Emu3
2、安装依赖
cd Emu3
pip install -r requirements.txt
3、模型推理
使用Transformers运行Emu3-Gen/Stage1进行图像生成
from PIL import Image
from transformers import AutoTokenizer, AutoModel, AutoImageProcessor, AutoModelForCausalLM
from transformers.generation.configuration_utils import GenerationConfig
from transformers.generation import LogitsProcessorList, PrefixConstrainedLogitsProcessor, UnbatchedClassifierFreeGuidanceLogitsProcessor
import torch
from emu3.mllm.processing_emu3 import Emu3Processor
# model path
EMU_HUB = "BAAI/Emu3-Gen"
VQ_HUB = "BAAI/Emu3-VisionTokenizer"
# prepare model and processor
model = AutoModelForCausalLM.from_pretrained(
EMU_HUB,
device_map="cuda:0",
torch_dtype=torch.bfloat16,
attn_implementatinotallow="flash_attention_2",
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained(EMU_HUB, trust_remote_code=True, padding_side="left")
image_processor = AutoImageProcessor.from_pretrained(VQ_HUB, trust_remote_code=True)
image_tokenizer = AutoModel.from_pretrained(VQ_HUB, device_map="cuda:0", trust_remote_code=True).eval()
processor = Emu3Processor(image_processor, image_tokenizer, tokenizer)
# prepare input
POSITIVE_PROMPT = " masterpiece, film grained, best quality."
NEGATIVE_PROMPT = "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry."
classifier_free_guidance = 3.0
prompt = "a portrait of young girl."
prompt += POSITIVE_PROMPT
kwargs = dict(
mode='G',
ratio="1:1",
image_area=model.config.image_area,
return_tensors="pt",
padding="longest",
)
pos_inputs = processor(text=prompt, **kwargs)
neg_inputs = processor(text=NEGATIVE_PROMPT, **kwargs)
# prepare hyper parameters
GENERATION_CONFIG = GenerationConfig(
use_cache=True,
eos_token_id=model.config.eos_token_id,
pad_token_id=model.config.pad_token_id,
max_new_tokens=40960,
do_sample=True,
top_k=2048,
)
h = pos_inputs.image_size[:, 0]
w = pos_inputs.image_size[:, 1]
constrained_fn = processor.build_prefix_constrained_fn(h, w)
logits_processor = LogitsProcessorList([
UnbatchedClassifierFreeGuidanceLogitsProcessor(
classifier_free_guidance,
model,
unconditional_ids=neg_inputs.input_ids.to("cuda:0"),
),
PrefixConstrainedLogitsProcessor(
constrained_fn ,
num_beams=1,
),
])
# generate
outputs = model.generate(
pos_inputs.input_ids.to("cuda:0"),
GENERATION_CONFIG,
logits_processor=logits_processor,
attention_mask=pos_inputs.attention_mask.to("cuda:0"),
)
mm_list = processor.decode(outputs[0])
for idx, im in enumerate(mm_list):
if not isinstance(im, Image.Image):
continue
im.save(f"result_{idx}.png")
使用Transformers运行Emu3-Chat/Stage1以实现视觉语言理解
from PIL import Image
from transformers import AutoTokenizer, AutoModel, AutoImageProcessor, AutoModelForCausalLM
from transformers.generation.configuration_utils import GenerationConfig
import torch
from emu3.mllm.processing_emu3 import Emu3Processor
# model path
EMU_HUB = "BAAI/Emu3-Chat"
VQ_HUB = "BAAI/Emu3-VisionTokenier"
# prepare model and processor
model = AutoModelForCausalLM.from_pretrained(
EMU_HUB,
device_map="cuda:0",
torch_dtype=torch.bfloat16,
attn_implementatinotallow="flash_attention_2",
trust_remote_code=True,
)
# used for Emu3-Chat
tokenizer = AutoTokenizer.from_pretrained(EMU_HUB, trust_remote_code=True, padding_side="left")
# used for Emu3-Stage1
# tokenizer = AutoTokenizer.from_pretrained(
# EMU_HUB,
# trust_remote_code=True,
# chat_template="{image_prompt}{text_prompt}",
# padding_side="left",
# )
image_processor = AutoImageProcessor.from_pretrained(VQ_HUB, trust_remote_code=True)
image_tokenizer = AutoModel.from_pretrained(VQ_HUB, device_map="cuda:0", trust_remote_code=True).eval()
processor = Emu3Processor(image_processor, image_tokenizer, tokenizer)
# prepare input
text = "Please describe the image"
image = Image.open("assets/demo.png")
inputs = processor(
text=text,
image=image,
mode='U',
return_tensors="pt",
padding="longest",
)
# prepare hyper parameters
GENERATION_CONFIG = GenerationConfig(
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
max_new_tokens=1024,
)
# generate
outputs = model.generate(
inputs.input_ids.to("cuda:0"),
GENERATION_CONFIG,
attention_mask=pos_inputs.attention_mask.to("cuda:0"),
)
outputs = outputs[:, inputs.input_ids.shape[-1]:]
print(processor.batch_decode(outputs, skip_special_tokens=True)[0])
四、结语
Emu3 作为北京智源人工智能研究院推出的原生多模态世界模型,代表了人工智能领域的一次重大突破。它的多模态统一理解与生成能力、创新的技术架构和卓越的性能表现,为我们展示了人工智能未来的发展方向。虽然它还面临着一些挑战,但随着技术的不断进步和完善,相信 Emu3 将在机器人大脑、自动驾驶、多模态对话和推理等领域发挥重要作用,为我们的生活带来更多的便利和创新。
相关资料
github地址:https://github.com/baaivision/Emu3
Emu3-VisionTokenizer模型:https://modelscope.cn/models/BAAI/Emu3-VisionTokenizer
Emu3-Gen模型:https://modelscope.cn/models/BAAI/Emu3-Gen
Emu3-Chat模型:https://modelscope.cn/models/BAAI/Emu3-Chat
本文转载自小兵的AI视界,作者: 小兵