当前位置:   article > 正文

Florence-2模型:开启统一视觉基础模型的新篇章_florence-v2

florence-v2


1、引言

在人工智能领域,视觉任务一直是一个重要的研究和应用方向。随着技术的发展,我们见证了从单一任务模型到多任务学习模型的转变。微软Azure AI团队推出的Florence-2模型正是这一转变的杰出代表。本文将深入探讨Florence-2模型的技术细节、应用场景以及实际代码实践,为读者提供一个全面的认识。

2、Florence-2模型简介

模型概述
Florence-2是由微软Azure AI团队开发的一款多功能、统一的视觉模型。它通过统一的提示处理不同的视觉任务,表现出色且优于许多大型模型。Florence-2的设计理念是将文本提示作为任务指令,并以文本形式生成理想的结果,无论是字幕、对象检测、基础还是分割。

技术亮点
Florence-2模型采用了序列到序列架构,集成了图像编码器和多模态编码器-解码器,使其能够在零样本和微调设置中表现出色。此外,Florence-2使用FLD-5B数据集进行训练,该数据集包含5.4亿张图像中的126亿条注释,为模型提供了大规模、高质量的注释数据。

3、技术架构解析

序列到序列学习范式
Florence-2模型采用序列到序列框架,将各种视觉任务视为翻译问题,模型接收输入图像和特定任务提示,并生成相应的输出响应。
视觉编码器
Florence-2使用DaViT作为视觉编码器,将输入图像转换为视觉标记嵌入,同时捕捉空间和语义信息。
多模态编码器-解码器
模型的核心是其基于变换器的多模态编码器-解码器,能够同时处理视觉和语言标记嵌入,实现文本和视觉信息的无缝融合。
在这里插入图片描述

4、应用场景探索

4.1 计算机视觉任务

Florence-2模型能够处理包括字幕、物体检测、视觉接地和指代表达理解等在内的多种计算机视觉任务。

4.2 多任务学习

Florence-2的多任务学习设置使其能够应对任务多样性挑战,提供统一的、基于提示的表示方法。

5、性能评估与比较

为了全面评估Florence-2模型的性能,研究人员在多个视觉任务上进行了广泛的测试,并将结果与其他先进模型进行了比较。

5.1 零样本学习迁移

在ImageNet-1K数据集和11个下游数据集上,研究人员评估了Florence-2模型的零样本学习迁移能力。表1展示了这12个数据集的评估结果。与CLIP ResNet、CLIP Vision Transformer模型以及FILIP-ViT等模型相比,Florence-2在其中9个数据集上展现了卓越的性能。特别是在ImageNet-1K上的零样本迁移能力,Florence-2实现了显著的提升,top-1准确率达到83.74%,比现有最佳结果(SOTA)高出5.6%,而top-5准确率为97.18%。
在这里插入图片描述

5.2 线性评估

线性评估涵盖了11个分类基准,这些基准同样适用于零样本分类迁移。Florence-2与SimCLRv2、ViT、Noisy Student和CLIP等具有SOTA性能的模型进行了比较。结果显示,Florence-2在多数基准测试中优于现有SOTA结果,但在CIFAR10和CIFAR100这两个数据集上,其性能略逊于EfficientNet-L2。
在这里插入图片描述

5.3 微调评估

在ImageNet ILSVRC-2012基准上,研究人员评估了Florence-2模型持续微调的性能。如表3所示,与BiT和ALIGN等几种模型相比,Florence-2在Top-1和Top-5准确率方面均展现出了优势。尽管Florence-2的结果略低于SOTA模型,但考虑到其模型和数据规模仅为SOTA模型的三分之一,这一成绩仍然令人印象深刻。
在这里插入图片描述

6、模型推理

import requests

from PIL import Image
from transformers import AutoProcessor, AutoModelForCausalLM
from modelscope import snapshot_download


model_dir = snapshot_download("AI-ModelScope/Florence-2-base")
model = AutoModelForCausalLM.from_pretrained(model_dir, trust_remote_code=True)
processor = AutoProcessor.from_pretrained(model_dir, trust_remote_code=True)

prompt = "<OD>"

url = "http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png"
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(text=prompt, images=image, return_tensors="pt")

generated_ids = model.generate(
    input_ids=inputs["input_ids"],
    pixel_values=inputs["pixel_values"],
    max_new_tokens=1024,
    do_sample=False,
    num_beams=3,
)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=False)[0]

parsed_answer = processor.post_process_generation(generated_text, task="<OD>", image_size=(image.width, image.height))

print(parsed_answer)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

7、模型微调

7.1 环境准备

使用ms-swift工具箱对Florence-2模型进行微调,支持多种大语言模型和多模态大模型的微调、推理等操作。

ms-swift是魔搭社区官方提供的LLM工具箱,支持250+大语言模型和35+多模态大模型的微调、推理、量化、评估和部署,包括:Qwen、Llama、GLM、Internlm、Yi、Baichuan、DeepSeek、Llava等系列模型。

代码开源地址:https://github.com/modelscope/swift

# 设置pip全局镜像 (加速下载)
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
# 安装ms-swift
git clone https://github.com/modelscope/swift.git
cd swift
pip install -e '.[llm]'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

7.2 数据集处理

以refcoco数据集为例,展示如何对数据集中的bounding box进行处理,并保留Florence-2模型的输出格式。
1)对数据集中的boundingbox做了相应的转换, 转换逻辑可以用以下方法表示

