Florence-2视觉语言模型简明教程

news2024/10/22 10:36:49

近年来,计算机视觉领域见证了基础模型的兴起,这些模型无需训练自定义模型即可进行图像注释。我们已经看到了用于分类的 CLIP [2]、用于对象检测的 GroundingDINO [3] 和用于分割的 SAM [4] 等模型——每个模型都在其领域表现出色。但是,如果我们有一个能够同时处理所有这些任务的单一模型会怎样?

在本教程中,我们将介绍 Florence-2 [1]——一种新颖的开源视觉语言模型 (VLM),旨在处理各种视觉和多模态任务,包括字幕、对象检测、分割和 OCR。

结合 Colab 笔记本,我们将探索 Florence-2 的零样本功能,以标注旧相机的图像。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模 

1、Florence-2简介

Florence-2 由微软于 2024 年 6 月发布。它旨在在单个模型中执行多项视觉任务。它是一个开源模型,在 Hugging Face 上根据宽松的 MIT 许可证提供。

1.1 背景

尽管 Florence-2 的规模相对较小,但其版本参数分别为 0.23B 和 0.77B,实现了最先进 (SOTA) 的性能。其紧凑的尺寸使其能够在计算资源有限的设备上高效部署,同时确保快速的推理速度。

该模型在一个名为 FLD-5B 的庞大高质量数据集上进行了预训练,该数据集包含 1.26 亿张图像上的 5.4B 条注释。这使得 Florence-2 无需额外训练即可在许多任务上表现出色。

Florence-2 模型的原始开源权重支持以下任务:

任务类别任务提示描述输入输出
图像字幕
为图像生成基本字幕图像文本
<DETAILED_CAPTION>为图像生成详细字幕图像文本
<MORE_DETAILED_CAPTION>为图像生成非常详细的字幕图像文本
<REGION_TO_CATEGORY>为指定边界框生成类别标签图像,边界框文本
<REGION_TO_DESCRIPTION>为指定边界框生成描述图像,边界框文本
对象检测检测对象并生成带标签的边界框图像边界框,文本
<DENSE_REGION_CAPTION>检测对象并生成带字幕的边界框图像边界框,文本
<CAPTION_TO_PHRASE_GROUNDING>使用边界框检测字幕中的短语并为其打上基础图像,文本边界框,文本
<OPEN_VOCABULARY_DETECTION>根据提供的文本检测对象(开放词汇表)图像、文本边界框、文本
<REGION_PROPOSAL>使用边界框提出感兴趣的区域图像边界框
分割<REFERRING_EXPRESSION_SEGMENTATION>根据文本描述生成分割多边形图像、文本多边形
<REGION_TO_SEGMENTATION>为给定的边界框生成分割多边形图像、边界框多边形
OCR从整个图像中提取文本图像文本
<OCR_WITH_REGION>提取具有位置的文本(边界框或四边形框)图像文本、边界框

可以通过微调模型来添加其他不受支持的任务。

1.2 任务格式

受大型语言模型 (LLM) 的启发,Florence-2 被设计为序列到序列模型。它将图像和文本指令作为输入,并输出文本结果。输入或输出文本可能表示纯文本或图像中的区域。区域格式因任务而异:

  • 边界框:用于对象检测任务的 <X1><Y1><X2><Y2>。标记表示框左上角和右下角的坐标。
  • 四边形框:用于文本检测的 <X1><Y1><X2><Y2><X3><Y3><X4><Y4>’,使用包围文本的四个角的坐标。
  • 多边形:用于分割任务的 <X1><Y1>...,<Xn><Yn>,其中坐标按顺时针顺序表示多边形的顶点。

1.3 架构

Florence-2 使用标准编码器-解码器转换器架构构建。以下是该过程的工作原理:

  • 输入图像由 DaViT 视觉编码器 [5] 嵌入。
  • 文本提示使用 BART [6] 嵌入,利用扩展的标记器和字嵌入层。
  • 视觉和文本嵌入都是连接的。
  • 这些串联嵌入由基于转换器的多模态编码器-解码器处理以生成响应。
  • 在训练过程中,该模型会最小化交叉熵损失,类似于标准语言模型。

Florence-2 架构图

1.4 代码实现

加载 Florence-2 模型和示例图像

安装并导入必要的库后(如随附的 Colab 笔记本中所示),我们首先加载 Florence-2 模型、处理器和相机的输入图像:

#Load model:
model_id = ‘microsoft/Florence-2-large’
model = AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=True, torch_dtype='auto').eval().cuda()
processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)

#Load image:
image = Image.open(img_path)
辅助函数

在本教程中,我们将使用几个辅助函数。最重要的是 run_example 核心函数,它从 Florence-2 模型生成响应。

