微调 Florence-2 - 微软的尖端视觉语言模型

Florence-2 是微软于 2024 年 6 月发布的一个基础视觉语言模型。该模型极具吸引力,因为它尺寸很小 (0.2B 及 0.7B) 且在各种计算机视觉和视觉语言任务上表现出色。

Florence 开箱即用支持多种类型的任务,包括: 看图说话、目标检测、OCR 等等。虽然覆盖面很广,但仍有可能你的任务或领域不在此列,也有可能你希望针对自己的任务更好地控制模型输出。此时,你就需要微调了!

本文,我们展示了一个在 DocVQA 上微调 Florence 的示例。尽管原文宣称 Florence 2 支持视觉问答 (VQA) 任务,但最终发布的模型并未包含 VQA 功能。因此,我们正好拿这个任务练练手,看看我们能做点什么!

预训练细节与模型架构

98ccecd0587f449e3674afd0908280f1.png
Florence-2 架构

无论执行什么样的计算机视觉任务,Florence-2 都会将其建模为序列到序列的任务。Florence-2 以图像和文本作为输入,并输出文本。模型结构比较简单: 用 DaViT 视觉编码器将图像转换为视觉嵌入,并用 BERT 将文本提示转换为文本和位置嵌入; 然后,生成的嵌入由标准编码器 - 解码器 transformer 架构进行处理,最终生成文本和位置词元。Florence-2 的优势并非源自其架构,而是源自海量的预训练数据集。作者指出,市面上领先的计算机视觉数据集通常所含信息有限 - WIT 仅有图文对,SA-1B仅有图像及相关分割掩码。因此,他们决定构建一个新的 FLD-5B 数据集,其中的每个图像都包含最广泛的信息 - 目标框、掩码、描述文本及标签。在创建数据集时,很大程度采用了自动化的过程,作者使用现成的专门任务模型,并用一组启发式规则及质检过程来清理所获得的结果。最终生成的用于预训练 Florence-2 模型的新数据集中包含了 1.26 亿张图像、超过 50 亿个标注。

SA-1Bhttps://ai.meta.com/datasets/segment-anything/

VQA 上的原始性能

我们尝试了各种方法来微调模型以使其适配 VQA (视觉问答) 任务的响应方式。迄今为止,我们发现最有效方法将其建模为图像区域描述任务,尽管其并不完全等同于 VQA 任务。看图说话任务虽然可以输出图像的描述性信息,但其不允许直接输入问题。

我们还测试了几个“不支持”的提示,例如 “<VQA>”、“<vqa>” 以及 “<Visual question answering>”。不幸的是,这些尝试的产生的结果都不可用。

微调后在 DocVQA 上的性能

我们使用 DocVQA 数据集的标准指标Levenshtein 相似度来测量性能。微调前,模型在验证集上的输出与标注的相似度为 0,因为模型输出与标注差异不小。对训练集进行 7 个 epoch 的微调后,验证集上的相似度得分提高到了 57.0。

Levenshtein 相似度https://en.wikipedia.org/wiki/Levenshtein_distance

我们创建了一个🤗 空间以演示微调后的模型。虽然该模型在 DocVQA 上表现良好,但在一般文档理解方面还有改进的空间。但我们仍然认为,它成功地完成了任务,展示了 Florence-2 对下游任务进行微调的潜力。我们建议大家使用The Cauldron数据集对 Florence-2 进行微调,大家可以在我们的 GitHub 页面上找到必要的代码。

  • 🤗 空间https://hf.co/spaces/andito/Florence-2-DocVQA

  • The Cauldronhttps://hf.co/datasets/HuggingFaceM4/the_cauldron

  • 我们的 GitHub 页面https://github.com/andimarafioti/florence2-finetuning

下图给出了微调前后的推理结果对比。你还可以至此处亲自试用模型。

模型试用地址https://hf.co/spaces/andito/Florence-2-DocVQA

266edf3c8245404862cb97421a8aa420.png
微调前后的结果

微调细节

由原文我们可以知道,基础模型在预训练时使用的 batch size 为 2048,大模型在预训练时使用的 batch size 为 3072。另外原文还说: 与冻结图像编码器相比,使用未冻结的图像编码器进行微调能带来性能改进。

我们在低资源的情况下进行了多组实验,以探索模型如何在更受限的条件下进行微调。我们冻结了视觉编码器,并在Colab的分别使用单张 A100 GPU (batch size 6) 、单张 T4 (batch size 1) 顺利完成微调。

Colab 链接https://colab.research.google.com/drive/1hKDrJ5AH_o7I95PtZ9__VlCTNAo1Gjpf?usp=sharing

