Lihi Gur Arie, 博士
发布于 Towards Data Science | 阅读时间:约7分钟 | 发布日期:2024年12月5日
Medium 主页
Towards Data Science 官方网站
–
towardsdatascience.com/chat-with-your-images-using-multimodal-llms-60af003e8bfa?source=collection_archive---------3-----------------------#2024-12-05
引言:开启多模态对话新时代
随着多模态大型语言模型(MLLM)的发展,视觉与语言的融合正在深刻改变计算机视觉的应用边界。这类模型能够同时处理文本和图像输入,在图像理解、推理以及OCR等任务中展现出卓越的能力。过去,这些先进模型大多仅通过API提供服务,但如今越来越多的开源版本支持本地部署,极大提升了其在实际生产环境中的可用性与灵活性。
本文将带你一步步实现如何在本地环境中以聊天方式运行 Llama 3.2-Vision 模型,并通过 Google Colab 笔记本探索其强大的多模态能力。所有代码均已整理至一个便捷的 Colab 项目中,方便快速上手。
*提示:若你没有付费的 Medium 账户,也可通过提供的链接免费阅读完整内容。*
Llama 3.2-Vision 简介
Llama 是由 Meta 开发的一系列前沿大语言模型(Large Language Model Meta AI 的缩写)。最新发布的 Llama 3.2 版本引入了先进的视觉功能,推出了两个参数规模的视觉变体:11B 和 90B,适用于边缘设备上的高效推理。该模型支持高达 128k token 的上下文长度,并可处理分辨率最高达 1120x1120 像素的图像,使其能够应对复杂的图文混合任务。
技术架构解析
Llama 系列基于仅解码器结构的 Transformer 架构设计,而 Llama 3.2-Vision 则在此基础上扩展了视觉处理能力。它以预训练的 Llama 3.1 文本模型为核心,保持其语言能力不变,同时集成外部视觉模块。
具体而言,系统采用一个预训练的视觉编码器(ViT-H/14)来提取图像特征向量,并通过一个专门设计的视觉适配器将这些特征注入到冻结的语言模型中。该适配器由多个交叉注意力层构成,使模型能聚焦于图像中与当前文本描述相关的区域 [1]。
在训练过程中,适配器和视觉编码器共同在大量图文对数据上进行优化,以实现图像表示与语言空间的有效对齐;与此同时,原始语言模型的权重被固定,确保其原有的文本生成与理解能力不受影响。
messages
图示说明:Llama 3.2-Vision 架构示意图。绿色部分为视觉处理模块,粉色部分为固定的语言模型。图片由作者绘制。
这种“冻结主干+插入适配器”的策略,既保留了 LLM 强大的语言能力,又赋予其出色的多模态交互性能,使得用户可以像聊天一样与图像进行自然互动。
动手实践前的准备工作
在正式进入编码环节之前,我们需要完成以下几项基础配置,以确保 Llama 3.2-Vision 能够顺利运行:
- GPU 环境设置:
推荐使用至少具备 22GB 显存的高性能 GPU 进行推理 [2]。
对于 Google Colab 用户,请前往菜单栏选择 ‘运行时’ → ‘更改运行时类型’ → 选择 ‘A100 GPU’。请注意,此类高端资源可能不向免费账户开放。 - 获取模型访问权限:
由于 Llama 3.2 属于受限开源模型,需先前往官方页面申请使用权限。
申请地址:点击此处请求访问 - Hugging Face 账户配置:
若尚未注册 Hugging Face 账号,请先完成注册:创建账号。
登录后,请生成一个访问令牌(Access Token),用于后续模型下载认证:生成 Token
让我们开始编码吧!
一旦完成了上述环境准备,我们就可以进入真正的实现阶段。接下来的内容将在 Colab 笔记本中逐步展开,涵盖从模型加载、图像输入处理到多轮对话生成的全流程操作,敬请期待后续步骤。
对于使用 Google Colab 的用户,建议将 Hugging Face 的访问令牌配置为名为 'HF_TOKEN' 的秘密环境变量,并将其添加至 Google Colab Secrets 中,以实现安全的身份验证。
接下来,安装项目所依赖的相关库文件。
模型加载流程
在完成环境配置并获取相应权限后,我们将借助 Hugging Face 的 Transformers 库来加载预训练模型及其配套的处理器。该处理器的作用在于对输入数据进行适配性处理,并将模型输出转换为易于理解的格式。
model_id = "meta-llama/Llama-3.2-11B-Vision-Instruct"
model = MllamaForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto"
)
processor = AutoProcessor.from_pretrained(model_id)
messages
聊天模板结构说明
聊天模板用于维护“用户”与“助手”(即 AI 模型)之间的对话上下文。整个对话历史被组织成一个字典列表,每个字典代表一次交互回合,包含用户提问和模型回复的内容。用户的输入可以是图文混合或纯文本形式,其中图像输入通过特定标记表示。
{"type": "image"}
举例来说,在经历多轮对话之后,该消息列表可能呈现如下结构:
messages = [
{"role": "user", "content": [{"type": "image"}, {"type": "text", "text": prompt1}]},
{"role": "assistant", "content": [{"type": "text", "text": generated_texts1}]},
{"role": "user", "content": [{"type": "text", "text": prompt2}]},
{"role": "assistant", "content": [{"type": "text", "text": generated_texts2}]},
{"role": "user", "content": [{"type": "text", "text": prompt3}]},
{"role": "assistant", "content": [{"type": "text", "text": generated_texts3}]}
]
apply_chat_template()
此消息序列最终会传入特定的处理方法中,自动转化为模型可识别的格式,形成一个连续的、可分词的字符串输入。
核心功能实现
本教程提供了一个名为 chat_with_mllm 的函数,旨在支持与 Llama 3.2 多模态大模型(MLLM)进行持续互动。该函数集成了图像读取、输入预处理、响应生成以及对话历史管理等功能,便于实现多轮聊天体验。
chat_with_mllm
def chat_with_mllm(model, processor, prompt, images_path=[], do_sample=False, temperature=0.1, show_image=False, max_new_tokens=512, messages=[], images=[]):
# 确保输入为列表形式
if not isinstance(images_path, list):
images_path = [images_path]
# 加载图像
if len(images) == 0 and len(images_path) > 0:
for image_path in tqdm(images_path):
image = load_image(image_path)
images.append(image)
if show_image:
display(image)
# 若为首次基于图像发起对话
if len(messages) == 0:
messages = [{"role": "user", "content": [{"type": "image"}, {"type": "text", "text": prompt}]}]
# 若为继续当前图像的对话
else:
messages.append({"role": "user", "content": [{"type": "text", "text": prompt}]})
# 处理输入数据
text = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(images=images, text=text, return_tensors="pt").to(model.device)
# 生成模型输出
generation_args = {"max_new_tokens": max_new_tokens, "do_sample": True}
if do_sample:
generation_args["temperature"] = temperature
generate_ids = model.generate(**inputs, **generation_args)
generate_ids = generate_ids[:, inputs['input_ids'].shape[1]:-1]
generated_texts = processor.decode(generate_ids[0], clean_up_tokenization_spaces=False)
# 将模型的回复添加到对话历史中
messages.append({"role": "assistant", "content": [{"type": "text", "text": generated_texts}]})
return generated_texts, messages, images
与 Llama 进行图像对话
在首个示例中,我们将使用一张关于蝴蝶孵化过程的图片与 Llama 3.2 模型进行交互。由于 Llama 3.2-Vision 当前不支持系统提示(system prompt)的独立输入,因此我们需将指令直接嵌入用户提示中,以引导模型生成符合预期的回答。
通过配置以下参数:
do_sample=True
以及:
temperature=0.2
可以在确保回答连贯的前提下引入适度的随机性。若希望获得完全确定性的输出结果,可将采样关闭,并设定如下参数:
do_sample==False
其中,用于保存对话上下文的变量
messages 初始为空列表,与存储图像数据的 images 参数相同,在会话开始时均未包含任何内容。
具体实现代码如下:
instructions = "Respond concisely in one sentence."
prompt = instructions + "Describe the image."
response, messages, images = chat_with_mllm(
model, processor, prompt,
images_path=[img_path],
do_sample=True,
temperature=0.2,
show_image=True,
messages=[],
images=[]
)
模型返回结果为:
"The image depicts a butterfly emerging from its chrysalis, with a row of chrysalises hanging from a branch above it."
图片来源:点击查看原图(由 Pixabay 提供)
可以看出,模型不仅准确识别了图像内容,还能以简洁的语言完成描述,体现出其强大的视觉理解能力。
接下来进入第二轮对话。此时我们不再重新初始化历史记录,而是传入更新后的提示语、保留完整的聊天历史
messages 以及已加载的图像数据 images,旨在测试 Llama 3.2 的推理水平。
新提示设置如下:
prompt = instructions + "What would happen to the chrysalis in the near future?"
调用函数继续交互:
response, messages, images = chat_with_mllm(
model, processor, prompt,
images_path=[img_path],
do_sample=True,
temperature=0.2,
show_image=False,
messages=messages,
images=images
)
模型输出为:
"The chrysalis will eventually hatch into a butterfly."
该回答展现了模型基于图像内容进行合理推断的能力。我们在配套的 Colab 笔记本中延续此轮对话流程,逐步构建多轮视觉问答交互。
在本教程中,我们深入了解了多模态大语言模型 Llama 3.2-Vision 的实际应用,展示了其在本地部署与交互式对话管理中的强大能力。通过构建完整的聊天流程,我们不仅实现了图像理解功能,还有效维护了对话历史,显著提升了用户体验和互动深度。
接下来,我们重点测试了该模型在零样本(zero-shot)场景下的表现,尤其是在视觉理解方面的多项关键技能:包括对复杂场景的准确描述、逻辑推理能力以及光学字符识别(OCR)的表现。
towardsdatascience.com/chat-with-your-images-using-multimodal-llms-60af003e8bfa?source=collection_archive---------3-----------------------#2024-12-05
上图由作者提供,展示了一段对话输出结果。从内容可以看出,模型精准地识别并描述了图像中的自然场景,并基于已有信息进行合理推断——例如预测蛹将经历的变化过程。同时,它还能解释为何部分蛹呈现棕色而另一些为绿色,体现出较强的因果推理能力。
2. 表情包图像理解示例
为了进一步评估模型的 OCR 能力及其对语义幽默的理解水平,我向其展示了一个自制的表情包。以下是调用模型时所使用的提示设置:
instructions = "You are a computer vision engineer with sense of humor."
prompt = instructions + "Can you explain this meme to me?"
response, messages, images = chat_with_mllm(model, processor, prompt,
images_path=[img_path,],
do_sample=True,
temperature=0.5,
show_image=True,
messages=[],
images=[])
输入的表情包如下所示:
messages
该表情包由作者创作,原始熊的图像来源于 Hans-Jurgen Mager。
模型返回的回应如下:
{"type": "image"}
如图所示,模型成功提取并解读了图像中的文字内容,展现出优秀的 OCR 性能。而对于幽默感的理解——你觉得它get到笑点了么?你是否也觉得好笑?或许,我的幽默确实还有提升空间!
结语
总体而言,本次实践让我们亲身体验了 Llama 3.2-Vision 在多模态任务中的出色表现。无论是场景解析、文本识别还是跨模态推理,该模型都展现了高度的智能与灵活性。
未来,我们还可以在此基础上引入更高级的技术手段,比如在特定领域数据上进行微调(fine-tuning),或结合检索增强生成(RAG)技术来提高回答准确性,减少幻觉现象的发生。
本教程为你打开了一扇通往多模态大模型世界的大门,揭示了这类系统在现实应用中的巨大潜力。
感谢阅读!
恭喜你坚持到了最后!点击????x50 给我一点鼓励,顺便提升一下算法的自尊心????
想了解更多?
查阅我撰写的其他文章
订阅通知,以便在我发布新内容时第一时间获取更新
在 Linkedin 上关注我
完整代码资源:
已整理为 Colab 笔记本,方便复现与实验
参考文献
[0] Colab 笔记本上的代码:link
[1] Llama 3 模型群体
[2] Llama 3.2 11B Vision 运行要求


雷达卡


京公网安备 11010802022788号







