LLaVAR:基于数据增强的多模态大模型文字图像理解实战
1. 项目概述:当大模型学会“看图识字”
如果你玩过像ChatGPT这样的对话AI,可能会发现一个有趣的现象:它们对纯文字的理解和生成能力已经相当惊人,但一旦你丢给它一张图片,比如一张带有文字的广告海报、一份产品说明书或者一个路牌,它往往就“瞎”了。它能看到图片里有东西,但无法理解图片中那些文字的具体含义。这正是当前多模态大模型(Multimodal Large Language Models)面临的一个核心挑战——对富含文本的图像(Text-Rich Images)的理解能力不足。
LLaVAR(Large Language and Vision Assistant for Reading)这个项目,就是为了解决这个问题而生的。简单来说,它是在大名鼎鼎的LLaVA(一个结合了视觉编码器和语言大模型的开源多模态助手)基础上,通过一套专门针对“文字图像”的增强指令微调(Enhanced Visual Instruction Tuning)方法,大幅提升了模型识别和理解图像中文字信息的能力。根据论文数据,它在OCR(光学字符识别)相关的评测任务上,将LLaVA的得分从50分左右提升到了80分,效果提升显著。
这个项目对于谁有价值呢?如果你是一个开发者或研究者,正在探索如何让AI更好地理解我们周围充满文字信息的视觉世界——比如自动解析图表、理解带字幕的梗图、从产品包装上提取信息,或者开发更智能的视觉问答应用——那么LLaVAR的工作思路、数据集和模型,都提供了极具价值的参考。即便你只是对多模态AI技术感兴趣,想了解如何“教”一个模型学会“看图识字”,这个项目也是一个绝佳的、可以动手复现的案例。
接下来,我将从一个实践者的角度,为你深入拆解LLaVAR的核心思路、数据构建的巧思、训练过程的细节,并分享在复现和应用过程中可能遇到的“坑”以及如何避开它们。
2. 核心思路拆解:为什么普通的视觉指令微调“看不懂字”?
要理解LLaVAR做了什么,我们得先看看它的“前辈”LLaVA遇到了什么问题。LLaVA是一个开创性的工作,它成功地将视觉信息(通过CLIP等视觉编码器)与语言大模型(如Vicuna)对齐,让模型能根据图片进行对话。它的训练分为两步:
- 预训练阶段:使用大量的图像-文本对(如CC3M数据集),让视觉编码器学会将图像特征“投影”到语言模型的词嵌入空间,建立视觉与语言的初步连接。
- 指令微调阶段:使用人工精心构造的指令-回答对(基于COCO等数据集图片),教会模型如何根据人类的指令,结合图片内容进行回答。
问题就出在数据上。无论是预训练用的CC3M,还是微调用的COCO,其中的图片大多是自然场景、物体、人物,虽然包含文字(如路牌、商标),但并非数据收集和标注的重点。因此,模型在训练过程中接触到的“文字图像”样本严重不足,导致其视觉编码器提取的特征和后续的语言理解,都没有对图像中的文字信息给予足够的“关注度”。
2.1 LLaVAR的破局之道:数据驱动的能力增强
LLaVAR的核心思路非常直接:缺什么,补什么。既然通用数据集中文字图像不足,那就专门构建一个高质量、大规模的“文字图像”指令数据集。
这个思路背后有一个深刻的洞察:对于多模态大模型而言,其能力边界在很大程度上是由训练数据决定的。你想让它擅长什么,就得用什么样的数据去“教”它。LLaVAR没有去改动LLaVA的模型架构(视觉编码器+投影层+语言模型),而是将全部精力放在了数据的构建和利用上,这是一种高效且务实的工程化改进思路。
具体来说,它做了两件关键事:
- 构建专用数据集:从海量的LAION-5B图像-文本对数据集中,筛选出那些包含丰富、清晰文字的图片,并围绕这些图片构建高质量的对话指令数据。
- 两阶段混合训练:将自建的“文字图像”数据,与LLaVA原有的通用数据(CC3M用于预训练,COCO指令数据用于微调)混合在一起进行训练。这样,模型既能保持原有的通用视觉理解能力,又能专项强化文字识别与理解能力。
一个重要的实操心得:在AI模型开发中,当遇到性能瓶颈时,首先应该审视数据,而不是盲目修改模型结构或增加参数。数据质量、数据分布、数据规模,往往是性价比最高的改进杠杆。LLaVAR就是一个典型的数据致胜案例。
2.2 技术选型背后的考量:为什么基于LLaVA和Vicuna?
LLaVAR选择在LLaVA的代码框架和Vicuna语言模型基础上进行开发,这是一个非常明智的选择,主要原因有三点:
- 生态与复现便利性:LLaVA是开源多模态领域的标杆项目,代码结构清晰,社区活跃。基于它进行开发,可以无缝复用其数据处理、训练、评估的完整流水线,极大降低了工程门槛。Vicuna作为基于LLaMA微调的高性能对话模型,同样拥有广泛的社区支持和成熟的工具链。
- 技术路线成熟性:LLaVA采用的“视觉编码器+投影层+冻结语言模型”的架构,已经被证明是高效且有效的多模态对齐方案。冻结语言模型可以保留其强大的语言理解和生成能力,只需要训练一个轻量的投影层(MLP Adapter)来对齐视觉特征,训练成本相对较低。
- 专注于核心问题:如前所述,LLaVAR的核心创新点在数据而非模型。使用一个稳定、公认的基线框架,可以确保性能的提升确实来自于新数据的引入,而不是架构变动带来的混淆因素。这使研究工作更聚焦,结论也更可信。
3. 数据构建详解:高质量指令从何而来?
数据是LLaVAR的灵魂。它的数据构建过程值得我们仔细研究,因为其中包含了许多可以借鉴到其他领域的技巧。
3.1 图像筛选:如何找到富含文本的图片?
LAION-5B是一个超大规模的图像-文本对数据集,但其中图片质量参差不齐。LLaVAR需要从中精准筛选出“文本丰富且清晰”的图片。论文中没有透露具体的筛选算法细节,但根据经验,这个过程很可能结合了以下技术:
- OCR预过滤:使用开源的OCR引擎(如Tesseract、PaddleOCR)对图片进行初步文字检测和识别。可以设定阈值,如要求图片中检测到的文字行数大于N,或者文字区域占图片面积的比例超过某个值,作为初筛条件。
- CLIP语义过滤:仅用OCR可能会漏掉一些文字风格特殊或背景复杂的图片,或者误将一些纹理识别为文字。可以结合CLIP模型,通过计算图片与“包含文字的图片”、“文档”、“海报”、“截图”等文本提示词的相似度,进行二次筛选,确保图片的语义确实与“富含文本”相关。
- 人工审核或后处理:对于用于指令微调的高质量数据,很可能还需要进行一定的人工抽样检查,或者通过一些启发式规则(如过滤掉文字过于模糊、扭曲、或主要是艺术字体的图片)进行后处理。
注意事项:构建此类数据集时,多样性至关重要。你不能只筛选出“纯文档”图片(如扫描的PDF),而应该涵盖路牌、商品包装、网页截图、带字幕的表情包、街头广告等各类场景。LLaVAR数据的价值就在于它覆盖了真实世界中文字出现的多种形态,这让模型获得的泛化能力更强。
3.2 指令生成:如何让问题与答案“有料”?
有了图片,下一步是生成高质量的(指令, 回答)对。LLaVA的指令数据部分来源于GPT-4,通过让GPT-4根据图片内容生成多样化的对话。LLaVAR沿用了这一方法,并针对“文字图像”进行了强化。
其指令大致可分为以下几类,这也是我们在构造自己的多模态指令数据时可以参考的范式:
- 文字识别与转录:直接询问图片中的文字内容。
- 指令:“这张图片里写了什么字?”
- 答案:“图片中央写着‘OpenAI DevDay, November 6, 2023’,下方有一行小字‘Join us to learn about the latest advances in AI’。”
- 基于文字的理解与推理:问题答案需要基于对文字内容的理解。
- 指令:“这个路牌指示的前方地点是哪里?距离多远?”
- 答案:“路牌显示前方是‘Springfield’,距离‘5 Miles’。”
- 图文结合的综合问答:需要结合图片中的视觉元素和文字信息共同回答。
- 指令:“这张产品包装图上画的是什么水果?它的品牌名是什么?”
- 答案:“包装上画的是橙子。品牌名是‘Sunshine Grove’。”
- 批判性或多轮对话:涉及对文字内容的评价、总结或假设。
- 指令:“这张海报上的活动主题是什么?你觉得这个主题吸引人吗?为什么?”
- 答案:“活动主题是‘人工智能与艺术的未来’。这个主题很吸引人,因为它结合了两个前沿且富有创造性的领域,容易引发科技和艺术爱好者的兴趣。”
LLaVAR将这样生成的、针对文字图像的指令数据(约16K-20K条),与LLaVA原有的约158K条通用指令数据混合,形成了最终的微调数据集。这种“通用数据+专项数据”的混合策略,是防止模型在新任务上产生“灾难性遗忘”的常见且有效的手段。
3.3 数据格式与处理:无缝对接原有框架
LLaVAR团队非常贴心,他们发布的数据已经处理成了与LLaVA完全兼容的格式。具体来说:
- 图像:被重新命名,伪装成CC3M或COCO数据集的文件名格式,并放入了对应的文件夹结构(
cc3m和coco2017)。这意味着,在代码层面,你几乎不需要做任何改动,只需要将下载的图片文件复制到对应的目录,LLaVA的训练脚本就会自动将它们加载进去。 - 指令JSON文件:是一个包含了LLaVA原有指令和LLaVAR新增指令的合并文件。每条数据都遵循相同的结构,例如:
其中{ “id”: “unique_id_llavar_123”, “image”: “fake_coco_filename_000000123456.jpg”, // 伪装的图片名 “conversations”: [ { “from”: “human”, “value”: “<image>\n这张海报上的演讲者是谁?” }, { “from”: “gpt”, “value”: “海报上显示的主讲人是Dr. Jane Smith。” } ] }“<image>”是一个特殊的占位符,告诉模型此处需要关注图片。
这种处理方式极大地简化了复现流程,体现了优秀的工程实践——最小化下游用户的适配成本。
4. 模型训练全流程实操指南
假设你已经按照LLaVA的官方指南,搭建好了基础环境(Python、PyTorch、相关依赖库),并准备好了Vicuna-13B-v1.1的模型权重。以下是基于LLaVAR进行训练的具体步骤和核心参数解析。
4.1 环境与权重准备
首先,你需要将LLaVAR发布的权重Delta与原始的LLaMA-13B权重进行合并。Delta权重是指训练后模型与原始基座模型之间的参数差值。这是因为直接发布完整权重可能涉及版权问题。
# 1. 克隆LLaVA仓库(假设LLaVAR基于某个特定版本的LLaVA,请根据其README确认) git clone https://github.com/haotian-liu/LLaVA.git cd LLaVA # 2. 下载LLaVAR的权重Delta文件(从Hugging Face或Google Drive) # 假设你下载到了 /path/to/llavar_delta 目录 # 3. 使用LLaVA提供的脚本合并权重 # 你需要准备原始的LLaMA-13B权重,假设在 /path/to/llama-13b-hf # 合并后的权重将输出到 /path/to/llavar-merged python scripts/merge_llavar_delta.py \ --base-model-path /path/to/llama-13b-hf \ --delta-path /path/to/llavar_delta \ --target-model-path /path/to/llavar-merged关键一步:合并完成后,必须将目标文件夹重命名,在其后加上“v1”后缀,例如将llavar-merged重命名为llavar-merged-v1。这是因为Vicuna v1.1使用了不同的对话模板(以</s>作为分隔符),LLaVA的代码需要通过文件夹名中的“v1”来识别并使用正确的对话模式(llava_v1)。
4.2 数据准备
- 下载数据:从LLaVAR提供的链接下载预训练和微调的图像包及指令文件。
- 整合图像:
- 将
pretrain_images.tar.gz解压后,将其中的所有图片复制到你的CC3M数据集目录(/path/to/cc3m)中。由于文件名是伪装过的,直接复制不会冲突。 - 将
finetune_images.tar.gz解压后,将其中的所有图片复制到你的COCO 2017训练集目录(/path/to/coco/images/train2017)中。
- 将
- 整合指令:
- 预训练指令文件(
chat_llavar.json)已经包含了LLaVA的预训练数据,直接使用即可。 - 微调指令文件有两个版本(16K和20K),选择其中一个(如
llava_instruct_150k_llavar_16k.json)。这个文件也已经包含了原始的LLaVA Instruct 150K数据。
- 预训练指令文件(
4.3 预训练阶段
预训练的目标是让视觉投影层(MLP Adapter)学会将CLIP提取的文字图像特征也映射到语言模型的词嵌入空间。以下是核心训练脚本及参数解读:
torchrun --nnodes=1 --nproc_per_node=8 --master_port=25001 \ /path/to/LLaVA/llava/train/train_mem.py \ --model_name_or_path /path/to/llavar-merged-v1 \ # 使用合并并重命名后的基座模型 --data_path /path/to/chat_llavar.json \ # 混合了LLaVAR数据的预训练指令文件 --image_folder /path/to/cc3m \ # 包含了LLaVAR图片的CC3M目录 --vision_tower openai/clip-vit-large-patch14-336 \ # 使用336分辨率的CLIP,对文字识别更友好 --tune_mm_mlp_adapter True \ # 核心:训练视觉投影层(MLP Adapter) --mm_vision_select_layer -2 \ # 使用CLIP视觉编码器的倒数第二层特征 --mm_use_im_start_end \ # 使用特殊的图像开始/结束标记 --bf16 True \ # 使用BF16混合精度训练,节省显存 --output_dir /path/to/checkpoint_pretrain \ # 预训练检查点输出目录 --num_train_epochs 1 \ --per_device_train_batch_size 8 \ # 每个GPU的批次大小 --per_device_eval_batch_size 4 \ --gradient_accumulation_steps 2 \ # 梯度累积步数,有效批次大小=8*2*8=128 --learning_rate 2e-3 \ # 预训练阶段学习率较高 --warmup_ratio 0.03 \ --lr_scheduler_type “cosine” \ --model_max_length 1024 \ # 预训练时文本长度限制 --gradient_checkpointing True \ # 使用梯度检查点,用时间换显存 --lazy_preprocess True \ # 惰性加载数据,节省内存 --image_aspect_ratio ‘pad’ \ # 将图片填充为正方形 --report_to wandb # 可选:使用Weights & Biases记录实验参数精讲与避坑指南:
--vision_tower openai/clip-vit-large-patch14-336:这里选择了输入分辨率为336x336的CLIP模型。更高的分辨率对于识别图像中的小字至关重要。这是提升OCR能力的一个关键硬件选择。--tune_mm_mlp_adapter True与--mm_use_im_start_end:这是LLaVA的标准配置,只训练连接视觉和语言的轻量适配器,并引入可学习的特殊标记来标识图像特征在序列中的起止位置,是一种高效的多模态对齐方案。--per_device_train_batch_size和--gradient_accumulation_steps:在8张GPU上,有效批次大小是8 * 2 * 8 = 128。批次大小会影响训练稳定性和效果,需要根据你的GPU内存和数量进行调整。如果显存不足,可以降低per_device_train_batch_size或增加gradient_accumulation_steps。--lazy_preprocess True:对于大规模数据集,这个选项可以避免一次性将所有数据加载到内存,而是按需加载,对内存非常友好。--image_aspect_ratio ‘pad’:将非正方形图片填充为正方形。对于文字图像,这有时可能导致文字变形。另一种选择是‘resize’(直接拉伸),但拉伸也可能扭曲文字。‘pad’通常是更优的选择,因为它保留了原始比例,只是在边缘填充灰色或黑色区域。
4.4 指令微调阶段
微调阶段使用混合的指令数据,同时训练投影层和语言模型(通常只训练部分层,如注意力模块),让模型学会遵循人类指令进行对话。
torchrun --nnodes=1 --nproc_per_node=8 --master_port=25001 \ /path/to/LLaVA/llava/train/train_mem.py \ --model_name_or_path /path/to/llavar-merged-v1 \ # 基座模型不变 --data_path /path/to/llava_instruct_150k_llavar_16k.json \ # 混合微调指令数据 --image_folder /path/to/coco/images/train2017 \ # 包含LLaVAR图片的COCO目录 --vision_tower openai/clip-vit-large-patch14-336 \ --pretrain_mm_mlp_adapter /path/to/checkpoint_pretrain/mm_projector.bin \ # 加载预训练的投影层! --mm_vision_select_layer -2 \ --mm_use_im_start_end True \ --bf16 True \ --output_dir /path/to/checkpoint_finetune \ # 微调检查点输出目录 --num_train_epochs 3 \ --per_device_train_batch_size 4 \ # 微调时批次大小通常减小 --per_device_eval_batch_size 4 \ --gradient_accumulation_steps 1 \ --learning_rate 2e-5 \ # 微调学习率远低于预训练 --warmup_ratio 0.03 \ --lr_scheduler_type “cosine” \ --model_max_length 2048 \ # 微调时支持更长的对话 --gradient_checkpointing True \ --lazy_preprocess True \ --image_aspect_ratio ‘pad’ \ --fsdp “full_shard auto_wrap” \ # 使用完全分片数据并行,适用于大模型 --fsdp_transformer_layer_cls_to_wrap ‘LlamaDecoderLayer’ \ # 指定FSDP包装的模块 --report_to wandb关键差异与经验:
--pretrain_mm_mlp_adapter:这是最重要的参数之一。它指定了从预训练阶段保存下来的视觉投影层权重文件(通常是mm_projector.bin)。这确保了模型在微调开始时,视觉特征到语言空间的映射已经是针对文字图像优化过的。--learning_rate 2e-5:指令微调阶段通常使用很小的学习率,以避免破坏从预训练中学到的宝贵表征,同时又能让模型适应新的指令跟随任务。--model_max_length 2048:微调数据中的对话可能更长,因此需要增加序列长度限制。--fsdp相关参数:当模型很大(如13B)无法放入单张GPU显存时,需要使用FSDP(Fully Sharded Data Parallel)这种高级分布式训练策略。它会将模型参数、梯度和优化器状态分片到各个GPU上,从而在有限的显存下训练超大模型。这对硬件和软件环境(PyTorch版本、CUDA)有一定要求,是复现过程中可能遇到的主要技术挑战之一。
5. 模型评估与应用实践
训练完成后,我们需要验证模型的能力。LLaVAR提供了几种评估方式,同时也展示了如何将其用于实际推理。
5.1 标准评估:在COCO和OCR任务上打分
指令跟随评估(COCO):这是LLaVA的标准评估,用于检验模型通用能力是否下降。
python /path/to/LLaVA/llava/eval/model_vqa.py \ --model-name /path/to/checkpoint_finetune \ # 使用微调后的完整模型 --question-file /path/to/LLaVA/playground/data/coco2014_val_qa_eval/qa90_questions.jsonl \ --image-folder /path/to/coco2014/val2014 \ --answers-file /path/to/your_answers.jsonl \ --conv-mode “llava_v1” # 必须使用v1对话模式评估结果会与GPT-4生成的答案进行对比(使用LLaVA提供的评估脚本),计算得分。一个健康的LLaVAR模型应该在这个通用任务上保持与LLaVA相近的水平。
OCR专项评估:这是LLaVAR的核心评估。它使用了来自MultimodalOCR项目的基准测试,其中包含大量需要识别和理解图像中文字的任务。
- 你需要先克隆MultimodalOCR仓库,并按照其说明准备数据。
- 将LLaVAR提供的评估脚本
Eval_LLaVAR.py放入指定目录。 - 修改
eval.py,添加你的LLaVAR模型路径。 - 运行评估脚本。理想情况下,你的模型在OCR相关指标上应有显著提升(从~50到~80)。
5.2 本地推理与API部署
训练好的模型可以像LLaVA一样进行交互式对话或部署为服务。
单张图片命令行测试:
python -m llava.eval.run_llava \ --model-name /path/to/checkpoint_finetune \ --image-file “/path/to/your/text_image.jpg” \ --query “图片中的电话号码是多少?”这是最快速的验证方式,可以直观感受模型对文字图像的识别能力。
启动Gradio Web UI: LLaVA项目提供了基于Gradio的交互界面。你可以直接使用其
llava/serve/cli.py或相关脚本启动一个本地Web服务,通过浏览器上传图片并进行多轮对话。这对于演示和快速原型开发非常方便。集成到自有应用: 你可以将模型封装成API。核心是加载模型和处理器,并编写一个处理函数:
from llava.model.builder import load_pretrained_model from llava.mm_utils import process_images, tokenizer_image_token from llava.constants import IMAGE_TOKEN_INDEX # 1. 加载模型和处理器 model_path = “/path/to/checkpoint_finetune” tokenizer, model, image_processor, context_len = load_pretrained_model( model_path=model_path, model_base=None, model_name=“llava-v1.1” # 根据你的模型命名 ) # 2. 处理输入 def query_llavar(image_path, question): # 处理图片 image = Image.open(image_path).convert(‘RGB’) image_tensor = process_images([image], image_processor, model.config)[0] # 构建对话 conv = get_conversation_template(“llava_v1”) conv.append_message(conv.roles[0], f“<image>\n{question}”) conv.append_message(conv.roles[1], None) prompt = conv.get_prompt() # 令牌化 input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors=‘pt’).unsqueeze(0).cuda() # 模型推理 with torch.inference_mode(): output_ids = model.generate( input_ids, images=image_tensor.unsqueeze(0).half().cuda(), do_sample=True, temperature=0.2, max_new_tokens=512, use_cache=True ) # 解码输出 outputs = tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0].strip() return outputs将这个函数封装到FastAPI或Flask应用中,即可提供一个视觉问答API。
5.3 常见问题与排查技巧实录
在复现和应用LLaVAR的过程中,你可能会遇到以下典型问题:
问题1:合并权重后,模型输出乱码或完全不相关。
- 排查:首先检查基座模型路径是否正确,是否为Vicuna-13B-v1.1(而非v0或LLaMA原始版)。最关键的一步,检查合并后的模型文件夹名是否以“
v1”结尾,并且在运行脚本时是否使用了--conv-mode “llava_v1”。对话模板不匹配是导致输出混乱的最常见原因。 - 解决:确保文件夹命名正确,并在所有评估和推理命令中显式指定
--conv-mode “llava_v1”。
问题2:训练时GPU内存不足(OOM)。
- 排查:首先确认
per_device_train_batch_size是否设置过大。尝试将其设为1或2。如果问题依旧,可能是由于使用了--model_max_length设置过长,或者图片分辨率(336)导致视觉特征过大。 - 解决:
- 优先降低
per_device_train_batch_size。 - 确保启用了
--gradient_checkpointing True和--lazy_preprocess True。 - 如果使用多卡,确认FSDP配置正确。对于13B模型,在24GB显存的GPU上,
per_device_train_batch_size=1配合FSDP通常是可行的。 - 考虑使用更低精度的训练,如
--bf16 True已是标配,可检查是否误用了FP32。
- 优先降低
问题3:训练损失(Loss)不下降或波动很大。
- 排查:检查学习率设置。预训练阶段学习率(2e-3)较高,如果数据量小或批次不稳定,可能导致震荡。微调阶段学习率(2e-5)很低,下降慢是正常的。
- 解决:
- 检查数据加载是否正确。可以尝试打印几条数据,看看图片和对话是否对应。
- 使用
--report_to wandb监控训练过程,观察损失曲线、学习率变化和梯度范数。如果梯度爆炸,可以尝试减小学习率或使用梯度裁剪(在训练脚本中增加--max_grad_norm 1.0参数)。 - 确认
--pretrain_mm_mlp_adapter在微调时指向了正确的预训练投影层文件。
问题4:模型在通用COCO评估上得分大幅下降。
- 排查:这可能是“灾难性遗忘”的迹象。虽然混合了LLaVA数据,但新增的LLaVAR数据可能在某些视觉概念上分布不同,导致模型过度偏向文字图像。
- 解决:
- 尝试调整混合数据中通用数据和文字数据的比例。也许LLaVAR的16K数据占比需要略微降低。
- 在微调时,可以尝试更小的学习率,或者只解冻更少的语言模型层(LLaVA默认可能解冻了全部注意力层,你可以尝试只解冻最后几层)。
- 这是一种权衡。如果OCR能力提升巨大,而通用能力略有下降,在特定应用场景下可能是可以接受的。
问题5:模型对某些字体、背景复杂的文字识别不准。
- 排查:这是预期之内的问题。训练数据(LAION)虽然多样,但不可能覆盖所有字体和场景。CLIP视觉编码器本身也不是为高精度OCR设计的。
- 解决:
- 数据增强:如果你有自己的业务数据,可以在LLaVAR数据基础上,进一步加入你特定场景下的文字图像进行微调。
- 后处理:对于关键的数字、编号等信息,可以结合一个专用的OCR引擎(如PaddleOCR)作为后备。当模型置信度较低时,调用专用OCR进行二次识别。
- 提示工程:在提问时,可以更具体。例如,不要问“上面写了什么?”,而是问“图片顶部黑色加粗的标题文字是什么?”,给模型更明确的视觉焦点指引。
LLaVAR项目为我们提供了一个清晰的范本:通过构建针对性的高质量数据,可以在不改变核心架构的前提下,显著提升大模型在特定子任务上的能力。这个过程涉及数据工程、模型训练、评估调试等多个环节,每一个环节都需要耐心和细致的调优。希望这份详细的拆解和实操指南,能帮助你更好地理解、复现并应用这项技术,在你的项目中让AI真正学会“看图识字”。
