在计算机视觉领域,图像描述模型扮演着越来越重要的角色。它们不仅能够为混合搜索系统生成数据,还能为文本中的图像生成相应的描述。与此相对,密集图像描述则专注于为图像中的特定区域生成丰富的描述。本文将探讨什么是密集图像描述,以及如何使用微软研究开发的多模态视觉模型Florence-2来生成密集图像描述。
密集图像描述的概念首次在Johnson, Justin和Karpathy, Andrej以及Fei-Fei, Li的论文《DenseCap: Fully Convolutional Localization Networks for Dense Captioning》中提出。它涉及到为图像中的特定区域生成描述。以一张街道上的汽车图片为例,通过Florence-2模型,可以得到以下两种描述:
当模型被要求生成常规图像描述时,它返回的是:
图像展示了一辆复古的大众甲壳虫汽车,停在一条鹅卵石街道上,前面是一栋黄色的建筑,建筑有两个木门。汽车涂有鲜艳的绿松石色,拥有流畅、流线型的设计。汽车两侧各有两扇门,一扇在另一扇上面,前面有一个小窗户。建筑看起来古老而破旧,油漆剥落,墙壁破碎。天空是蓝色的,背景中有树木。
相比之下,当模型被要求生成密集描述时,它返回的是:
常规描述涵盖了整个图像,而密集描述则定位了图像的特定部分。
密集描述的结果图像显示了作为密集描述一部分返回的边界框。可以通过两种描述推断出图像的详细信息,但密集描述为提供了定位信息,这有助于进一步理解图像。
Florence-2是一个由微软开发的开源多模态视觉模型。以下是如何使用Florence-2生成密集图像描述的步骤。
首先,需要安装Transformers及其相关依赖,这些将用于运行Florence-2模型:
pip install transformers timm flash_attn einops -q
还需要一个名为supervision的Python包,它包含了处理计算机视觉模型预测的实用工具:
pip install supervision
接下来,需要在Python脚本中导入依赖并加载模型。为此,创建一个新的Python文件,并添加以下代码:
from transformers import AutoProcessor, AutoModelForCausalLM
from PIL import Image
import requests
import copy
model_id = 'microsoft/Florence-2-large'
model = AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=True).eval().cuda()
processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)
def run_example(task_prompt, text_input=None):
if text_input is None:
prompt = task_prompt
else:
prompt = task_prompt + text_input
inputs = processor(text=prompt, images=image, return_tensors="pt")
generated_ids = model.generate(
input_ids=inputs["input_ids"].cuda(),
pixel_values=inputs["pixel_values"].cuda(),
max_new_tokens=1024,
early_stopping=False,
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=task_prompt,
image_size=(image.width, image.height)
)
return parsed_answer
在上述代码中,加载了模型及其依赖项。这段代码来自微软官方的Florence-2笔记本。然后,可以使用以下代码在图像上运行模型:
task_prompt = ""
answer = run_example(task_prompt=task_prompt)
try:
detections = sv.Detections.from_lmm(sv.LMM.FLORENCE_2, answer, resolution_wh=image.size)
annotate(image.copy(), detections)
except Exception as e:
print(f"Exception: {e}")
在这里,使用了“
密集图像描述是一种计算机视觉任务类型,它涉及到在图像中定位对象并为定位的区域生成描述。在本指南中,介绍了密集图像描述的概念,并展示了如何使用Florence-2,一个多模态计算机视觉模型,来生成图像区域的密集描述。