与此同时,我们还对更多资源的情况进行了实验,以 batch size 64 对整个模型进行了微调。在配备 8 张 H100 GPU 的集群上该训练过程花费了 70 分钟。你可以在这里找到我们训得的模型。

模型地址https://hf.co/HuggingFaceM4/Florence-2-DocVQA

我们都发现 1e-6 的小学习率适合上述所有训练情形。如果学习率变大,模型将很快过拟合。

遛代码

如果你想复现我们的结果,可以在此处找到我们的 Colab 微调笔记本。下面,我们遛一遍在DocVQA上微调Florence-2-base-ft模型。

  • Colab 地址https://colab.research.google.com/drive/1hKDrJ5AH_o7I95PtZ9__VlCTNAo1Gjpf?usp=sharing

  • DocVQAhttps://hf.co/datasets/HuggingFaceM4/DocumentVQA

  • Florence-2-base-fthttps://hf.co/microsoft/Florence-2-base-ft

我们从安装依赖项开始。

!pip install -q datasets flash_attn timm einops

接着,从 Hugging Face Hub 加载 DocVQA 数据集。

import torch
from datasets import load_datasetdata = load_dataset("HuggingFaceM4/DocumentVQA")

我们可以使用 transformers 库中的 AutoModelForCausalLMAutoProcessor 类来加载模型和处理器,并设 trust_remote_code=True ,因为该模型尚未原生集成到 transformers 中,因此需要使用自定义代码。我们还会冻结视觉编码器,以降低微调成本。

from transformers import AutoModelForCausalLM, AutoProcessor
import torchdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = AutoModelForCausalLM.from_pretrained("microsoft/Florence-2-base-ft",trust_remote_code=True,revision='refs/pr/6'
).to(device)
processor = AutoProcessor.from_pretrained("microsoft/Florence-2-base-ft",trust_remote_code=True, revision='refs/pr/6')for param in model.vision_tower.parameters():param.is_trainable = False

现在开始微调模型!我们构建一个训练 PyTorch 数据集,并为数据集中的每个问题添加 <DocVQA> 前缀。

import torch from torch.utils.data import Datasetclass DocVQADataset(Dataset):def __init__(self, data):self.data = datadef __len__(self):return len(self.data)def __getitem__(self, idx):example = self.data[idx]question = "<DocVQA>" + example['question']first_answer = example['answers'][0]image = example['image'].convert("RGB")return question, first_answer, image

接着,构建数据整理器,从数据集样本构建训练 batch,以用于训练。在 40GB 内存的 A100 中,batch size 可设至 6。如果你在 T4 上进行训练,batch size 就只能是 1。

import os
from torch.utils.data import DataLoader
from tqdm import tqdm
from transformers import AdamW, get_schedulerdef collate_fn(batch):questions, answers, images = zip(*batch)inputs = processor(text=list(questions), images=list(images), return_tensors="pt", padding=True).to(device)return inputs, answerstrain_dataset = DocVQADataset(data['train'])
val_dataset = DocVQADataset(data['validation'])
batch_size = 6
num_workers = 0train_loader = DataLoader(train_dataset, batch_size=batch_size,collate_fn=collate_fn, num_workers=num_workers, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=batch_size,collate_fn=collate_fn, num_workers=num_workers)

开始训练模型:

epochs = 7
optimizer = AdamW(model.parameters(), lr=1e-6)
num_training_steps = epochs * len(train_loader)lr_scheduler = get_scheduler(name="linear", optimizer=optimizer,num_warmup_steps=0, num_training_steps=num_training_steps,)for epoch in range(epochs):model.train()train_loss = 0i = -1for inputs, answers in tqdm(train_loader, desc=f"Training Epoch {epoch + 1}/{epochs}"):i += 1input_ids = inputs["input_ids"]pixel_values = inputs["pixel_values"]labels = processor.tokenizer(text=answers, return_tensors="pt", padding=True, return_token_type_ids=False).input_ids.to(device)outputs = model(input_ids=input_ids, pixel_values=pixel_values, labels=labels)loss = outputs.lossloss.backward()optimizer.step()lr_scheduler.step()optimizer.zero_grad()train_loss += loss.item()avg_train_loss = train_loss / len(train_loader)print(f"Average Training Loss: {avg_train_loss}")model.eval()val_loss = 0with torch.no_grad():for batch in tqdm(val_loader, desc=f"Validation Epoch {epoch + 1}/{epochs}"):inputs, answers = batchinput_ids = inputs["input_ids"]pixel_values = inputs["pixel_values"]labels = processor.tokenizer(text=answers, return_tensors="pt", padding=True, return_token_type_ids=False).input_ids.to(device)outputs = model(input_ids=input_ids, pixel_values=pixel_values, labels=labels)loss = outputs.lossval_loss += loss.item()print(val_loss / len(val_loader))

