多模态MLLM都是怎么实现的(12)-Florence-2

文摘   2024-07-30 22:25   新加坡  

      最近一直在打艾尔登法环DLC,疏于更新了,罪过罪过,今天把拉塔恩给过了,也该更新了,停更期间,催更的信息主要是啥时候更新GPU系列的第五篇,不是不更,是刚打完,正好有客户要听Florence-2,我连写slide带详细的讲一下,也就有了这篇文章,GPU系列5马上就更。

      闲言少叙,那么先更一张我打败拉塔恩和米凯拉的照片(极度讨厌米凯拉,白瞎拉塔恩了)

       这把真的闲言少叙了,那么好,开始.....       

       Florence-2之前在这个系列的第10章简单写过,它能干啥,现在分析一下它的一些特点。

•本质:Series to Series, 所以还是NLP的 VLM

•数据集的能力(一般数据集整不了这个活儿)

•模型重点处理空间层次(理解从粗到细的不同层次的细节)和语义粒度(从高层次到细微描述的捕捉)

•训练方式上有一定创新

•Zero Shot和FT都很优秀

首先我们针对传统CV的标准任务,简单说两句:

目标检测

区域卷积神经网络(R-CNN):早期的方法如 R-CNN 系列(R-CNN、Fast R-CNN、Faster R-CNN)通过在图像中生成候选区域,然后使用 CNN 对每个区域进行分类和回归,以确定目标的类别和位置。

单阶段检测器:如 YOLO(You Only Look Once)和 SSD(Single Shot MultiBoxDetector),直接从图像中预测目标的类别和位置,具有较快的检测速度。

图像分割

全卷积网络(FCN):将传统的 CNN 改造为全卷积网络,用于密集像素级别的预测。FCN 用于语义分割,通过将卷积层的输出上采样到原始图像尺寸,实现对每个像素的分类。

U-Net:一种常用于医学图像分割的架构,它结合了下采样和上采样路径,以更精确地恢复空间信息。

 那VLM这东西本身有啥优点呢?

相比传统的单模态模型,VLM多模态模型在处理图像数据时,通常更关注特征的语义一致性,而不是输入的几何尺寸一致性。现代多模态融合技术,如Transformer等架构,也倾向于使用注意力机制来聚合不同模态的特征,这些机制比起传统CV对输入特征的尺寸有较强的鲁棒性。

VLM的弱点就是这些都干不了,展开说一下。

对象检测(Bounding Boxes):

•定位对象:边界框提供了对象在图像中的具体位置和尺寸,这对于后续的分析和处理非常关键。例如,在自动驾驶中,知道行人或其他车辆的准确位置有助于做出驾驶决策。

•计算和管理:边界框简化了许多计算和管理任务,例如在监控中计算目标移动轨迹或在库存管理中统计商品数量。

图像分割(Masks):

•精确的边界:遮罩提供了对象的精确轮廓,这在需要详细了解对象形状和表面特征的任务中非常有用,例如医学图像分析中肿瘤的体积测量。

•像素级分析:遮罩允许对对象的每个像素进行分析和处理,例如颜色、纹理等,这对于精细化操作和高精度需求的应用至关重要。

•用户交互:在某些应用中,边界框和遮罩可以用于用户交互。例如,用户可以点击边界框或遮罩来选择对象,进行进一步的操作,如编辑或分析。

•区域操作:在许多任务中,需要对图像的特定区域进行处理,如图像增强、去噪、特效添加等。边界框和遮罩明确指定了这些操作的目标区域。

 这本来不能干的事,同为VLM的Florence-2为啥就可以了呢?

我们从以下2个部分来解释:

1- 造数据

2-训练方式

其实啥模型有点特点也都是这两点。

首先说造数据,也就是它的dataset,FLD-5B dataset。它造这个数据集的主要原因是现在市面上的dataset不太满足它的训练要求。

视觉注释的稀缺:现有的视觉数据集,如 ImageNet、COCO 和 Flickr30k 等,尽管标注精细,但由于任务和应用的专用性限制,难以捕捉到全面的空间层次和语义粒度信息。这种约束使得大规模生成全面注释变得至关重要