run_example 函数将任务提示与任何其他文本输入(如果提供)组合成单个提示。使用处理器,它生成文本和图像嵌入作为模型的输入。神奇的事情发生在 model.generate 步骤中,在此生成模型的响应。以下是一些关键参数的细分:

  • max_new_tokens=1024:设置输出的最大长度,允许详细响应。
  • do_sample=False:确保确定性响应。
  • num_beams=3:在每个步骤中使用前 3 个最有可能的标记实现波束搜索,探索多个潜在序列以找到最佳整体输出。
  • early_stopping=False:确保波束搜索持续进行,直到所有波束达到最大长度或生成序列末尾的标记。

最后,使用processor.batch_decode和processor.post_process_generation对模型的输出进行解码和后处理,以生成最终的文本响应,由run_example函数返回。

def run_example(image, task_prompt, text_input=''):

    prompt = task_prompt + text_input

    inputs = processor(text=prompt, images=image, return_tensors=”pt”).to(‘cuda’, torch.float16)

    generated_ids = model.generate(
        input_ids=inputs[“input_ids”].cuda(),
        pixel_values=inputs[“pixel_values”].cuda(),
        max_new_tokens=1024,
        do_sample=False,
        num_beams=3,
        early_stopping=False,
    )

    generated_text = processor.batch_decode(generated_ids, skip_special_tokens=False)[0]
    parsed_answer = processor.post_process_generation(
        generated_text,
        task=task_prompt,
        image_size=(image.width, image.height)
    )

    return parsed_answer

此外,我们利用辅助函数来可视化结果(draw_bbox、draw_ocr_bboxes 和 draw_polygon)并处理边界框格式之间的转换(convert_bbox_to_florence-2 和 convert_florence-2_to_bbox)。这些可以在随附的 Colab 笔记本中探索。

2、任务

Florence-2 可以执行各种视觉任务。让我们探索它的一些功能,从图像字幕开始。

2.1 字幕生成相关任务

生成字幕

Florence-2 可以使用 <CAPTION>、 <DETAILED_CAPTION>或 <MORE_DETAILED_CAPTION>任务提示生成不同细节级别的图像字幕。

print (run_example(image, task_prompt='<CAPTION>'))
# Output: 'A black camera sitting on top of a wooden table.'

print (run_example(image, task_prompt='<DETAILED_CAPTION>'))
# Output: 'The image shows a black Kodak V35 35mm film camera sitting on top of a wooden table with a blurred background.'

print (run_example(image, task_prompt='<MORE_DETAILED_CAPTION>'))
# Output: 'The image is a close-up of a Kodak VR35 digital camera. The camera is black in color and has the Kodak logo on the top left corner. The body of the camera is made of wood and has a textured grip for easy handling. The lens is in the center of the body and is surrounded by a gold-colored ring. On the top right corner, there is a small LCD screen and a flash. The background is blurred, but it appears to be a wooded area with trees and greenery.'

该模型准确地描述了图像及其周围环境。它甚至识别了相机的品牌和型号,展示了其 OCR 能力。然而,在“<MORE_DETAILED_CAPTION>”任务中存在轻微的不一致,这是零样本模型的预期结果。

为给定的边界框生成标题

Florence-2 可以为边界框定义的图像特定区域生成标题。为此,它将边界框位置作为输入。您可以使用 <REGION_TO_CATEGORY>提取类别,或使用 <REGION_TO_DESCRIPTION>提取描述。

为了方便起见,我在 Colab 笔记本中添加了一个小部件,使您可以在图像上绘制边界框,并编写代码将其转换为 Florence-2 格式。

task_prompt = '<REGION_TO_CATEGORY>'
box_str = '<loc_335><loc_412><loc_653><loc_832>'
results = run_example(image, task_prompt, text_input=box_str)
# Output: 'camera lens'
task_prompt = '<REGION_TO_DESCRIPTION>'
box_str = '<loc_335><loc_412><loc_653><loc_832>'
results = run_example(image, task_prompt, text_input=box_str)
# Output: 'camera'

在这种情况下, <REGION_TO_CATEGORY> 识别了镜头,而 <REGION_TO_DESCRIPTION> 则不太具体。但是,这种性能可能会因不同的图像而异。

2.2 物体检测相关任务

为物体生成边界框和文本

Florence-2 可以识别图像中密集的区域,并提供它们的边界框坐标及其相关标签或标题。要提取带有标签的边界框,请使用“”任务提示:

results = run_example(image, task_prompt='<OD>')
draw_bbox(image, results['<OD>'])

要提取带有标题的边界框,请使用 <DENSE_REGION_CAPTION>任务提示:

task_prompt results = run_example(image, task_prompt= '<DENSE_REGION_CAPTION>')
draw_bbox(image, results['<DENSE_REGION_CAPTION>'])

左图显示“”任务提示的结果,右图演示“<DENSE_REGION_CAPTION>”

