【CLIP系列】3:语义分割(LSeg、GroupViT)

1 LSeg

LANGUAGE-DRIVEN SEMANTIC SEGMENTATION

LSeg是第一篇将CLIP应用于语义分割的论文。它的分割的效果拔群,容错能力也很高:

效果

模型总览图跟CLIP很像:

模型结构

对于图像链路:输入一张图片,进入分割的模型,得到一个特征图,通过上采样放大,因为我们现在做的是密集任务,输出和原来图像的大小是一致的,所以需要做一些升维的操作,最后模型的输出和ground truth supervision去计算cross entropy loss即可。

图像的编码器是DPT的结构(前面有一个ViT,后面加了个Decoder),即拿ViT去做有监督的语义分割。Decoder的作用是把一个bottleneck feature慢慢地upscale上去。

对于文本链路:总共有N个label,这些标签通过文本编码器就能得到N个文本特征。这里对N是没有限制的,可以只检测狗,也可以检测狗和数,还能检测其他东西,N是随时可以改变的。文本通过编码器之后就会得到一个N×C的矩阵,C是特征的维度。

将图片特征和文本特征在C维度上相乘,就会得到一个H×W×N的tensor,到这一步,就和传统的分割没有区别了,因为传统的分割也是会得到一个H×W×N的特征。

该论文虽然说是用到了CLIP,并且是Zero-Shot,但是它的训练过程是有监督的训练,模型是在7个分割数据集上一起训练出来的,即最后是有ground truth mask的,目标函数就是跟ground truth mask去做的cross entropy loss,而不是像CLIP那样是对比学习的Loss,不是一个无监督训练的工作。

在训练的过程中,文本编码器直接用CLIP的,训练过程中完全冻住,不参与训练。

最后的spatial regularization blocks去掉也不影响我们对模型结构的理解。

2 Group ViT

GroupViT: Semantic Segmentation Emerges from Text Supervision

Group ViT的监督信号来自于文本,不依赖于segmentation mask的手工标注,可以像CLIP那样直接利用图像文本对进行的无监督训练。

Problem Overview

为什么叫Group ViT呢?因为在视觉领域,很早之前做无监督分类的,有一种常用的方法叫grouping,简单来说就是从一个聚类的中心点往外发散,把附近周围相似的点逐渐扩充成一个group,这个group相当于一个segmentation mask,是一种自下而上的方式。此处,作者相当于重新审视了这个grouping的方法,把它完美地用到当前这个框架中,他们提出了一个计算单元,如下图右侧框图,叫做grouping block,还有一些可以学习的group tokens,主要的目的是想让模型在初始学习的时候,能慢慢地把邻近的像素点都一点一点地group起来,变成一个又一个segmentation mask。下图中间画出了这些segmentation mask,在模型的浅层,学到的group token分割的效果还不是很好,能看到一些五颜六色的颜色块。经过模型的学习,深层的group token分割效果相当不错。

模型总览图

Group ViT的贡献是:在一个已有的ViT框架中,加入了grouping block,同时加入了这些可学习的group tokens。

Zero Shot推理过程如下图所示:

  • 给定一张图片,经过GroupViT的图像编码器,就会得到最后的8个Group Embedding;
  • 再把有可能的标签通过文本编码器,得到一系列的文本特征;
  • 接下来计算图像的Group Embedding和文本特征之间的相似度,就可以知道每个group Embedding对应那个Class。

这里有个明显的局限性:因为模型最后只有8个Group Embedding,也就意味着,一张图片的分割最多只能检测到8类。

推理过程

### ComfyUI 中 CLIP 模型用于语义分割的实现与使用 在 ComfyUI 平台中,CLIP (Contrastive Language–Image Pre-training) 模型被广泛应用于多模态任务,包括但不限于图像分类、文本到图像生成以及更复杂的视觉理解任务。对于语义分割这一特定应用领域,在该平台上的实现通常涉及以下几个方面: #### 1. 数据预处理 为了使 CLIP 模型能够适应于语义分割任务,输入数据需要经过精心设计的预处理阶段。这不仅限于常规的图像标准化操作,还包括创建适合训练的目标标签图。这些标签图应当精确对应每一张源图片中的各个像素类别。 ```python from PIL import Image import numpy as np def preprocess_image(image_path): image = Image.open(image_path).convert('RGB') # Resize to match input size expected by the model resized_image = image.resize((224, 224)) # Convert to NumPy array and normalize pixel values between [-1, 1] img_array = np.array(resized_image).astype(np.float32) normalized_img = (img_array / 127.5) - 1 return normalized_img ``` #### 2. 构建自定义层或模块 针对语义分割的需求,可能需要扩展现有的 CLIP 结构来支持逐像素预测的能力。此过程可以通过引入新的注意力机制或其他形式的空间变换组件完成,例如双重视觉注意层(DoubleAttentionLayer)[^3]。 ```python class DoubleAttentionLayer(nn.Module): def __init__(self, in_channels, out_channels): super(DoubleAttentionLayer, self).__init__() self.query_conv = nn.Conv2d(in_channels=in_channels, out_channels=out_channels//8, kernel_size=1,) ... ``` #### 3. 推理流程调整 当利用已训练好的 CLIP 模型执行推理时,需特别关注如何有效地获取并解释最终输出的结果。具体来说,就是通过无梯度上下文管理器(`torch.no_grad`)运行模型,并从中提取最高概率对应的类索引作为预测结果[^1]。 ```python with torch.no_grad(): outputs = model(**encoding) logits = outputs.logits predicted_class_idx = logits.argmax(-1).item() print("Predicted class:", model.config.id2label[predicted_class_idx]) ``` 值得注意的是,上述代码片段展示了基于给定编码向量获得单个最佳匹配类别的简单方式;而在实际部署过程中,则应考虑构建更加复杂的工作流以满足不同应用场景下的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值