【CLIP系列】4:目标检测(ViLD、GLIP)

1 ViLD

OPEN-VOCABULARY OBJECT DETECTION VIA VISION AND LANGUAGE KNOWLEDGE DISTILLATION

从标题就能看出来,作者是把CLIP模型当成一个Teacher,去蒸馏他自己的网络,从而能Zero Shot去做目标检测。

现在的目标检测数据集标注的类别都很有限,这些有限的类别叫做base categories,如下图中的蓝框标注的东西都是玩具,在这种数据集上去训练一个目标检测器就只能检测出玩具,得不到更细致的检测结果。我们能不能在现有数据集的基础之上,不去额外标注这些黄鸭子或者绿鳄鱼,但模型能直接做到检测这些物体的能力,换句话说,就是模型应该有用能检测这种novel categories新类别的能力。

研究动机

主体的方法如下图所示,

  • a是Base方法,实际上是一个Mask RCNN,是一个两阶段的分类器,第一阶段会出一些region proposal,也就是图中的输入 N proposals;第二阶段就是把N个proposals经过Detection Head,得到N个region embeddings,然后再经过一些分类头,最后输出这些Bounding Box到底是什么类,这样就完成了目标检测。目标函数一般包括两个:定位和分类。
  • b是ViLD的text部分,N个proposals经过检测头,经过投射和正则等操作之后,得到N个region embeddings。接下来我们要去算文本的embedding,就是把物体的类别拿过来给一些prompt,生成一个句子,经过文本编码器即可。ViLD-text和Base方法一样,也是在这些数据集上做有监督的训练,而且是在基础类上训练。在这个阶段,ViLD-text只是把图像的特征和文本的特征联系到一起,Zero Shot能力还有待加强。需要注意的是,不在基础类里的其他类别,都归到Background背景类。背景类的学习非常关键,专门有一个背景的embedding,需要在模型训练的时候去把它学好。
  • c是ViLD的image部分,对于得到的M个bounding box,可以把它们抠出来并resize成特定大小例如224*224,这样就可以输入到CLIP预训练好的图像编码器,得到图像的特征,当做Teacher。Student网络就是常用的目标检测的框架,M个proposals经过一些层得到的图像特征,我们希望它们和CLIP的特征尽可能地接近,所以直接用一个简单的L1-Loss去做蒸馏就可以了。这里的监督信号不再是人工标注,而是CLIP的图像编码,所以不在受到基础类的限制了。ViLD-image通过利用CLIP模型,大大地加强了Open Vocabulary的能力。这里取M个而不是N个proposals,主要是CLIP抽取特征太慢了,因此需要减少proposal的数量来加速训练。
  • d是ViLD-text和ViLD-image合体,右边蒸馏部分只有在训练的时候用到,测试的时候没有用到。

方法

模型总览图如下图所示:

模型总览图

2 GLIP

2.1 前言

目标检测和分割一样,标注数据集都很贵,对于边边角角的类和层出不穷的新类,我们没有办法训练一个模型把这些都检测的很好。我们只能依赖于Open-vocabulary的目标检测模型,来把这些corner case都处理的很好。

而如果想训练一个很强的Open-vocabulary的目标检测模型,就只能像CLIP一样,可以利用上亿规模的的数据集,而且还要把图片-文本对应关系和定位都学的很好。那么 重点就是使用图片-文本对数据集的高效使用 ,因为很好收集。

Vision Language任务(图片-文本多模态任务)里有一类定位任务Vision grounding,主要就是根据文本定位出图片中对应的物体(短语定位phrase grounding),这与目标检测任务非常类似,都是去图中找目标物体的位置。

GLIP 的文章的出发点,就是将检测问题转换为短语定位(phrase grounding)问题,这样GLIP 模型就统一了目标检测和定位两个任务,可以使用更多的数据集。再配合伪标签的技术来扩增数据,使得训练的数据量达到了前所未有的规模(3M人工标注数据和24M图文对数据)。最后训练出来的模型GLIP-L,直接以 zero-shot 的方式在COCO 和LVIS 上进行推理,mAP分别达到了 49.8 和26.9,可见其性能非常的强。

