图文问答系统本科毕业设计
图文问答系统本科毕业设计
一.LLaVA-v1.5 | 微软开源,用极简框架来实现高效的多模态 LMM 模型
论文:Improved Baselines with Visual Instruction Tuning
1.背景
一般的模型架构包含这几个模块,LLaVA 应该是最简单的 LMM 结构:
模块一:预训练好的 visual backbone 来对图像进行编码
模块二:预训练好的 LLM 来理解用户的命令并输出反馈
模块三:vision-language cross-modal connector 来将 vision encoder 的输出对齐到 language 模型阈
可选模块:visual resampler,来降低 visual patches 的数量
一般的模型的训练流程都包含两阶段:
stage 1:进行图文对齐的 pretraining 阶段,能够让 visual features 和 language model embedding space 对齐
stage 2:visual instruction tuning 阶段,能够让模型跟随用户的不同指令
二.LLaVA模型结构
论文: https://arxiv.org/pdf/2304.08485.pdf

这是 LLaVA(Large Language - Vision Assistant)网络架构图 。以下是对图中各部分的解释: 输入部分 X v (Image):表示图像输入,是视觉信息的来源。通过 **Vision Encoder(视觉编码器)** 对图像进行特征提取,得到特征表示 Z v 。 X q (Language Instruction):语言指令输入,是用户输入的文本指令,用于指导模型生成相应的语言响应,经过处理得到特征表示 H q 。 中间处理部分 Projection W :将视觉编码器输出的特征 Z v 进行投影变换,得到 H v ,使其能与语言特征更好融合。 Language Model f ϕ :语言模型部分,负责处理融合后的视觉和语言特征,生成最终的语言响应。 输出部分 X a (Language Response):模型最终输出的语言响应,即根据输入的图像和语言指令生成的文本回答。 LLaVA 架构旨在融合视觉和语言模态信息,实现多模态交互,让模型能根据图像和文本指令生成合适的语言回复。
LLaVA的模型结构很简单,就是CLIP+LLM(Vicuna,LLaMA结构),利用Vison Encoder将图片转换为[N=1, grid_H x grid_W, hidden_dim]的feature map,然后接一个插值层Projection W,将图像特征和文本特征进行维度对齐。经过Projection后,得到[N=1, grid_H xgrid_W=image_seqlen, emb_dim]。然后将 image token embedding和text token embedding合并到一起,作为语言模型的输入,生成描述的文本。
LLaVA 1.5 的结构主要分为三个部分:视觉编码器(Vision Encoder)、投影层(Projection)和语言模型(LLM)。以下是其结构的具体介绍:
视觉编码器(Vision Encoder):采用 CLIP 的视觉编码器(CLIP-ViT-L/14),并且将输入图像的分辨率从 224px 提升到 336px,这使得模型对图像细节的理解能力更强,能够提取更高质量的视觉特征。
跨模态连接器(vision-language cross-modal connector):由原来的单个线性层替换为多层感知机(MLP)层作为跨模态连接器。MLP 包含两层线性层并使用 GELU 激活函数,这种结构增强了连接器的表达能力,能够更好地融合视觉和语言信息。相比原始的线性投影架构,MLP 跨模态连接器显著提升了 LLaVA 的多模态能力。
语言模型:使用 Vicuna v1.5 13b 作为语言模型,语言模型参数量更大,效果更好。在输入方面,视觉和语言的指令在同一个特征空间,一起拼接后送进模型进行处理,实现了图像和语言在模型中的交互和融合。
- 视觉编码器(Vision Encoder):用于将输入的图片转换为特征图。它会把图片处理成特定格式的特征表示,例如转换为形状为(N=1,grid_H×grid_W,hidden_dim)的特征图,其中N表示批次大小,grid_H和grid_W分别代表特征图在高度和宽度上的网格数量,hidden_dim是特征的维度。
- 投影层(Projection):是一个插值层,主要作用是将视觉编码器输出的图像特征和文本特征进行维度对齐。经过该层处理后,图像特征变为(N=1,grid_H×grid_W=image_seqlen,emb_dim),其中image_seqlen表示图像序列的长度,emb_dim是对齐后的特征维度。
- 语言模型(LLM):通常基于 LLaMA 等语言模型架构。在将图像特征和文本特征合并后作为输入,语言模型会生成相应的描述文本,从而实现多模态的对话、推理等功能。
1.CLIP 模型结构
【LLM多模态】LLava模型架构和训练过程 | CLIP模型-CSDN博客

