news 2026/7/11 1:59:36

PaliGemma2 JSON 信息抽取微调实战:从货盘清单图片到结构化数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaliGemma2 JSON 信息抽取微调实战:从货盘清单图片到结构化数据

PaliGemma2 JSON 信息抽取微调实战:从货盘清单图片到结构化数据


这篇教程是我根据 PaliGemma2 视觉文档理解和 JSON 信息抽取任务复现过程整理出来的。重点演示如何使用 JSONL 数据集微调 PaliGemma2,让模型从货盘清单图片中生成结构化 JSON。

和目标检测不同,JSON 抽取任务关注完整结构化文本生成。这里使用 LoRA/QLoRA 微调整个模型,并用 BLEU、TER 等文本指标评估生成结果和标注 JSON 的接近程度。

本文会重点跑通以下流程:

  • 下载 JSONL 视觉文档数据集
  • 用固定 prompt 训练 JSON 结构化输出
  • 使用 QLoRA 降低 PaliGemma2 微调显存占用
  • 在测试集上生成 JSON 并和标注对比
  • 使用 BLEU 和 TER 评估文本生成质量

如果你正在系统学习多模态微调、目标检测、OCR 或图像分割,建议收藏本文;配套 notebook、示例图片和运行环境说明后续会继续整理。如果环境配置卡住,可以在评论区说明具体报错。

📚 文章目录

  • PaliGemma2 JSON 信息抽取微调实战:从货盘清单图片到结构化数据
    • ⚙️ 环境准备
    • 📦 下载 JSONL 数据集
    • 🧾 加载并预览数据
    • 🧠 加载 PaliGemma2 与 QLoRA
    • 🏋️ 微调 JSON 抽取模型
    • 🔍 运行微调模型推理
    • 📊 评估 JSON 生成质量
    • 📌 小结
    • 📚 同系列教程汇总

⚙️ 环境准备

检查 GPU,安装训练依赖,并准备从数据集后台导出的 JSONL 格式数据集。

!nvidia-smi

📦 下载 JSONL 数据集

下载 pallet load manifest JSON 数据集,并查看标注文件前几行。

!pip install-q supervision peft bitsandbytes transformers==4.47.0
fromtypesimportSimpleNamespace# 从数据集后台下载并解压数据集后,修改 DATASET_DIR 指向数据集目录。DATASET_DIR="/content/dataset"# 修改为数据集后台导出的数据集目录dataset=SimpleNamespace(location=DATASET_DIR)
!head-n5{dataset.location}/train/annotations.jsonl

🧾 加载并预览数据

定义 JSONL 数据集类,读取图片和对应 JSON suffix,并预览部分训练图片。

importosimportjsonimportrandomfromPILimportImagefromtorch.utils.dataimportDatasetclassJSONLDataset(Dataset):def__init__(self,jsonl_file_path:str,image_directory_path:str):self.jsonl_file_path=jsonl_file_path self.image_directory_path=image_directory_path self.entries=self._load_entries()def_load_entries(self):entries=[]withopen(self.jsonl_file_path,'r')asfile:forlineinfile:data=json.loads(line)entries.append(data)returnentriesdef__len__(self):returnlen(self.entries)def__getitem__(self,idx:int):ifidx<0oridx>=len(self.entries):raiseIndexError("Index out of range")entry=self.entries[idx]image_path=os.path.join(self.image_directory_path,entry['image'])image=Image.open(image_path)returnimage,entry
train_dataset=JSONLDataset(jsonl_file_path=f"{dataset.location}/train/annotations.jsonl",image_directory_path=f"{dataset.location}/train",)valid_dataset=JSONLDataset(jsonl_file_path=f"{dataset.location}/valid/annotations.jsonl",image_directory_path=f"{dataset.location}/valid",)test_dataset=JSONLDataset(jsonl_file_path=f"{dataset.location}/test/annotations.jsonl",image_directory_path=f"{dataset.location}/test",)
fromtqdmimporttqdmimportsupervisionassv images=[]foriinrange(25):image,label=train_dataset[i]images.append(image)sv.plot_images_grid(images,(5,5))

