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

近年来,计算机视觉领域见证了基础模型的兴起,这些模型无需训练自定义模型即可进行图像注释。我们已经看到了用于分类的 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_inputinputs = 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.mzph.cn/news/882812.shtml

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

相关文章

将VSCode界面的显示语言改为简体中文,切换VScode界面的显示语言

VSCode界面默认的语言为英语&#xff0c;需要安装简体中文语言包&#xff0c;语言包为插件 &#xff08;Extension&#xff09;。 Step1: 点击左侧扩展按钮 Step2: 在搜索栏 &#xff0c;输入chinese Step3: 选择第一个简体中文&#xff0c;点击右下角install 按钮 Step4: 安装…

【K8S系列】Kubernetes node节点NotReady问题及解决方案详解【已解决】

Kubernetes 集群中的每个节点都是运行容器化应用的基础。当节点状态显示为 NotReady 时,意味着该节点无法正常工作,这可能会导致 Pod 无法调度,从而影响整个应用的可用性。本文将深入分析节点不健康的各种原因、详细的排查步骤以及有效的解决方案。 一、节点不健康的原因 节…

小程序视频SDK解决方案,提供个性化开发和特效定制设计

美摄科技作为视频处理技术的领航者&#xff0c;深知在这一变革中&#xff0c;每一个细微的创新都能激发无限可能。因此&#xff0c;我们精心打造了一套小程序视频SDK解决方案&#xff0c;旨在满足不同行业、不同规模客户的多元化需求&#xff0c;携手共创视频内容的璀璨未来。 …

推动AI技术研发与应用,景联文科技提供专业高效图像采集服务

景联文科技提供专业图像采集服务&#xff0c;涵盖多个领域的应用需求。 包含人体图像、人脸图像、手指指纹、手势识别、交通道路、车辆监控等图像数据集&#xff0c;计算机视觉图像数据集超400TB&#xff0c;支持免费试采试标。 高质量人像采集服务&#xff1a;支持不同光线条件…

Java最全面试题->Java基础面试题->JavaWeb面试题->Git/SVN面试题

文章目录 Git/SVN面试题Git和SVN有什么区别&#xff1f;SVN优缺点&#xff1f;Git优缺点&#xff1f;说一下Git创建分支的步骤&#xff1f;说一下Git合并的两种方法以及区别&#xff1f;Git如何查看文件的提交历史和分支的提交历史?什么是 git stash&#xff1f;什么是git sta…

纯前端实现语音合成并输出提示

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>语音合成</title><style>body {max-…

配置nginx服务通过ip访问多网站

1.关闭防火墙 [rootlocalhost wzj]# systemctl stop firewalld [rootlocalhost wzj]# sstenforce 0 bash: sstenforce: command not found... [rootlocalhost wzj]# setenforce 0 2&#xff0c;挂mnt [rootlocalhost wzj]# mount/dev/sr0/mnt bash: mount/dev/sr0/mnt: No suc…

Excel常用操作培训

1 Excel基本操作 1.1 常用快捷键 1.1.1快捷键操作工作簿、工作表 1.1.2快捷键操作 1.1.3单元格操作 1.1.4输入操作 2.1 常见功能描述 2.1.1 窗口功能栏 excel有很多功能可以用&#xff0c;新建文档后&#xff0c;可以最上方&#xff0c;可以看到所有的功能栏目 2.1.2 剪切板…

基于python智能推荐的丢失物品招领网站的制作,前端vue+django框架,协同过滤算法实现推荐功能

背景 基于 Python 智能推荐的丢失物品招领网站&#xff0c;通过前端 Vue 和后端 Django 框架的结合&#xff0c;为用户提供便捷、个性化的服务。该系统的核心在于实现智能推荐功能&#xff0c;采用协同过滤算法来提高用户体验&#xff0c;帮助用户更快找到合适的失物或招领信息…

爬虫日常实战

爬取美团新闻信息&#xff0c;此处采用两种方法实现&#xff1a; 注意点&#xff1a;因为此处的数据都是动态数据&#xff0c;所以一定要考虑好向下滑动数据包会更新的情况&#xff0c;不然就只能读取当前页即第一页数据&#xff0c;方法一通过更新ajax数据包网址页数&#xf…

二叉树展开为链表

二叉树展开为链表 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…

文件处理新纪元:微信小程序的‘快递员’与‘整理师’

嗨&#xff0c;我是中二青年阿佑&#xff0c;今天阿佑将带领大家如何通过巧妙的文件处理功能&#xff0c;让用户体验从‘杂乱无章’到‘井井有条’的转变&#xff01; 文章目录 微信小程序的文件处理文件上传&#xff1a;小程序的“快递服务”文件下载&#xff1a;小程序的“超…

Sigrity Power SI Model Extraction模式如何提取电源网络的S参数和阻抗操作指导(一)

Sigrity Power SI Model Extraction模式如何提取电源网络的S参数和阻抗操作指导(一) Sigrity PowerSI是频域电磁场仿真工具,以下图为例介绍如果用它观测电源的网络的S参数以及阻抗的频域曲线. 观测IC端电源网络的自阻抗 1. 用powerSi.exe打开该SPD文件

AWD入门

一、简介 AWD(Attack With Defense&#xff0c;攻防兼备)模式。你需要在一场比赛里要扮演攻击方和防守方&#xff0c;攻者得分&#xff0c;失守者会被扣分。也就是说攻击别人的靶机可以获取 Flag 分数时&#xff0c;别人会被扣分&#xff0c;同时你也要保护自己的主机不被别人…

强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断

强心剂&#xff01;EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断 目录 强心剂&#xff01;EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EEMD-MPE-KPCA-LSTM(集合经验模态分解-多尺…

【JAVA】第三张_Eclipse下载、安装、汉化

简介 Eclipse是一种流行的集成开发环境&#xff08;IDE&#xff09;&#xff0c;可用于开发各种编程语言&#xff0c;包括Java、C、Python等。它最初由IBM公司开发&#xff0c;后来被Eclipse Foundation接手并成为一个开源项目。 Eclipse提供了一个功能强大的开发平台&#x…

IDEA如何给debug断点加上筛选条件判断

前言 我们在使用IDEA开发Java应用时&#xff0c;经常是需要进行代码调试的&#xff0c;这就需要打断点进行操作。但有些时候&#xff0c;我们只希望在符合某种条件的情况下&#xff0c;才去到这个断点&#xff0c;不符合的情况下&#xff0c;直接跳过断点&#xff0c;这其实也…

【linux】线程 (三)

13. 常见锁概念 &#xff08;一&#xff09;了解死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程占有的&#xff0c;且不释放的资源&#xff0c;而处于的一种永久等待状态 &#xff08;二&#xff09;死锁四个必要条件 互斥条件…

RK3568平台开发系列讲解(调试篇)debugfs 文件系统

🚀返回专栏总目录 文章目录 一、debugfs使用案例二、enable debugfs三、debugfs API3.1、创建目录3.2、创建文件3.3、帮助函数四、使用示例📢Linux 上有一些典型的问题分析手段,从这些基本的分析方法入手,你可以一步步判断出问题根因。这些分析手段,可以简单地归纳为下图…

Linux·文件与IO

1. 回忆文件操作相关知识 我们首先回忆一下关于文件的一些知识。 如果一个文件没有内容&#xff0c;那它到底有没有再磁盘中存在&#xff1f;答案是存在&#xff0c;因为 文件 内容 属性&#xff0c;即使文件内容为空&#xff0c;但属性信息也是要记录的。就像进程的…