•统一预训练框架的缺乏:传统模型在处理如目标检测、语义分割、图像标注等任务时表现良好,但在面对任务不可知(task-agnostic)的场景时,无法很好地适应。为了解决这一问题,开发一个能够在各种视觉任务中适应的综合性模型是必要的(这个是讲模型那部分的,论文里提到了,我就放这了。)

•FLD-5B数据集的收集:Florence-2的核心在于利用多任务学习和丰富的视觉注释来实现通用的表示。FLD-5B 数据集是通过自动化注释引擎收集的,其中包括 5.4 亿个注释,覆盖 1.26亿张图像。注释引擎的第一部分使用专门的模型进行协作和自动化注释,避免传统的手工注释。第二部分则通过训练有素的模型进一步过滤这些注释,确保其准确性和无偏性

它这个dataset主要分为3个维度:

1.语义粒度(Semantic Granularity)

•细粒度语义(Fine-grained Semantic):包括详细的描述性注释,如“一个女人骑着红色自行车,背景中有一辆红色汽车”,描述了场景中的多个对象及其属性。

•粗粒度语义(Coarse Semantic):包括更简洁的描述,如“一个女人骑着自行车沿街道前行,旁边有一辆红色汽车”。这种注释提供了少量的上下文信息,但不如细粒度语义详细。

•无语义(None Semantic):包括最基本的标注,如简单的对象分类(如“人”、“车”、“道路”),没有提供更多的语义信息。

2.空间层次(Spatial Hierarchy)

•图像级(Image-level):包括整体的图像分类或标签。

•区域级(Region-level):涉及图像中特定区域的标注,这些区域通常由边界框或区域建议方法定义。

•像素级(Pixel-level):涉及更细粒度的标注,如语义分割,提供了对象的精确轮廓或遮罩。

3. 注释类型

分类(Classification):最简单的形式,仅对图像进行类别标注。

•视觉定位和目标检测(Visual Grounding & Object Detection):不仅识别对象,还确定其在图像中的位置。细粒度的描述可以关联到特定对象(如红色自行车)。

•区域建议(Regional Proposal):提出可能包含对象的图像区域,通常用于进一步的检测或分割。

•分割(Segmentation):提供对象的像素级分割,标识对象的边界和形状。

•短语分割(Phrase Segmentation):将图像中的区域与描述性短语关联起来,例如“街上的红色老式汽车”。

刚才我们聊了,这东西没现成的,所以它得自己做,基于现有的数据进行清洗和标注。

所以就涉及到了数据打标的流程。

目标

数据打标的主要目标是生成可以支持多任务学习的综合性标注。标注覆盖了文本、区域-文本对和文本-短语-区域三种类型。

数据打标流程

打标工作流程分为三个主要阶段,每个阶段都确保标注的准确性和质量:

1.初始标注:使用专门的模型进行标注。这些模型包括离线模型和在线服务,专门用于特定类型的标注。

2.数据过滤和增强:纠正错误并移除不相关的标注。

3.迭代数据精炼:通过多次迭代不断提高标注质量。

1.初始标注(Initial Annotation with Specialists)

图像收集:首先从各种来源收集图像。

专家模型标注:使用多种专门的模型对图像进行初步标注。这些模型包括:

•Azure OCR API:用于文字识别(OCR),提取图像中的文本信息。

Caption Model:生成图像描述(图像字幕),提供文本描述。

Grounding Model:定位模型,将文本描述中的元素与图像中的特定区域联系起来。

•Object/Proposal Detection:检测图像中的对象,并提出潜在的对象区域。

Segmentation Model:生成图像分割掩码,精确划分图像中的不同区域。

2.数据过滤与增强(Data Filtering and Enhancement)

目的:提高标注数据的质量和准确性,去除错误和不相关的注释(用各种工具如DiHT,Spacy啥的)。

LMM Annotator:大型语言模型注释器,用于生成文本注释。

