基于MLLM统一编码的跨模态菜谱图像检索:从特征匹配到语义理解

📅 2026/6/22 1:35:08
基于MLLM统一编码的跨模态菜谱图像检索:从特征匹配到语义理解
1. 从“看图找菜”到“理解美食”为什么我们需要SIMMER每次在社交媒体上刷到一张让人垂涎欲滴的美食图片你是不是也和我一样脑子里会立刻蹦出几个问题“这到底是什么菜”“怎么做出来的”“家里现有的食材能复刻吗”这种“看图找菜”的需求在美食社区、菜谱App和短视频平台里几乎每天都在发生。传统的图像检索技术比如用卷积神经网络CNN提取图片特征然后去数据库里找相似的图片在这个场景下就显得有点力不从心了。它可能能找到一张“看起来像”的图片比如都是红色的、有肉的但它很难理解这张图片背后复杂的语义信息这是一道“糖醋排骨”还是“红烧肉”是“川菜”还是“本帮菜”烹饪方法是“红烧”还是“油炸”更别提去理解用户可能用自然语言描述的、更抽象的需求了比如“我想找一道适合夏天吃的、清爽的、有虾的菜”。这就是跨模态检索要解决的核心问题让机器能像人一样打通视觉看到的图片和语言读到的文字之间的鸿沟实现真正的“理解”和“匹配”。而SIMMER基于MLLM统一编码的跨模态菜谱图像检索新范式的出现正是为了解决这个痛点。它不再是把图片和文字当成两种完全不同的数据用两套独立的模型去处理而是借助近年来大放异彩的多模态大语言模型MLLM将它们统一到一个共同的“语义空间”里进行编码和理解。简单来说SIMMER试图让AI学会用同一种“语言”去“思考”图片和文字从而做出更精准、更符合人类直觉的匹配。这不仅仅是技术上的一个改进更是对“美食信息检索”这件事认知方式的一次升级——从“特征匹配”走向“语义理解”。2. 拆解SIMMER统一编码范式如何颠覆传统检索流程要理解SIMMER的价值我们得先看看传统的跨模态检索是怎么做的。通常这类系统会采用一个“双塔”架构一个塔通常是CNN或Vision Transformer负责处理图像提取视觉特征向量另一个塔通常是BERT或类似的文本编码器负责处理文本提取文本特征向量。然后在训练阶段通过设计一个损失函数比如对比学习损失让匹配的图文对的特征向量在向量空间里靠得更近不匹配的则推得更远。推理时给定一张查询图片就计算它的特征向量与数据库中所有文本特征向量的相似度然后排序返回。这个流程听起来合理但存在几个固有的瓶颈特征异构性图像和文本的特征来自两个完全不同的模型尽管在向量空间里被拉近了但它们本质上是“异质”的对齐过程存在信息损失。交互滞后特征提取阶段图文信息是完全独立处理的缺乏早期的、深层次的交互。模型是在“事后”才尝试让它们匹配而不是在“理解”阶段就进行融合。语义粒度不匹配图像编码器可能更关注颜色、纹理等低级特征而文本编码器关注的是词序和语法。对于“微辣”、“入口即化”这类需要深度融合视觉与语言知识才能理解的抽象语义传统方法很难捕捉。SIMMER提出的“基于MLLM的统一编码”范式正是针对这些瓶颈的“釜底抽薪”之策。它的核心思想可以用一个类比来理解传统方法是让一个懂中文的人和一个懂英文的人各自描述一件事物然后找一个翻译来比较这两段描述是否一致而SIMMER是直接培养一个“双语通才”让他能用一种内部的中介语言即MLLM的隐层表示同时理解中文和英文的输入并在这个统一的认知框架下进行判断。具体到架构上SIMMER很可能采用以下设计统一的编码骨干直接使用一个预训练好的MLLM例如BLIP-2、Flamingo、或基于LLaVA架构的模型作为核心编码器。这类模型通常由一个视觉编码器如ViT、一个文本编码器如LLM的嵌入层和一个至关重要的、负责跨模态融合的“连接器”Q-Former 感知器重采样器等组成。端到端的特征提取对于一张查询图片和一段候选文本菜谱描述不再分开处理。而是将图片和文本一起输入MLLM。模型内部视觉特征会被转换成一系列“视觉令牌”与文本令牌一起送入融合模块进行深度交互。最终模型会输出一个综合了图文信息的、统一的特征表示。检索即生成或检索即匹配一种典型的SIMMER实现方式是将检索任务重新定义为一种“生成”或“匹配”任务。例如给定图片让MLLM直接生成对应的菜名或关键描述词生成式或者让模型输出一个统一的[CLS]令牌向量用于计算图文之间的相似度匹配式。无论是哪种其特征都是在深度交互后产生的天然具有对齐性。这种范式转变带来的优势是显而易见的由于在模型内部早期就进行了跨模态融合模型对图文之间细粒度的语义关联如“金黄酥脆”对应特定的油炸色泽和质地有了更强的建模能力。它不再只是“看起来像”而是开始“理解为什么像”。3. MLLM撑起统一编码范式的“超级大脑”SIMMER范式的基石毫无疑问是多模态大语言模型。要理解SIMMER为什么能工作我们必须深入看看MLLM为它提供了哪些传统模型不具备的能力。3.1 MLLM的核心能力解构MLLM可以看作是在大规模语言模型LLM的“通用知识”和“推理能力”基础上嫁接了一个“视觉理解”的模块。它的能力是复合型的强大的视觉语义化能力传统的视觉模型能识别物体碗、筷子、肉但MLLM能描述场景“这是一桌丰盛的家常菜中间是一盆冒着热气的酸菜鱼”甚至能推断属性“这盘排骨颜色红亮汤汁浓稠应该是收汁收得很好”。这对于菜谱检索至关重要因为菜谱的关键信息往往不在物体本身而在其状态切丝、整块、处理方式焯水、腌制、和最终呈现摆盘、光泽。丰富的常识与领域知识一个优秀的MLLM在预训练时“阅读”了海量的互联网文本其中包含海量的美食相关知识和生活常识。它知道“麻婆豆腐”通常是麻辣的“提拉米苏”含有咖啡酒味“白灼”是一种追求原汁原味的烹饪手法。这种知识让它能理解文本菜谱中隐含的、未在图片中直接呈现的信息。零样本/少样本迁移能力得益于在超大规模多模态数据上的训练MLLM对于未在训练集中出现过的菜式或描述也具备一定的理解和泛化能力。比如即使训练数据中没有“冰萃咖啡配巴斯克芝士蛋糕”这个组合模型也能根据对“冰萃咖啡”视觉上清澈、有冰块和“巴斯克芝士蛋糕”视觉上焦黑表面、绵密质地的分别理解进行合理的匹配。3.2 在SIMMER中MLLM如何被使用在实际的SIMMER系统设计中MLLM的用法可能有几种作为特征提取器冻结或微调将MLLM作为一个强大的“特征生产工厂”。输入图片和文本取用MLLM中间某一层通常是融合层之后的[CLS]令牌向量或所有令牌向量的均值池化结果作为该图文对的统一特征表示。之后这些特征被送入一个简单的对比学习或度量学习框架中进行检索训练。这种方式计算效率相对较高但可能无法充分发挥MLLM的端到端优化潜力。作为匹配评分器设计一个提示词Prompt例如“图片[IMG] 描述[TEXT]。请问这张图片是否是描述中的菜请只回答‘是’或‘不是’。” 然后将MLLM对“是”这个token的预测概率作为图文匹配的得分。这种方式直接利用了MLLM的推理和判断能力非常直观但推理速度较慢且对提示工程敏感。作为描述生成器检索这是一个两阶段方法。首先用MLLM为每张图片生成一段详细的文本描述例如“这是一道色泽红亮的肉类菜肴表面有粘稠的酱汁配有白芝麻点缀疑似红烧或照烧口味”。然后在文本-文本的范畴内用传统的文本检索技术如BM25或向量检索来匹配用户查询可能是文本或生成的描述与菜谱文本。这种方法将跨模态问题转化为了单模态问题简化了流程但生成描述的质量和完整性直接决定了检索上限。注意在实际研究和工程中第一种特征提取器和第三种生成器的结合或变体更为常见。直接使用第二种匹配评分器进行大规模数据库检索目前成本还太高。4. 实战推演构建一个简易SIMMER检索系统的关键步骤理解了原理我们不妨动手推演一下如何利用现有的开源工具搭建一个简易版的SIMMER风格菜谱检索系统。这里我们选择“MLLM作为特征提取器”这条相对成熟的路径。4.1 环境准备与模型选型首先我们需要选择一个合适的、开源的MLLM作为我们的统一编码器。目前社区有几个热门选择BLIP-2由Salesforce Research提出采用一个轻量级的Q-Former作为视觉与语言模型之间的“桥梁”效果强劲且模型相对高效。它提供了多种尺寸的预训练模型是一个理想的起点。LLaVA一个将CLIP视觉编码器与Vicuna等开源LLM连接起来的项目以其出色的指令跟随和对话能力闻名。对于需要复杂推理的检索任务LLaVA可能更有优势。OpenFlamingoMeta Flamingo模型的开源复现以其出色的少样本学习能力著称适合数据有限的场景。对于菜谱检索这个具体任务BLIP-2可能是一个更平衡的选择因为它在视觉-语言对齐任务上表现稳定且推理速度相对较快。我们假设选择blip2-opt-2.7b这个版本。# 环境依赖安装示例 pip install torch torchvision transformers accelerate pip install salesforce-lavis # BLIP-2官方库4.2 数据预处理与特征库构建假设我们有一个菜谱数据集每条数据包含一张菜品图片和一个对应的文本描述可以是菜名、食材、做法摘要。import torch from PIL import Image from lavis.models import load_model_and_preprocess # 1. 加载模型和处理器 device torch.device(cuda if torch.cuda.is_available() else cpu) model, vis_processors, txt_processors load_model_and_preprocess( nameblip2_opt, model_typepretrain_opt2.7b, is_evalTrue, devicedevice ) # 我们不需要文本生成只需要特征所以可以只使用编码部分 # 2. 定义一个特征提取函数 def extract_unified_feature(image_path, text): 提取图片和文本的统一特征向量。 注意这里我们模拟SIMMER思想但BLIP-2原生的提取方式可能仍需分别编码。 一种实现方式是将图文拼接成模型可接受的输入格式取融合后的特征。 更简单的实践是分别提取视觉和文本特征然后在后期用简单网络融合非严格统一编码但易于实现。 为演示统一编码思想我们假设使用模型的‘multimodal_encoder’来获取融合特征。 # 处理图像 raw_image Image.open(image_path).convert(RGB) image vis_processors[eval](raw_image).unsqueeze(0).to(device) # 处理文本 text_input txt_processors[eval](text) # 关键步骤如何获取“统一”特征 # BLIP-2的forward函数可以通过设置use_itm_headTrue来获取图文匹配分数及其对应的特征。 # 我们可以利用这个机制。 with torch.no_grad(): # 这里我们使用ITMImage-Text Matching头来获取融合后的特征 # 注意需要查看Lavis库的具体API以下为示意代码 itm_output model(image, text_input, match_headitm) # 示意实际API可能不同 # itm_output 可能包含[CLS] token的隐藏状态可作为统一特征 unified_feature itm_output.last_hidden_state[:, 0, :] # 取[CLS] token unified_feature torch.nn.functional.normalize(unified_feature, p2, dim-1) # L2归一化便于后续计算余弦相似度 return unified_feature.cpu().numpy() # 3. 遍历数据集构建特征库和索引 import numpy as np from tqdm import tqdm all_features [] all_recipe_ids [] all_descriptions [] for recipe in tqdm(recipe_dataset): feat extract_unified_feature(recipe[image_path], recipe[description]) all_features.append(feat) all_recipe_ids.append(recipe[id]) all_descriptions.append(recipe[description]) feature_matrix np.vstack(all_features) # 形状: [N, D] # 保存特征库 np.save(recipe_unified_features.npy, feature_matrix) with open(recipe_meta.pkl, wb) as f: import pickle pickle.dump({ids: all_recipe_ids, descriptions: all_descriptions}, f)4.3 检索流程实现特征库建好后检索就变成了一个最近邻搜索问题。import faiss # 高效的相似性搜索库 # 1. 构建FAISS索引 dimension feature_matrix.shape[1] index faiss.IndexFlatIP(dimension) # 使用内积余弦相似度因为特征已归一化 index.add(feature_matrix) # 2. 定义检索函数 def retrieve_recipes(query_image_path, top_k5): # 提取查询图片的特征这里需要模拟一个“查询文本”可以是一个空字符串或固定提示取决于模型输入要求 # 更合理的SIMMER方式如果查询是纯图片我们可以用模型生成一个描述或者用一个固定的“查询文本”如“这是一道菜”来配对。 query_text a photo of a dish # 一个通用的文本提示与图片配对形成统一查询 query_feat extract_unified_feature(query_image_path, query_text) # 搜索 distances, indices index.search(query_feat, top_k) # 返回结果 results [] for dist, idx in zip(distances[0], indices[0]): recipe_id all_recipe_ids[idx] description all_descriptions[idx] results.append({id: recipe_id, description: description, score: dist}) return results # 3. 使用示例 query_img path_to_your_query_dish.jpg top_results retrieve_recipes(query_img, top_k3) for res in top_results: print(fID: {res[id]}, Score: {res[score]:.4f}, Desc: {res[description][:50]}...)4.4 关键细节与避坑指南文本提示的敏感性在提取查询特征时使用的“查询文本”对结果影响很大。“a photo of a dish”、“a delicious food”、“”空字符串可能会得到不同的特征表示。需要进行小规模实验来确定最适合你数据集的提示词。这本质上是将部分“检索意图”通过提示词注入模型。特征归一化是必须的计算余弦相似度前务必对特征向量进行L2归一化。FAISS的IndexFlatIP内积在向量归一化后等价于余弦相似度计算效率高。批量处理以提升效率构建特征库时务必使用批量推理batch inference来大幅提升处理速度。修改extract_unified_feature函数以支持批量输入。MLLM的微调预训练的MLLM虽然强大但可能对美食领域的特异性如特殊的食材名称、烹饪术语理解不足。如果拥有足够多的标注数据图文对可以考虑在菜谱数据上对MLLM进行轻量级的微调例如只微调Q-Former和连接层这能显著提升检索精度。这就是将通用MLLM“领域化”的过程。负样本的构建如果进行端到端训练而不仅仅是特征提取构建高质量的负样本不匹配的图文对至关重要。简单的随机负采样可能不够“难”可以采用“难负例挖掘”策略例如选择同一道菜的不同图片的文本作为负样本标题相同但内容不匹配或者选择视觉相似但类别不同的负样本。5. SIMMER范式的优势、挑战与未来展望SIMMER所代表的统一编码范式其优势在之前的讨论中已初见端倪但我们仍需系统性地总结并正视其面临的挑战。5.1 核心优势再审视语义对齐质量更高由于在模型内部底层就进行了跨模态信号融合学到的统一表示天然对齐了视觉和语言模态中最相关的语义部分减少了信息损失。零样本/少样本能力强依托大模型强大的泛化能力和先验知识对于训练数据中未见过的菜式或新颖描述SIMMER范式通常比传统双塔模型表现更好。支持复杂查询用户不仅可以输入图片还可以输入复杂的文本查询如“不用烤箱的、酸甜口的鸡肉做法”。MLLM能够理解这种复合语义并在统一空间中找到匹配的菜品。可解释性潜力由于MLLM本身具备语言生成能力我们可以要求模型不仅给出检索结果还能生成简短的“理由”例如“因为图片中的菜肴呈现亮红色酱汁和块状猪肉与‘红烧肉’的描述相符”这增强了系统的可信度和用户体验。5.2 当前面临的主要挑战计算成本高昂MLLM的参数量巨大即使是推理阶段相比传统的双塔模型如CLIP其计算开销和延迟也要高出一个数量级。这对于需要实时响应的大规模在线检索系统是一个严峻的挑战。模型规模与部署难度动辄数十亿参数的模型对部署环境的内存GPU显存和带宽都提出了极高要求。模型压缩、蒸馏、量化等技术是工程化落地的必经之路。对提示工程的依赖如我们实战部分提到的模型的性能可能对输入提示词的措辞敏感。如何设计鲁棒、高效的提示模板本身就是一个需要经验和技术积累的课题。数据偏见与安全性MLLM从互联网海量数据中学习不可避免地会继承其中的偏见例如对某些地区菜系的认知不足或存在刻板印象。在美食领域这可能表现为对地方特色小吃的识别率低。需要在应用时进行细致的评估和纠偏。5.3 未来可能的演进方向效率与效果的平衡未来的研究将集中于开发更轻量级的MLLM架构或设计高效的检索专用适配器在保持性能的同时大幅降低计算成本。例如只针对检索任务微调一个很小的“适配头”而冻结庞大的MLLM主干。多粒度检索不仅检索整个菜谱还能根据图片定位到菜谱中的具体步骤“图中展示的是腌制过程还是翻炒过程”或者根据用户拥有的具体食材生成适配的菜谱“我只有鸡蛋和西红柿能做什么”。这需要模型具备更细粒度的理解和推理能力。个性化与交互式检索结合用户的历史行为、口味偏好如不吃辣、素食主义提供个性化的检索结果。甚至支持多轮对话式检索用户可以通过不断补充信息“不要太油的”、“有小孩能吃的那种”来渐进式缩小范围。从检索到创作统一的深度理解能力使得模型不仅能“找到”菜谱未来还可能辅助“创作”新菜谱。例如根据一张灵感图片结合用户指定的食材限制生成一道全新的融合菜谱。从我个人的实践和观察来看SIMMER范式代表了跨模态检索一个非常清晰且有力的技术演进方向。它不再满足于浅层的特征匹配而是追求深度的语义理解。尽管目前还存在效率瓶颈但随着模型压缩技术、硬件算力的发展以及更精巧的架构设计我相信这种“统一编码”的思想将会在越来越多的实际应用场景中落地生根。对于从事相关领域开发的工程师来说现在正是深入理解MLLM、尝试将其与具体业务结合的好时机。不妨从我们上面推演的简易系统开始亲手体验一下这种新范式带来的不同或许下一个美食检索的突破性产品就源于你的一次实验。