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.0fromtypesimportSimpleNamespace# 从数据集后台下载并解压数据集后,修改 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,entrytrain_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 信息抽取微调实战:从货盘清单图片到结构化数据-本文