LMM Aggregator:聚合器,整合多种模型的注释结果。

Text Filter:文本过滤器,用于过滤不相关或低质量的文本注释。

Region Score:区域评分,用于评估标注区域的准确性和相关性。

•NMS(Non-MaximumSuppression):非极大值抑制,用于去除冗余或重叠的对象检测框。

Blacklist:黑名单机制,用于过滤掉不需要的或不相关的标注。

Florence-1:早期版本的 Florence 模型,可能用于参考或基准比较。

3. 迭代数据精炼(Iterative Data Refinement)

目的:通过多轮迭代精炼数据,进一步提高标注的质量和覆盖范围。

过程:

•小规模增强数据微调:使用小规模的高质量数据对模型进行微调,提升模型的精度。

大规模数据训练:使用大量数据进行训练,以提高模型的泛化能力。

4.最终注释(Final Annotations)

结果:经过多个阶段和模型处理,生成的最终数据集包含各种类型的注释:

简要描述(Brief Caption):简短的图像描述。

详细描述(Detailed Caption):详细的图像描述。

更详细的描述(More Detailed Caption):更细粒度的图像描述。

分割(Segmentation):像素级分割掩码。

OCR:光学字符识别结果。

对象检测(Object Detection):对象识别和定位。

区域建议(Region Proposal):提出潜在对象的区域。

密集描述(Dense Caption):详细描述图像中的多个对象或场景。

因为这种极其全涵盖,和复杂的dataset才能为后面的统一训练界面打下好的基础,大家是不是也想要这个数据集呢?不好意思,模型开源,数据集不开源

然后讲它的这个综合多任务学习,也就是说一个训练任务,训练完了以后,模型能match N种下游任务。

为了开发一个通用的视觉基础模型,论文提出了多任务学习的方法,旨在捕捉不同层次的语义和空间理解。每个任务目标都针对视觉理解的特定方面。


1.图片级理解(Image-level Understanding):

1.任务:捕捉图像的高级语义,通过语言描述提供对图像的全面理解。

2.应用:图像分类、标注、视觉问答等任务。帮助模型理解图像的整体上下文和语义关系。

2.区域/像素级识别(Region/Pixel-level Recognition)

1.任务:识别详细的对象及其在图像中的位置,捕捉对象之间及其与环境的空间关系。

2.应用:目标检测、分割、指代表达理解等。这些任务要求模型精确定位图像中的细节对象和区域。

3.精细语义对齐(Fine-grained Visual-Semantic Alignment)

1.任务:需要对图像和文本的精细理解。包括定位文本短语(如对象、属性或关系)对应的图像区域。

2.应用:这项任务挑战模型去理解视觉细节的局部特征及其语义上下文,以及视觉元素和文本之间的互动。

多任务提示(Multi-task Prompts)

多任务提示提供了模型需要回答的多个问题或执行的任务。这些任务涵盖了从简单描述到复杂对象和区域的识别:

1.图像描述:例如,“图像描述了什么?”这类任务要求模型生成一个总体的图像描述。

2.对象定位:如“定位图像中的对象”,要求模型识别和标注图像中的具体对象。

3.短语定位:例如,“在描述中定位短语:一个女人在骑自行车”,要求模型将文本描述与图像中的特定区域关联起来。

4.区域描述:例如,“区域 (0.41, 0.15, 0.63, 0.73) 描述了什么?”要求模型识别和描述特定的图像区域。

5.多边形掩码:例如,“区域 (0.41, 0.15, 0.63, 0.73) 的多边形掩码是什么?”要求模型生成精确的像素级对象分割。

大家可能看到4和5这种比较奇怪,这是啥,这就是坐标,下面不分来讲。

任务形式化(Task Formulation)

这部分解释了如何将不同的视觉任务转换为统一的序列到序列问题:

文本任务:当提示或答案是纯文本格式时,模型将其作为序列到序列任务进行处理。

区域特定任务:对于涉及特定区域的任务,使用量化坐标的位置信令(location tokens)来表示区域。这些任务需要标记图像中的具体位置,如对象检测或密集区域描述。