CLIP模型是一个双塔结构,包括一个文本编码器Text Encoder和一个图像编码器Image Encoder。训练数据集的形式为(image, text),对于每个正确匹配的image和text,text是对image的一句正确描述。CLIP模型需要对(image, text)的数据对进行预测,即(image, text)匹配的为1,不匹配的为0。
Text Encoder: 对于每个句子,将其编码成一个隐向量,维度(1,512);N个句子,因此有,即[N, 512]
Image Encoder: 对于每张img,将其编码成一个隐向量,维度(1,512);
N张图,因此有-,即[N, 512]
2.CLIP在LLaVA中的应用
在LLaVA中,Vision Encoder使用的是CLIP-ViT-L/14,并且,需要注意的是,LLaVA使用最后一层Transformer之前或之后的grid features作为图像表示,而不是CLIP最后的输出层。
3.什么是ViT
从深度学习暴发以来,CNN一直是CV领域的主流模型,而且取得了很好的效果,相比之下,基于self-attention结构的Transformer在NLP领域大放异彩。虽然Transformer结构已经成为NLP领域的标准,但在计算机视觉领域的应用还非常有限。
ViT(vision transformer)是Google在2020年提出的直接将Transformer应用在图像分类的模型,通过这篇文章的实验,给出的最佳模型在ImageNet1K上能够达到88.55%的准确率(先在Google自家的JFT数据集上进行了预训练),说明Transformer在CV领域确实是有效的,而且效果还挺惊人。
Vision Transformer的讲解和代码实现狗都能看懂的Self-Attention讲解_self attention-CSDN博客
2.LLaVA两阶段训练
阶段一:特征对齐预训练。由于从CLIP提取的特征与word embedding不在同一个语义表达空间,因此,需要通过预训练,将image token embedding对齐到text word embedding的语义表达空间。这个阶段冻结Vision Encoder和LLM模型的权重参数,只训练插值层Projection W的权重。
阶段二:端到端训练。这个阶段,依然冻结Vision Encoder的权重,训练过程中同时更新插值层Projection W和LLM语言模型的权重,训练考虑Multimodal Chatbot和Science QA两种典型的任务。
a.什么是Word Embedding?
现有的机器学习方法往往无法直接处理文本数据,因此需要找到合适的方法,将文本数据转换为数值型数据,由此引出了Word Embedding(词嵌入)的概念。
词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称,它是NLP里的早期预训练技术。它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量,这也是分布式表示:向量的每一维度都没有实际意义,而整体代表一个具体概念。
分布式表示相较于传统的独热编码(one-hot)表示具备更强的表示能力,而独热编码存在维度灾难和语义鸿沟(不能进行相似度计算)等问题。传统的分布式表示方法,如矩阵分解(SVD/LSA)、LDA等均是根据全局语料进行训练,是机器学习时代的产物。
Word Embedding的输入是原始文本中的一组不重叠的词汇,假设有句子:apple on a apple tree。那么为了便于处理,我们可以将这些词汇放置到一个dictionary里,例如:[“apple”, “on”, “a”, “tree”],这个dictionary就可以看作是Word Embedding的一个输入。
Word Embedding的输出就是每个word的向量表示。对于上文中的原始输入,假设使用最简单的one hot编码方式,那么每个word都对应了一种数值表示。例如,apple对应的vector就是[1, 0, 0, 0],a对应的vector就是[0, 0, 1, 0],各种机器学习应用可以基于这种word的数值表示来构建各自的模型。当然,这是一种最简单的映射方法,但却足以阐述Word Embedding的意义。

3.LLaVA 1.5
论文:https://arxiv.org/pdf/2310.03744.pdf
LLaVA 1.5和LLaVA在模型架构上基本一致,对LLM模型和插值层做了修改,但是模型效果逐渐开始炸裂~
LLM模型:LLM语言模型升级为Vicuna v1.5 13B,语言模型参数量更大,效果更好
Connector:也就是插值层,由原来的单个线性层替换为MLP层(多层线性层叠加)
Vision Encoder: 输入图像分辨率由224增大为336,使用CLIP ViT-L/336px,对图像细节理解能力更强(CLIP(Contrastive Language-Image Pretraining)是 OpenAI 研发的一种对比式的预训练模型,能够学习图像和文本之间的关联。CLIP ViT - L 采用了基于 Vision Transformer(ViT)的架构。)
更高质量的数据:真所谓 Data is All you need!