基于文本的物体检测

Florence-2 还可以执行基于文本的物体检测。通过提供特定的物体名称或描述作为输入,Florence-2 可以检测指定物体周围的边界框。

task_prompt = '<CAPTION_TO_PHRASE_GROUNDING>'
results = run_example(image,task_prompt, text_input=”lens. camera. table. logo. flash.”)
draw_bbox(image, results['<CAPTION_TO_PHRASE_GROUNDING>'])

CAPTION_TO_PHRASE_GROUNDING 任务,文本输入为:“lens. camera. table. logo. flash。”

Florence-2 还可以生成以文本 ( <REFERRING_EXPRESSION_SEGMENTATION>) 或边界框 ( <REGION_TO_SEGMENTATION>) 为基础的分割多边形:

results = run_example(image, task_prompt='<REFERRING_EXPRESSION_SEGMENTATION>', text_input=”camera”)
draw_polygons(image, results[task_prompt])
results = run_example(image, task_prompt='<REGION_TO_SEGMENTATION>', text_input="<loc_345><loc_417><loc_648><loc_845>")
draw_polygons(output_image, results['<REGION_TO_SEGMENTATION>'])

左图显示了 REFERRING_EXPRESSION_SEGMENTATION 任务的结果,其中“相机”文本作为输入。右图演示了 REGION_TO_SEGMENTATION 任务,其中镜头周围的边界框作为输入

2.​​4  OCR 相关任务

Florence-2 展示了强大的 OCR 功能。它可以使用“”任务提示从图像中提取文本,并使用“<OCR_WITH_REGION>”提取文本及其位置:

results = run_example(image,task_prompt)
draw_ocr_bboxes(image, results['<OCR_WITH_REGION>'])

3、结束语

Florence-2 是一种多功能的视觉语言模型 (VLM),能够在单个模型中处理多个视觉任务。其零样本能力在图像字幕、对象检测、分割和 OCR 等各种任务中都令人印象深刻。虽然 Florence-2 开箱即用,但额外的微调可以进一步使模型适应新任务或提高其在独特自定义数据集上的性能。


原文链接:Florence-2 VLM简明教程 - BimAnt

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

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

相关文章

互动装置如何助力乡村振兴展厅板块划分,实现展示效果最大化?

在这片广袤的土地上&#xff0c;每一个乡村都承载着深厚的历史与文化&#xff0c;如今&#xff0c;随着乡村振兴战略的深入实施&#xff0c;为乡村注入了新的活力&#xff0c;乡村振兴展厅的建设&#xff0c;也成为了这一奋斗目标的有力见证和辅助工具&#xff0c;我们今天就来…

从传统到智能,从被动监控到主动预警,解锁视频安防平台EasyCVR视频监控智能化升级的关键密钥

视频监控技术从传统监控到智能化升级的过程是一个技术革新和应用场景拓展的过程。智能视频监控系统通过集成AI和机器学习算法&#xff0c;能够实现行为分析、人脸识别和异常事件检测等功能&#xff0c;提升了监控的准确性和响应速度。这些系统不仅用于传统的安全防护&#xff0…

英语语法学习框架(考研)

一、简单句 英语都是由简单句构成&#xff0c;简单句共有五种基本句型&#xff1a;①主谓&#xff1b;②主谓宾&#xff1b;③主谓宾宾补&#xff1b;④主谓宾间宾&#xff08;间接宾语&#xff09;&#xff1b;⑤主系表&#xff1b; 其中谓语是句子最重要的部分&#xff0c;谓…

渗透实战 JS文件怎么利用

1.前言 关于JS在渗透测试中的关键作用&#xff0c;想必不用过多强调&#xff0c;在互联网上也有许多从JS中找到敏感信息从而拿下关键系统的案例。大部分师傅喜欢使用findsomething之类的浏览器插件&#xff0c;也有使用诸如Unexpected.information以及APIFinder之类的Burp插件…

【Linux】【命令】diff

diff DescriptionsArgumentsExamples直接使用diff命令-u 输出格式-c 输出格式并列输出-s 和 -q 脚本示例示例1&#xff1a;目录及文件差异 Descriptions diff命令用于对比两个文件或者两个文件夹的不同之处&#xff0c;求基本语法如下所示&#xff1a; diff [OPTION]... FILES…

免费插件集-illustrator插件-Ai插件-创建外接圆

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;实现创建图形中的创建外接圆功能。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/…

Java消息摘要:SHA验证数据完整性、密码的加密

1、SHA 算法家族 SHA&#xff08;Secure Hash Algorithm&#xff0c;安全散列算法&#xff09;是一个密码散列函数家族&#xff0c;被美国国家安全局&#xff08;NSA&#xff09;设计&#xff0c;并由美国国家标准与技术研究院&#xff08;NIST&#xff09;发布为联邦数据处理…