你可以分别对模型和处理器调用 save_pretrained() 以保存它们。微调后的模型在此处,你还可以在此处找到其演示。

  • 模型链接https://hf.co/HuggingFaceM4/Florence-2-DocVQA

  • 示例地址https://hf.co/spaces/andito/Florence-2-DocVQA

    2cc9b35547030333924ea6481df35f9a.png  

    演示示例

总结

本文,我们展示了如何有效地针对自定义数据集微调 Florence-2,以在短时间内在全新任务上取得令人眼前一亮的性能。对于那些希望在设备上或在生产环境中经济高效地部署小模型的人来说,该做法特别有价值。我们鼓励开源社区利用这个微调教程,探索 Florence-2 在各种新任务中的巨大潜力!我们迫不及待地想在 🤗 Hub 上看到你的模型!

有用资源

  • 视觉语言模型详解https://hf.co/blog/zh/vlms

  • 微调 Colabhttps://colab.research.google.com/drive/1hKDrJ5AH_o7I95PtZ9__VlCTNAo1Gjpf?usp=sharing

  • 微调 Github 代码库https://github.com/andimarafioti/florence2-finetuning

  • Florence-2 推理 Notebookhttps://hf.co/microsoft/Florence-2-large/blob/main/sample_inference.ipynb

  • Florence-2 DocVQA 演示https://hf.co/spaces/andito/Florence-2-DocVQA

  • Florence-2 演示https://hf.co/spaces/gokaygo

感谢 Pedro Cuenca 对本文的审阅。


英文原文: https://hf.co/blog/finetune-florence2

原文作者: Andres Marafioti,Merve Noyan,Piotr Skalski

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch索引管理和生命周期管理

在大数据和搜索引擎技术日益成熟的今天&#xff0c;Elasticsearch作为一款基于Lucene构建的开源搜索引擎&#xff0c;凭借其强大的全文搜索能力、分布式架构以及可扩展性&#xff0c;在日志分析、实时监控、应用搜索等多个领域得到了广泛应用。然而&#xff0c;随着数据量的不断…

前缀和算法——部分OJ题详解

&#xff08;文章的题目解释可能存在一些问题&#xff0c;欢迎各位小伙伴私信或评论指点&#xff08;双手合十&#xff09;&#xff09; 关于前缀和算法 前缀和算法解决的是“快速得出一个连续区间的和”&#xff0c;以前求区间和的时间复杂度是O(N)&#xff0c;使用前缀和可…

【精品资料】大数据可视化平台数据治理方案(626页WORD)

引言&#xff1a;大数据可视化平台的数据治理方案是一个综合性的策略&#xff0c;旨在确保大数据的质量、安全性、可访问性和合规性&#xff0c;从而支持高效的数据分析和可视化过程。 方案介绍&#xff1a; 大数据可视化平台的数据治理方案是一个综合性的策略&#xff0c;旨在…

Netty HTTP

Netty 是一个高性能的异步事件驱动的网络应用程序框架&#xff0c;支持快速开发可维护的高性能协议服务器和客户端。它广泛应用于开发网络应用程序&#xff0c;如服务器和客户端协议的实现。Netty 提供了对多种传输类型的抽象&#xff0c;如 TCP/IP 和 UDP/IP 等&#xff0c;使…

微软的vscode和vs2022快捷键官网链接

vscode官方文档:https://code.visualstudio.com/docs/ vscode快捷键官方文档:https://code.visualstudio.com/docs/getstarted/keybindings vs2022官方文档:https://learn.microsoft.com/zh-cn/visualstudio/ide/?viewvs-2022 vscode快捷键官方文档:https://learn.microsoft.c…

Qt Style Sheets

样式表语法 Qt 样式表术语和语法规则几乎与 HTML CSS 的相同。如果您已经了解 CSS&#xff0c;您可能可以快速浏览此部分。 样式规则 样式表由一系列样式规则组成。样式规则由选择器和声明组成。选择器指定哪些小部件受该规则影响&#xff1b;声明指定应在小部件上设置哪些属性…

python基础知识点(蓝桥杯python科目个人复习计划70)

继续打基础&#xff0c;爬虫部分随笔 第一题&#xff1a;特别数的和 题目描述&#xff1a; 小明对数位中含有2、0、1、9的数&#xff08;不包含前导0&#xff09;很感兴趣&#xff0c;在1到40中这样的数共有28个&#xff0c;它们的和是574。 请问在1到n中&#xff0c;这样的…

提高Java程序效率:ImmutableList、Stream API 和 JSON序列化实战指南

常用列表构建方法&#xff1a; 1.ImmutableList.of() &#xff1a; 静态方法、不可变的列表 可以接受任意数量的参数&#xff0c;并将它们作为元素添加到新创建的列表中&#xff0c;但是一旦创建&#xff0c;集合的内容就不能被改变。在多线程环境中非常有用&#xff0c;因为…

