基于 CLIP 的文本与视频编码及相关知识解析
文本输入
- 分词 :对于clip的文本编码器而言,输入一个文本的前提是分词。
例如 你把标签输入进去之前,你得利用clip.token 来分词(也有变形)
一般而言 你输入全部的类别标签,然后根据文本提示 组成一个长度为77
的上下文。
这时候会形成一个(n,77)
-
修改形状:关于你的模型输入的要求 无疑是要修改
一个是(n,77)(端对端),另外是(b,77)这个有两个的编码器来混合双打 -
nn.embeding 函数
这个无疑 是生成了帮每一个词生成相应的词嵌入向量
这时候变成了(k,77,d) -
clip的文本编码器而言
会将这个变成(k,77) 我之所以用k 是用k替代上面n,b -
后续处理 论文有自己方法 不展开讲
视频
- 采样:这个采样很有讲法,在训练阶段,一般讲几帧,(16帧实验就出自这),
而又比如验证阶段讲时间剪裁(3个时间剪裁救出自这) - 塑形: B, C, T, H, W = x.size()这个就是基本形状,由于clip是图片编码器
x = x.permute(0, 2, 1, 3, 4).flatten(0, 1),BT C H W(这个是一个视频)
为什么可以将视频输入到图像编码器?
帧作为独立图像:
每一帧视频本质上是一张静态图像。因此,可以将视频中的每一帧单独提取出来,然后分别输入到图像编码器中。
例如,对于一个形状为 (B,T,C,H,W) 的输入,可以将其重新组织为 (B×T,C,H,W),这样每一帧就变成了一个独立的图像输入。
逐帧处理:
图像编码器(如 ViT)通常设计用于处理单张图像。通过逐帧处理视频中的每一帧,我们可以利用图像编码器的强大特征提取能力来提取每一帧的特征。
例如,假设 B=4,T=8,C=3,H=224,W=224,那么输入的形状为 (4,8,3,224,224)。将其重新组织为 (32,3,224,224),这样就有 32 张独立的图像输入到图像编码器中。
-
vit(多头注意力机制)BXT,N+1,D (N为块数,1为分类标记)
-
clip的图像编码器 :(BXT,D) 采样了分类标记来做平均池化
-
后续处理因论文而异
补充知识
- VIT
在视频分析领域,我们常常聚焦于视频数据的结构化处理与特征提取。在此,考虑一个视频,其数学表示为 V ∈ R T × H × W × 3 V \in \mathbb{R}^{T \times H \times W \times 3} V∈RT×H×W×3。其中, T T T 代表该视频所包含的采样帧数, H H H 和 W W W 分别对应视频每一帧的高度与宽度,而最后的维度 3 3 3 则表示视频每一帧的 RGB 色彩通道信息。
对视频的每一帧而言,我们依据特定的处理流程来进一步解析其数据结构。具体来说,每一帧会被划分为若干个形状为
P
×
P
×
3
P \times P \times 3
P×P×3 的不重叠正方形块。这些块经过展平操作后,形成一组向量,我们将其记为
{
x
t
,
i
∈
R
3
P
2
}
i
=
1
N
\{x_{t,i} \in \mathbb{R}^{3P^2}\}_{i = 1}^{N}
{xt,i∈R3P2}i=1N。这里,
t
t
t 明确地指代帧号,其取值范围涵盖视频中的每一个帧;而
i
i
i 则用于标记块号,对于每一帧内的所有块进行有序编号。值得注意的是,块的总数
N
N
N 可通过公式
N
=
H
×
W
P
2
N=\frac{H\times W}{P^2}
N=P2H×W 得出。
完成块的向量转换后,我们会将这些向量引入一个线性投影层
P
emb
∈
R
3
P
2
×
D
P_{\text{emb}} \in \mathbb{R}^{3P^2 \times D}
Pemb∈R3P2×D。经过这一投影层的处理,向量会生成标记嵌入,并且每个标记的输出维度被设定为
D
D
D。这种维度的转换与设定,旨在为后续的模型处理提供更具表达力的特征表示。
为了使每一帧的嵌入标记序列能够携带额外的分类信息,我们会为其添加一个特殊的分类标记 x cls ∈ R D x_{\text{cls}} \in \mathbb{R}^{D} xcls∈RD。最终,输入到视频编码器的每一帧标记序列可以通过以下公式清晰地描述:
z t ( 0 ) = [ x cls , P emb x t , 1 , … , P emb x t , N ] + e z^{(0)}_t = [x_{\text{cls}}, P_{\text{emb}} x_{t,1}, \ldots, P_{\text{emb}} x_{t,N}] + e zt(0)=[xcls,Pembxt,1,…,Pembxt,N]+e
在上述公式中, e e e 代表位置编码。位置编码在视频数据处理中起着至关重要的作用,它为模型提供了关于视频帧中各个标记位置的信息,从而有助于模型更好地捕捉视频数据中的空间与时间特征,提升对视频内容的理解与分析能力。
- 视频特征
在视频特征提取中,选择使用分类标记(CLS token)还是全体帧特征的平均池化,取决于具体的应用场景和任务需求。两者各有优缺点,以下是对它们的详细比较:
- 分类标记(CLS token)
优点
全局特征表示:CLS token 是专门为分类任务设计的,它能够捕捉到每一帧的全局特征信息。在 Vision Transformer(ViT)中,CLS token 通常被设计为一个特殊的标记,用于表示整个图像的全局特征。
简洁性:直接使用 CLS token 作为帧的特征表示,可以避免额外的聚合步骤,简化了特征提取流程。
有效性:在许多任务中,CLS token 已经被证明是一个非常有效的特征表示,尤其是在分类任务中。
缺点
信息丢失:CLS token 虽然能够捕捉全局特征,但可能会丢失一些局部细节信息。对于某些需要精细局部特征的任务,CLS token 可能不够充分。
固定表示:CLS token 是一个固定的表示,可能无法完全适应所有类型的视频特征提取任务。 - 全体帧特征的平均池化
优点
保留更多细节:平均池化会考虑每一帧的所有特征,因此能够保留更多的局部细节信息。这对于需要精细特征的任务(如目标检测、语义分割等)可能更有帮助。
灵活性:平均池化是一种通用的聚合方法,可以适应不同的任务需求。你可以根据需要选择不同的聚合方法(如最大池化、加权平均池化等)。
鲁棒性:平均池化对异常值具有一定的鲁棒性,因为它会考虑所有帧的特征,而不是依赖于某一个特定的标记。
缺点
计算复杂度:平均池化需要对所有帧的特征进行处理,这可能会增加计算复杂度,尤其是在帧数较多的情况下。
信息冗余:如果视频中的帧之间存在大量冗余信息,平均池化可能会引入不必要的噪声。