GLIP = Detection + Phrase Grounding:给定一张图片和一个文本,根据这个文本把物体找出来。

效果展示:

效果图

2.2 损失计算

目标检测的损失函数由分类损失和定位损失组成。对于目标检测和Vision grounding而言,定位部分都差不多,二者的区别主要在于如何计算分类loss。因为 detection的标签是one-hot的类别单词,而Vision grounding的标签是一个句子。所以需要把二者的分类loss统一到一个框架下面,也就是:L = Lcls + Lloc.

detection 分类损失计算公式:

detection

vision grounding分类损失计算:

grounding

2.3 模型框架

模型总览图如下图所示,由于所有数据集都是有标注的,所以模型是以有监督的方式进行训练。计算得到文本特征与图像特征的相似度之后,直接与 GT box计算对齐损失alignment loss即可(和ViLD-text分支一样)。这样就完成了文本和图像的特征融合,就可以进行zero-shot检测了。而定位损失也是直接与GT box计算L1 损失。

模型中间的融合层(Deep Fusion)和LSeg的做法一样,都是为了使图像特征和文本特征进一步交互,使最终的图像-文本联合特征空间(joined embedding space)训练得更好(相似的embedding拉近,不相似的拉远),图像特征和文本特征被训练的更强更有关联性,这样后面计算相似度矩阵的效果肯定就更好。

Deep Fusion层实际上是Cross Attention,也可以用其他的网络结构替代。

总览图

### CLIP 模型用于对象检测的实现与应用 CLIP (Contrastive Language–Image Pre-training) 是一种多模态模型,能够理解图像和文本之间的关系。该模型通过对比学习框架训练,在大量互联网图片及其描述上进行预训练[^1]。 尽管最初设计并非专门针对目标检测任务,研究者们已经探索了如何利用CLIP的强大表征能力来改进这一领域的方法。具体来说: #### 方法概述 为了使CLIP适用于目标检测场景,通常采用迁移学习策略。这涉及两个主要方面:特征提取器微调以及引入边界框预测机制。对于前者,可以冻结部分原始网络层而仅优化新增加的部分;后者则可能借鉴自现有成熟的目标检测架构如 Faster R-CNN 或 YOLOv5 等的设计理念[^2]。 #### 实现细节 下面给出了一种基于 PyTorch 的简单实现思路,其中使用了 Hugging Face 提供的 `transformers` 库中的 CLIP 预训练权重作为基础组件之一: ```python from transformers import CLIPProcessor, CLIPModel import torch.nn as nn import torchvision.models.detection as detection_models class ClipForObjectDetection(nn.Module): def __init__(self, num_classes=91): # COCO 数据集类别数 + 背景类 super().__init__() self.clip_model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32") self.processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32") # 基于 Faster R-CNN 架构构建头部结构 fasterrcnn_resnet_fpn = detection_models.fasterrcnn_resnet50_fpn(pretrained=True) in_features = fasterrcnn_resnet_fpn.roi_heads.box_predictor.cls_score.in_features # 替换默认分类器以适应新的输入维度 self.frcnn_head = detection_models.backbone_utils._resnet_fpn_extractor( backbone=self.clip_model.visual, trainable_layers=3 ) def forward(self, images, targets=None): processed_inputs = self.processor(images=images, return_tensors="pt") visual_embeddings = self.clip_model.get_image_features(**processed_inputs) detections = [] for embedding in visual_embeddings: output = self.frcnn_head(embedding.unsqueeze(0)) detections.append(output) if not self.training: return detections losses = {} # 计算损失... return losses ``` 此代码片段展示了如何将 CLIP 的视觉编码器集成到标准的对象检测管道中去。需要注意的是,实际部署前还需要进一步调整超参数并根据特定应用场景做适当修改。 #### 应用案例 在某些情况下,CLIP 可以为少样本甚至零样本设置下的快速原型开发提供便利。例如,在新类别出现时无需重新标注大规模数据集即可获得不错的性能表现。此外,由于其强大的泛化能力和跨域鲁棒性,CLIP 还特别适合处理那些传统方法难以应对的小众或罕见物体识别问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值