三.数据集的收集以及格式要求(室内室外自然场景)
以下推荐几个符合 JSON 对话格式(类似 llava_v1_5_mix665k.json 的结构)且包含 室内/室外自然场景 的小体积数据集,适用于多模态(图像+文本)任务:
1. COCO (Common Objects in Context) 子集
- 内容:包含室内/室外自然场景图像,每张图有对应的描述文本和物体检测标注。
- 格式适配:需转换为类似
{"image": "path.jpg", "conversations": [{"from": "human", "value": "..."}, ...]}的格式。 - 小体积版本:
- COCO 2017 Tiny(官方子集,约 1GB)
下载链接 - COCO Captions 5K(仅含5,000张图片和描述,约 300MB)
可通过pycocotools提取并转换为目标JSON格式。
- COCO 2017 Tiny(官方子集,约 1GB)
2. Flickr8k / Flickr30k 精简版
- 内容:用户拍摄的室内外自然场景照片,每张图有5句人工描述文本。
- 优点:数据量小(Flickr8k仅8,000张图,约 1GB),适合快速实验。
- JSON转换示例:
json
复制
[ { "id": "flickr_123", "image": "images/123.jpg", "conversations": [ {"from": "human", "value": "<image>\nDescribe the scene."}, {"from": "gpt", "value": "A sunny park with children playing."} ] } ] - 下载:
Flickr8k | Flickr30k
3. VisualGenome 子集
- 内容:复杂室内外场景,包含区域描述和问答对(可直接适配对话格式)。
- 小体积方案:
使用VisualGenome 10K子集(约 500MB),提取场景相关的QA对。 - 示例结构:
json
复制
{ "image": "scene.jpg", "conversations": [ {"from": "human", "value": "<image>\nWhat is on the table?"}, {"from": "gpt", "value": "A vase and a book."} ] } - 下载:
官网 | Kaggle精简版
4. LLaVA-Instruct-150K 子集
- 内容:基于COCO和GPT生成的视觉指令数据,已符合对话格式。
- 小体积方案:
直接下载并提取其中的室内/室外场景(约 1,000 条,<100MB):python
复制
# 从LLaVA数据中筛选场景关键词(如"indoor", "outdoor", "park", "kitchen") filtered_data = [d for d in data if "indoor" in d["conversations"][0]["value"].lower()] - 下载:
LLaVA数据集(需自行提取子集)
5. AI2D (Diagram Understanding) 精简版
- 内容:虽以图表为主,但包含部分室内场景示意图(如家具布局)。
- 优点:体积极小(筛选后约 50MB),适合测试简单场景。
- 转换工具:
使用其标注JSON生成对话式问答(示例代码)。
总结推荐
| 数据集 | 体积 | 场景覆盖 | 适配难度 |
|---|---|---|---|
| COCO 5K | ~300MB | 室内+室外 | ⭐⭐ |
| Flickr8k | ~1GB | 自然场景 | ⭐ |
| LLaVA子集 | <100MB | 多模态指令数据 | ⭐⭐⭐ |
推荐步骤:
- 下载 Flickr8k 或 COCO 5K(直接可用性高)。
- 使用以下代码转换为目标格式:
python
复制
import json from pathlib import Path # 示例:将Flickr8k标注转为对话JSON annotations = json.load(open("flickr8k/captions.json")) output_data = [] for img in annotations["images"][:1000]: # 取前1000条 output_data.append({ "id": img["id"], "image": f"images/{img['file_name']}", "conversations": [ {"from": "human", "value": "<image>\nDescribe the scene."}, {"from": "gpt", "value": img["caption"]} ] }) json.dump(output_data, open("output.json", "w"), indent=4)
四.本地部署加微调
github代码:https://github.com/haotian-liu/LLaVA
clip权重:openai/clip-vit-large-patch14-336 · HF Mirror
其他人写的教程:第一节 LLaVA模型安装、预测、训练详细教程-CSDN博客
其他人写的教程:多模态大模型 LLaVA1.5 LoRA微调笔记_llava-v1.5-CSDN博客
多模态大模型 LLaVA 微调教程-大语言模型8 - vanilla阿草 - 博客园
其他人写的报错信息总结:https://zhuanlan.zhihu.com/p/656307174
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)