无人机之自主飞行关键技术篇

无人机自主飞行指的是无人机利用先进的算法和传感器&#xff0c;实现自我导航、路径规划、环境感知和自动避障等能力。这种飞行模式大大提升了无人机的智能化水平和操作的自动化程度。 一、传感器技术 传感器是无人机实现自主飞行和数据采集的关键组件&#xff0c;主要包括&a…

sql server 行转列及列转行

图1 图2 1.行转列 &#xff08;图1->图2&#xff09; 1.方法一 (数据库通用&#xff09;&#xff0c;使用max 加case when 函数 -- 行转列 图1->图2 SELECT name,MAX(CASE WHEN subject语文 THEN score ELSE 0 END) AS "语文",MAX(CASE WHEN subject数学 …

OpenSEMBA :一个用于电磁场模拟的开源软件框架

OpenSEMBA 是一个用于电磁场模拟的开源软件框架&#xff0c;主要针对时域有限差分法&#xff08;FDTD&#xff09;和其他数值方法。以下是 OpenSEMBA 的主要特点、功能和应用领域的详细介绍&#xff1a; 主要特点 开源平台 &#xff1a; OpenSEMBA 是一个开源项目&#xff0…

2025全网最全计算机毕业设计选题推荐:计算机毕设选题指导及避坑指南√

博主介绍&#xff1a;✌全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLM…

处理文件上传和进度条的显示(进度条随文件上传进度值变化)

成品效果图&#xff1a; 解决问题&#xff1a;上传文件过大时&#xff0c;等待时间过长&#xff0c;但是进度条却不会动&#xff0c;只会在上传完成之后才会显示上传完成 上传文件的upload.component.html <nz-modal [(nzVisible)]"isVisible" [nzTitle]"文…

跨浏览器免费书签管理系统

随着互联网信息的爆炸式增长&#xff0c;如何有效管理我们日常浏览中发现的重要网页&#xff0c;成为了每个重度互联网用户的需求。一个跨平台的书签管理网站能够帮助用户在不同设备之间无缝同步和管理书签。本文将分享如何使用 Python 和 SQLite 构建一个简单、易于维护的跨平…

MySQL数据库操作——(4)

目录 8 视图 8.1 常见的数据库对象 8.2 视图概述 8.2.1 为什么使用视图&#xff1f; 8.2.2 视图的理解 8.3 创建视图 8.3.1 创建单表视图 8.3.2 创建多表联合视图 8.3.3 基于视图创建视图 8.4 查看视图 8.5 更新视图的数据 8.5.1 一般情况 8.6 修改、删除视图 8.…

基于SpringBoot+Vue景区酒店点评系统【提供源码+答辩PPT+参考文档+项目部署】

&#x1f4a5; 这两年毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的JavaWeb项目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff01; ❗如何解决这类问题&#xff1f; 让我们能够顺利通过毕业&#xff0c;我也一直在不断思考、努力、精进。通过2024年…

计算机网络基本命令

实验内容&#xff1a; 1. **ipconfig命令** - **用途**&#xff1a;显示和配置TCP/IP网络设置。 - **常用选项**&#xff1a; - ipconfig&#xff1a;显示所有网络适配器的IP地址、子网掩码、默认网关等信息。 - ipconfig /all&#xff1a;显示所有网络适配器…

汽车预约维修系统ssm+论文源码调试讲解

2相关技术 2.1微信小程序 小程序是一种新的开放能力&#xff0c;开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播&#xff0c;同时具有出色的使用体验。尤其拥抱微信生态圈&#xff0c;让微信小程序更加的如虎添翼&#xff0c;发展迅猛。 2.2 MYSQL数据…

Redis在实践的关键点

Redis键值设计 优雅的key结构 Redis的Key虽然可以自定义,但最好遵循下面的几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id]长度不超过44字节不包含特殊字符例如:我们的登录业务,保存用户信息,其key可以设计成如下格式: 这样设计的好处: 可读性强避免key冲突…

通过比较list与vector在简单模拟实现时的不同进一步理解STL的底层

cplusplus.com/reference/list/list/?kwlist 当我们大致阅读完list的cplusplus网站的文档时&#xff0c;我们会发现它提供的接口大致上与我们的vector相同。当然的&#xff0c;在常用接口的简单实现上它们也大体相同&#xff0c;但是它们的构造函数与迭代器的实现却大有不同。…

YOLOv11[基础]】热力图可视化实践① | 视频版 | 输入为视频文件

目录 一 热力图 二 安装YOLOv11 三 实践 一 热力图 使用Ultralytics YOLO11生成的热图将复杂的数据转换为充满活力的彩色编码矩阵。这个可视化工具使用一系列颜色来表示不同的数据值,其中较暖的色调表示较高的强度