【论文精读】Grounded Language-Image Pre-training(GLIP)

一. 背景

https://arxiv.org/abs/2112.03857
https://github.com/microsoft/GLIP

在这里插入图片描述
这篇论文做的任务是phrase grounding,属于visual grounding的一种。phrase grounding的任务是输入句子和图片,将句子中提到的物体都框出来。visual grounding其他任务和细节可以参考
https://zhuanlan.zhihu.com/p/388504127

GLIP既可以做目标检测也可以做grounding,

  • 目标检测:
     在扩增目标检测领域为SOTA,zero-shot效果较好,也可以做zero-shot目标检测任务。
     与常规目标检测任务相比语义丰富。
  • grounding:
     与常规grounding任务相比可以做目标检测任务。

二、贡献

贡献

  • 将目标检测和phrase grounding任务统一起来进行预训练
  • 扩大视觉语义
  • 迁移学习能力强

性能

  • 27M关联数据上训练。在目标识别任务上有很强的零样本和小样本迁移性能
  • Zero-shot:coco val上49.8AP,LVIS val上26.9AP
  • 微调后:COCO val上60.8AP
  • 下游13个目标检测任务时,1个样本的GLIP可以与Dynamic Head相匹敌

三、方法

3.1 方法1:检测和grounding任务统一

在这里插入图片描述
1. background:
对于检测数据集:
训练时输入标签名(person、hairdryer)、框、图片。
测试时输入图片,预测出框和标签名。
训练过程如下:
在这里插入图片描述
2. background as grounding:
groudning模型的输入是短语、短语中名词的框和图片。
将object模型转为grounding的办法:通过prompt的方式将标签名转化为短语。
在这里插入图片描述

如coco有80个标签,将80个标签用逗号连接,短语前加“Detect:”,来组成短句。

公式2变成公式3的过程中,T的大小会变化,从Nc变成NM
构建token:上图流程图中,M(sub-word tokens)总是比短语格式c多,原因有四个1)一些短语占了多个toeken位置,比如 traffic light。2)一些短语被分开成sub words,比如toothbrush分成了 tooth#, #brush。3)一些是添加的token,如逗号,Deteckt等,4)结尾会添加[NoObj]的token。在训练的时候,phrase是正例的话,多个subwords都是正例。测试时多个token的平均pro作为短语的probability。

3. detection和grounding联动:由上面的方法,可以用grounding模型来预训练检测任务,从而可以迁移GLIP模型做zero-shot的检测

3.2 方法2: deep fusion,视觉和语言联合

在这里插入图片描述
fusion部分公式如下:
在这里插入图片描述

​​​​​​​​​​​​​​O0是视觉backbone的feature, P0 是文本backbone的feature
X-MHA(cross-modality multi-head attention module)
L是DyHead中DyHeadModules个数,BERT Layer为新增。

attention部分在多模态中比较常见,比如co-attention、guided attention等。可以参考多模态中attention其他优化。
DeepFusion优点:
提高了phrase grounding效果
使得视觉特征language-aware

3.3 方法3: 用丰富的语义数据预训练

grounding数据集语义都很丰富,目标检测不超过2000个类别,但是grounding数据集如Flickr30K包括了4.4w不同的短语,量级不同。
如何扩增grounding数据:

  1. 在gold data(det+grounding)上训练教师GLIP
  2. 使用这个教师模型来预测24M web image-text数据,通过NLP解析名词短语,存在5840个不同名词短语
  3. 学生模型在gold data和伪标签grounding数据上训练
    扩增效果:
    学生模型效果比教师模型效果好,比如对于部分词汇,vaccine教师模型可能预测不出来,但是可以预测出a small vial,subwords对的,整体phrase都会是对的。那在给学生模型无监督数据时,可以将a small vial of vaccine标签整体给到学生模型作为学习标签。
    在这里插入图片描述

四、实验结果

在这里插入图片描述
FourODs(2.66M数据)是4个检测数据集集合,包括objects365、OpenImages、VG数据集(除了coco)、ImageNetBox。
GoldG+ 数据集包括1.3M数据集,包括Flickr30K、VG caption、GQA。
GoldG 数据集是GoldG+去除了coco数据集

4.1 迁移效果在检测数据集上

zero-shot在coco上:

  1. 图文数据集没有带来提升
  2. C和B比提升较大
  3. Objects365包括了coco的80个
    在这里插入图片描述
    在LVIS上效果:
    LVIS:大规模细粒度词汇级标记数据集,1000+类别,披萨里的菠萝丁也被标记
    Gold grounding很有效(model C vs model B)
    在这里插入图片描述