🧠 加载 PaliGemma2 与 QLoRA

加载 processor,并启用 LoRA/QLoRA 进行显存友好的微调。

importtorchfromtransformersimportPaliGemmaProcessor,PaliGemmaForConditionalGeneration MODEL_ID="google/paligemma2-3b-pt-448"DEVICE=torch.device("cuda"iftorch.cuda.is_available()else"cpu")
fromhuggingface_hubimportnotebook_login notebook_login()
processor=PaliGemmaProcessor.from_pretrained(MODEL_ID)
# @title Freeze the image encoder# TORCH_DTYPE = torch.bfloat16# model = PaliGemmaForConditionalGeneration.from_pretrained(MODEL_ID, torch_dtype=TORCH_DTYPE).to(DEVICE)# for param in model.vision_tower.parameters():# param.requires_grad = False# for param in model.multi_modal_projector.parameters():# param.requires_grad = False
# @title Fine-tune the entire model with LoRA and QLoRAfromtransformersimportBitsAndBytesConfigfrompeftimportget_peft_model,LoraConfig bnb_config=BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_compute_dtype=torch.bfloat16)lora_config=LoraConfig(r=8,target_modules=["q_proj","o_proj","k_proj","v_proj","gate_proj","up_proj","down_proj"],task_type="CAUSAL_LM",)model=PaliGemmaForConditionalGeneration.from_pretrained(MODEL_ID,device_map="auto")model=get_peft_model(model,lora_config)model.print_trainable_parameters()TORCH_DTYPE=model.dtype

🏋️ 微调 JSON 抽取模型

固定 prompt 为extract data in JSON format,让模型学习输出目标 JSON。

fromtransformersimportTrainer,TrainingArgumentsdefcollate_fn(batch):images,labels=zip(*batch)paths=[label["image"]forlabelinlabels]prefixes=["<image>extract data in JSON format"forlabelinlabels]suffixes=[label["suffix"]forlabelinlabels]inputs=processor(text=prefixes,images=images,return_tensors="pt",suffix=suffixes,padding="longest").to(TORCH_DTYPE).to(DEVICE)returninputs args=TrainingArguments(num_train_epochs=20,remove_unused_columns=False,per_device_train_batch_size=1,gradient_accumulation_steps=8,warmup_steps=2,learning_rate=2e-5,weight_decay=1e-6,adam_beta2=0.999,logging_steps=50,optim="adamw_hf",save_strategy="steps",save_steps=1000,save_total_limit=1,output_dir="paligemma2_object_detection",bf16=True,report_to=["tensorboard"],dataloader_pin_memory=False)trainer=Trainer(model=model,train_dataset=train_dataset,eval_dataset=valid_dataset,data_collator=collate_fn,args=args)
trainer.train()

🔍 运行微调模型推理

在测试集样本上生成 JSON,并显示对应图片。

image,label=test_dataset[1]prefix="<image>extract data in JSON format"suffix=label["suffix"]inputs=processor(text=prefix,images=image,return_tensors="pt").to(TORCH_DTYPE).to(DEVICE)prefix_length=inputs["input_ids"].shape[-1]withtorch.inference_mode():generation=model.generate(**inputs,max_new_tokens=512,do_sample=False)generation=generation[0][prefix_length:]decoded=processor.decode(generation,skip_special_tokens=True)print(json.dumps(json.loads(decoded),indent=4))image

📊 评估 JSON 生成质量

遍历测试集收集预测和标注,使用 BLEU 和 TER 衡量文本生成质量。