def process_boundingbox(image, bbox):
    """
    Process bounding box coordinates relative to the image dimensions.

    Args:
        image (PIL.Image): Image object.
        bbox (list): List of length four [x1, y1, x2, y2], representing the coordinates of the bounding box's bottom-left (x1, y1) and top-right (x2, y2) corners in pixel coordinates.

    Returns:
        list: A list containing a formatted string representing the processed bounding box. The string format is '<loc_x1><loc_y1><loc_x2><loc_y2>'.
    """
    width = image.width
    height = image.height
    x1, y1, x2, y2 = [
        int(coord / dim * 999) for coord, dim in zip(bbox, [width, height, width, height])
    ]
    return [f'<loc_{x1}><loc_{y1}><loc_{x2}><loc_{y2}>']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2)保留Florence-2模型针对特定任务的提示(prompt),例如输出给定目标的bounding box任务,使用原模型的<OPEN_VOCABULARY_DETECTION>提示。将数据集中的模型输入提示转换为原模型支持的提示,转换逻辑可以用以下方法表示:

def process_query(object):
    """
    Process the query for the model to search for the target.
    
    Args:
        object (str): The target to be searched by the model.
        
    Returns:
        str: The model's input prompt formatted as "<OPEN_VOCABULARY_DETECTION>{object}".
    """
    return f"<OPEN_VOCABULARY_DETECTION>{object}"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3)保留Florence-2模型的输出格式, 例如输出给定目标的bounding box任务, Florence模型以<目标>的格式输出, 在处理数据集的过程中可以同样保留这样的格式

def process_response(object, processed_bbox):
    """
    Combine the object and processed bounding box into a unified response.
    
    Args:
        object (str): The object or target related to the response.
        processed_bbox (str): The processed bounding box information.
        
    Returns:
        str: A unified response string combining the object and processed bounding box.
    """
    return object + processed_bbox
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

完整的数据集处理逻辑如下

from PIL import Image
image_path = "/coco2014/train2014/COCO_train2014_000000009231.jpg"
object = "top left suitcase"
bbox = [3,8,380,284]
image = Image.open(image_path)
processed_bbox = process_boundingbox(image, bbox)
query = process_query(object) # <OPEN_VOCABULARY_DETECTION>top left suitcase
response = process_response(object, processed_bbox) # top left suitcase<loc_4><loc_18><loc_593>,<loc_666>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

ms-swift内置了数据集处理逻辑, 对于给定目标输出bounding box的目标检测任务, 你可以使用内置的refcoco-unofficial-grounding数据集。对于给定boundingbox输出目标的目标检测任务, 数据集处理逻辑类似。你可以使用内置的refcoco-unofficial-caption数据集。

7.3 微调操作

以训练2000份refcoco数据为例, 训练Florence-2-large-ft模型的目标检测能力
这里使用–lora_target_modules ALL来训练整体模型的所有线性层, 你也可以通过指定–lora_target_modules Default来只训练模型的qkv层减少显存占用

# Experimental environment: 4090
# 7GB GPU memory
CUDA_VISIBLE_DEVICES=0 swift sft \
    --model_type florence-2-large-ft \	
    --dataset refcoco-unofficial-grounding#2000 \
    --lora_target_modules ALL

# 2.3GB GPU memory
CUDA_VISIBLE_DEVICES=0 swift sft \
    --model_type florence-2-large-ft \
    --dataset refcoco-unofficial-grounding#2000 \
    --lora_target_modules DEFAULT
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

训练损失可视化:
在这里插入图片描述

7.4 微调后模型的推理

命令行推理

# Experimental environment: 4090
CUDA_VISIBLE_DEVICES=0 swift infer \
    --ckpt_dir output/florence-2-large-ft/vx-xxx/checkpoint-xxx \
    --stream false \
    --max_new_tokens 1024
  • 1
  • 2
  • 3
  • 4
  • 5

推理结果

<<< <OPEN_VOCABULARY_DETECTION>cat
Input a media path or URL <<< /coco2014/train2014/COCO_train2014_000000009231.jpg
{'Locate cat in the image.': 'cat<loc_643><loc_290><loc_998><loc_773>'}
--------------------------------------------------
<<< <OPEN_VOCABULARY_DETECTION>dog laying closest to laptop
Input a media path or URL <<< /coco2014/train2014/COCO_train2014_000000171435.jpg
{'Locate dog laying closest to laptop in the image.': 'dog laying closest to laptop<loc_106><loc_449><loc_660>,<loc_627>'}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

7.5 推理可视化

我们可以对模型输出的 bounding box 进行可视化, 参考代码如下

from PIL import Image, ImageDraw
import re

def visualize_bounding_box(img, bbox):
    img_width, img_height = img.size
    numbers = re.findall(r'\d+', bbox)
    x1, y1, x2, y2 = [int(num) for num in numbers]

    x1 = int((x1 / 999) * img_width)
    y1 = int((y1 / 999) * img_height)
    x2 = int((x2 / 999) * img_width)
    y2 = int((y2 / 999) * img_height)
    
    draw = ImageDraw.Draw(img)
    
    # 绘制bounding box
    draw.rectangle([x1, y1, x2, y2], outline="red", width=2)
    img.show()
    # img.save("output_image.jpg")

img_path = "/coco2014/train2014/COCO_train2014_000000171435.jpg"
img = Image.open(img_path)  
bbox = '<loc_643><loc_290><loc_998><loc_773>'
visualize_bounding_box(img, bbox)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

可视化结果

{'Locate cat in the image.': 'cat<loc_643><loc_290><loc_998><loc_773>'}
  • 1

在这里插入图片描述

8、结语

Florence-2模型的开源,不仅为计算机视觉领域带来了新的技术突破,也为研究人员和开发者提供了强大的工具。其统一的视觉基础模型架构,大规模的多任务数据集,以及出色的性能表现,预示着人工智能在视觉任务处理上的巨大潜力。随着技术的不断进步,我们期待Florence-2在未来能够解锁更多的应用场景,推动人工智能的进一步发展。

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/844741
推荐阅读
相关标签