4.2 在grounding数据集上

Flick 30k:图文匹配grounding数据集,goldG中包含了该数据集
在这里插入图片描述

4.3 消融实验-检测数据集影响

O365: 0.66M
GoldG: 0.8M
FourODs: 2.66M
但是不是O365+GoldG效果反而更好
在这里插入图片描述

4.4 其他

如果定位不好,可以添加提示词帮助更好定位,下图添加了flat and round
在这里插入图片描述

### 关于 Grounded-Segment-Anything (Grounded-SAM) 模型 #### 功能概述 Grounded-Segment-Anything 结合了多个强大的开源工具,包括 **Segment Anything Model (SAM)** 和 **GroundingDINO**。它不仅能够自动检测和分割图像中的对象,还支持通过文本输入的方式指定特定的目标进行分割[^2]。此外,该项目还可以与其他模型集成,例如 Stable Diffusion 或 Recognize Anything,从而扩展其应用场景。 #### 项目目录结构及说明 项目的官方仓库提供了详细的文档和脚本,帮助开发者快速上手。以下是主要的目录及其用途: - `grounded_sam/`: 存放核心代码逻辑,实现了 SAM 和 GroundingDINO 的融合。 - `weights/`: 预训练权重文件存储位置,其中包含 SAM 的预训练模型权重文件链接[^5]。 - `examples/`: 提供了一些示例脚本,展示如何使用该框架完成不同的任务。 - `requirements.txt`: 列出了依赖项列表,便于安装环境。 可以通过访问项目主页获取更详尽的信息:[Grounded-Segment-Anything](https://gitcode.com/gh_mirrors/gr/Grounded-Segment-Anything)[^3]。 --- #### 安装与配置指南 为了成功部署 Grounded-SAM,需按照以下方法准备开发环境并加载必要的资源: 1. 创建虚拟环境并激活: ```bash python -m venv env source env/bin/activate ``` 2. 安装所需库: ```bash pip install torch torchvision opencv-python-headless numpy transformers ``` 3. 下载预训练权重文件至本地路径下(如 `./weights` 文件夹),具体可参考提供的下载地址。 4. 运行测试脚本来验证安装是否正常工作。如果遇到性能瓶颈,则可能是由于硬件资源不足引起[^4]。 --- #### 实现方式详解 Grounded-SAM 主要分为以下几个模块来实现目标检测与分割功能: 1. **文本到框映射**: 借助 GroundingDINO 将自然语言描述转化为对应的边界框坐标。 2. **实例级掩码生成**: 调用 Segment Anything Model 来基于上述得到的区域建议生产精确像素级别的掩膜。 3. (可选)进一步处理阶段: 如果涉及艺术创作等领域需求的话,可以引入额外组件比如 Style Transfer Networks 对结果做美化调整等操作。 下面给出一段简单的 Python 示例代码用于调用此 API 执行基本的任务: ```python from grounded_sam import SamPredictor, build_grounding_dino_model import cv2 import matplotlib.pyplot as plt # 初始化 DINO 和 SAM predictor dino_model = build_grounding_dino_model() sam_predictor = SamPredictor() image_path = 'example.jpg' text_prompt = "a dog" # 加载图片 image_bgr = cv2.imread(image_path) image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB) # 获取 bounding box from text prompt via grounding dino boxes = dino_model.predict_with_caption(image=image_rgb, caption=text_prompt) # 使用 sam predictor 得到 mask for box in boxes: masks, _, _ = sam_predictor.set_image_and_predict_mask(box=box, image=image_rgb) # 可视化最终效果 plt.figure(figsize=(10, 10)) plt.imshow(masks.sum(axis=-1), cmap='gray') plt.axis('off') plt.show() ``` --- #### 性能优化技巧 对于希望提高 Mobile Segment Anything 表现的情况,量化技术是一个值得尝试的方向。例如采用 PyTorch 中内置函数对线性层部分实施动态量化以减少内存占用同时维持较高精度水平[^1]: ```python import torch.nn as nn from torch.quantization import quantize_dynamic model = ... # your original model instance here quantized_model = quantize_dynamic(model=model, qconfig_spec={nn.Linear}, dtype=torch.qint8) ``` 注意这仅适用于某些类型的神经网络架构;实际应用前应充分评估转换后的质量损失情况。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值