区域表示的类型:

•边界框表示(Box Representation):用于对象检测等任务,表示为顶点坐标(x0, y0, x1, y1)。

四边形框表示(Quad Box Representation):用于文本检测和识别,四边形框的四个顶点坐标。

多边形表示(Polygon Representation):用于细粒度的分割任务,使用多边形的顶点坐标来表示区域。

用这些x,y的坐标,不就能整出来OD和seg的效果了吗,就是这么来的。

另外值得说的就是它的visual-encoder,这个还是比clip啥的要先进一些

视觉编码器(Vision Encoder)

使用 DaViT(Dual-AttentionVision Transformer)作为视觉编码器,处理输入图像并生成视觉令牌嵌入(visual token embeddings)。这些嵌入包含图像的关键视觉特征。

DaViT这里就不细讲了,这块如果大家感兴趣点赞到30个,我就单开一张细讲。

简单说就是你们平时玩的attention都是token级别的,dual-attention就是两个么,哪两个,除了token的p级别还有channel的C级别。

其实Yolov8开始有人就引入 daual attentioion机制了

双重注意力机制(Dual-Attention Mechanism

双重注意力机制的核心思想是使用两种不同类型的注意力机制来捕捉图像的不同方面的信息,从而提高模型的表达能力。

空间注意力(Spatial Attention)

•功能:空间注意力用于关注图像中不同空间位置的特征。这种注意力机制可以帮助模型捕捉图像中重要的区域和对象位置,忽略背景或不相关的部分。

•实现:通过计算每个像素或图像块的注意力权重,模型可以动态调整对这些位置的关注程度,从而提取出重要的视觉信息。

通道注意力(Channel Attention)

•功能:通道注意力关注的是图像特征图中的不同通道,这些通道通常代表不同的特征类型(如颜色、边缘、纹理等)。通道注意力机制使模型能够权衡和强调不同通道中的信息。

•实现:通过对特征图的每个通道计算注意力权重,模型可以选择性地增强或抑制特定通道的特征。

DaViT 的优势

•丰富的特征表示:通过结合空间和通道注意力,DaViT 能够从图像中提取更加丰富和多样的特征表示。这对于复杂的视觉任务,如细粒度的图像分类、目标检测和语义分割等非常有益。

•动态特征调整:双重注意力机制允许模型在不同的任务和输入情况下动态调整其特征提取策略,从而适应各种视觉任务的需求。

目标函数:使用标准的交叉熵损失函数来优化模型的所有任务。损失函数 L 计算输入 x(图像和提示组合)和目标 y 之间的差异,通过最小化损失函数来优化模型参数 θ。


前3个表是拿经过特定领域数据训练的模型和florence2的B和L级别相比(B是0.23 L是0.7,都嗷嗷小)除了coco的数据集以外,其他的,没经过微调的florence-2都比特定领域数据训练的模型表现好,尤其是标准视觉的特定区域的CV任务,可能VQA要差点(VQA这玩意和模型大小的差距还是挺明显的)

但是看图6

图 6 展示了 Florence-2 模型与其他模型在训练效率上的对比,横坐标为训练的 epoch数,纵坐标为相应的性能指标。

图表说明:

1.(a) Mask-RCNN 在COCO检测任务上的mAP

Florence-2模型展示了6.9 点的 mAP 提升,相对于其他模型有显著的效率提升(4倍效率增益)。

2.(b) DINO 在COCO检测任务上的mAP:

Florence-2在检测任务上的表现优于DINO,表现出 5.5 点的提升和 4倍的效率增益。

3.(c)UpperNet在ADE20K语义分割任务上的mIoU:

Florence-2 v2 模型展示了5.9 点的 mIoU 提升,效率提升同样显著。

还是非常能打的。

写了这么多很详细,也补偿一下各位读者,够读几分钟的了,后面我一定快更,毕竟游戏打完了,黑神话暂时不玩,等媒体和玩家的评价。



熵减AI
科技类博客