Linux编程(通信协议---udp)

UDP&#xff08;用户数据报协议&#xff09;是一种无连接的网络协议&#xff0c;主要用于快速传输数据。以下是UDP协议的一些主要特点&#xff1a; 1. **无连接**&#xff1a;UDP是无连接的协议&#xff0c;这意味着在数据传输之前不需要建立连接。每个UDP数据包都是独立的&am…

OpenSearch分析CloudTrail日志的实用案例

在AWS环境中,CloudTrail日志提供了宝贵的洞察,而OpenSearch则为分析这些日志提供了强大的工具。本文将介绍15个使用OpenSearch分析CloudTrail日志的实用案例,帮助您更好地理解和管理AWS环境。 1. 监控用户登录活动 查询: eventName: "ConsoleLogin" 这个查询可…

Spark的动态资源分配算法

文章目录 前言基于任务需求进行资源请求的整体过程资源申请的生成过程详解资源申请的生成过程的简单例子资源调度算法的代码解析 申请资源以后的处理&#xff1a;Executor的启动或者结束对于新启动的Container的处理对于结束的Container的处理 基于资源分配结果进行任务调度Pen…

把关键字当作列名 不报错的方法 (数据库)

解决方法&#xff1a; 把新字段名加上双引号 ALTER TABLE 表名 RNAME COLUMN 旧列名 TO “新列名”在这个语句中&#xff0c;“新列名” 被双引号包围&#xff0c;这样数据库就能识别它作为一个标识符(例如列名)&#xff0c;而不是一个 SQL 关键字。

Django相关的基本操作

Django是一个高级的Python Web框架&#xff0c;它鼓励快速开发和干净、实用的设计。以下是Django使用方法的基本步骤&#xff0c;涵盖了从安装到项目部署的整个过程&#xff1a; 1. 安装Django 首先&#xff0c;你需要在你的Python环境中安装Django。可以通过pip命令来安装&a…

win10删除鼠标右键选项

鼠标右键菜单时&#xff0c;发现里面的选项特别多&#xff0c;找一下属性&#xff0c;半天找不到。删除一些不常用的选项&#xff0c;让右键菜单变得干净整洁。 1、按下键盘上的“winR”组合按键&#xff0c;调出“运行”对话框&#xff0c;输入“regedit”命令&#xff0c;点击…

探索Transformer:依存句法分析的新纪元

探索Transformer&#xff1a;依存句法分析的新纪元 依存句法分析是自然语言处理&#xff08;NLP&#xff09;领域中的一项基础任务&#xff0c;它旨在揭示句子中词语之间的依存关系。近年来&#xff0c;Transformer模型以其卓越的性能在依存句法分析领域引起了一场革命。本文将…

opencv—常用函数学习_“干货“_1

目录 一、图像文件 1. imread&#xff1a;读取图像文件 2. imwrite&#xff1a;写入图像文件 3. imshow&#xff1a;显示图像 4. VideoCapture&#xff1a;捕获视频 二、创建Mat 1、创建Mat对象 2、操作Mat对象 三、矩阵算术运算 矩阵加法 矩阵减法 矩阵乘法 矩阵…

linux后门教程

linux后门教程 alias 用法 系统默认别名&#xff1a;alias 设置别名&#xff1a;alias lsls -laih 删除别名&#xff1a;unalias ls **加参数&#xff1a;**alias ls‘ls -laih;pwd’ 注意 系统启动默认加载的配置文件 /etc/profile 切换用户就会执行/etc/profile /etc/bash…

Python 实验五 高级数据结构

一、实验目的 &#xff08;1&#xff09;掌握序列的基本操作 &#xff08;2&#xff09;掌握集合、字典的基本操作 二、实验环境 联网计算机一台/每人&#xff0c;内装Windows 7以上操作系统和安装Python 3.7集成开发环境IDLE。 三、实验内容 Sy5-1 列表实现。编写一个…

minIO集成springboot

问题 minIO与spring集成。 步骤 创建桶 创建key 找到创建账号页面&#xff0c;如下图&#xff1a; 点击创建&#xff0c;如下图&#xff1a; 设置如下权限&#xff1a; {"Version": "2012-10-17","Statement": [{"Effect": &q…

Google 地图参考手册

Google 地图参考手册 引言 Google 地图作为全球最受欢迎的地图服务之一,不仅提供了详细的地理信息和导航服务,还整合了丰富的商业信息、用户评价和街景视图。本手册旨在为用户提供一个全面而深入的Google地图使用指南,帮助用户更好地利用这一强大的工具。 目录 Google 地…