importnumpyasnp targets=[]predictions=[]withtorch.inference_mode():foriinrange(len(test_dataset)):image,label=test_dataset[i]prefix="<image>extract data in JSON format"suffix=label["suffix"]inputs=processor(text=prefix,images=image,return_tensors="pt").to(TORCH_DTYPE).to(DEVICE)prefix_length=inputs["input_ids"].shape[-1]generation=model.generate(**inputs,max_new_tokens=512,do_sample=False)generation=generation[0][prefix_length:]generated_text=processor.decode(generation,skip_special_tokens=True)targets.append(suffix)predictions.append(generated_text)
!pip install-q evaluate
# @title Calculate BLEUfromevaluateimportload bleu=load("bleu")results=bleu.compute(predictions=predictions,references=targets)print(results)
!pip install-q sacrebleu
# @title Calculate TERfromevaluateimportload ter=load("ter")results=ter.compute(predictions=predictions,references=targets,case_sensitive=True)print(results)

📌 小结

这篇教程完整整理了Fine-Tune PaliGemma2 for JSON Data Extraction的核心复现流程。实际操作时,建议先确认 GPU、依赖版本、数据集路径和模型权限,再逐段运行 notebook。

  • 下载 JSONL 视觉文档数据集
  • 用固定 prompt 训练 JSON 结构化输出
  • 使用 QLoRA 降低 PaliGemma2 微调显存占用
  • 在测试集上生成 JSON 并和标注对比
  • 使用 BLEU 和 TER 评估文本生成质量

后续我会继续按源项目顺序整理 项目教程 中的目标检测、实例分割、OCR、多目标跟踪和视觉大模型教程。

📚 同系列教程汇总

  • Google Gemini 3.5 Flash 零样本目标检测教程:从提示词到可视化结果

  • GLM-OCR 文档识别实战教程:从验证码、公式到车牌 OCR

  • RF-DETR + ByteTrack 多目标跟踪实战教程:从命令行到 Python 视频轨迹可视化

  • SAM 3 图像分割实战教程:文本、框和点提示的多种分割方式

  • PaliGemma2 JSON 信息抽取微调实战:从货盘清单图片到结构化数据-本文

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/11 1:57:45

Java 8 CompletableFuture 线程池配置实战:3种自定义策略与性能对比

Java 8 CompletableFuture 线程池配置实战&#xff1a;3种自定义策略与性能对比在当今高并发服务开发中&#xff0c;异步编程已成为提升系统吞吐量的关键手段。Java 8引入的CompletableFuture不仅解决了传统Future的阻塞问题&#xff0c;更通过灵活的线程池配置为性能调优提供了…

作者头像 李华
网站建设 2026/7/11 1:53:49

ROS2_control控制器配置YAML

前一节学习了launch的一些基本操作&#xff0c;接下来学习一下YAML&#xff0c;它负责这些控制器怎么工作 YAML是一种配置文件格式。ROS2常用它来写参数 最基础结构 节点名:ros__parameters:参数名: 参数值 例如我的remote_control.yaml vt13_chassis_remote_node:ros__pa…

作者头像 李华
网站建设 2026/7/11 1:50:46

AVL树 vs 红黑树:10万次插入/删除操作性能实测与 5 大选型指南

AVL树 vs 红黑树&#xff1a;10万次插入/删除操作性能实测与5大选型指南在数据库索引、语言标准库实现等需要高效查找的场景中&#xff0c;自平衡二叉搜索树是核心数据结构。AVL树和红黑树作为两种经典实现&#xff0c;各自有着独特的性能特点和适用场景。本文将基于10万次随机…

作者头像 李华
网站建设 2026/7/11 1:48:42

记录BUG:开发violet_agents过程中出现Python的循环导入

记录BUG&#xff1a;开发violet_agents过程中出现Python的循环导入 问题复现 在测试violet_agents包时&#xff0c;我们输入以下代码测试 from violet_agents import SimpleAgent from violet_agents import VioletAgentsLLM from dotenv import load_dotenvload_dotenv() agen…

作者头像 李华