论文解决的问题: 通过视觉语言建模和大规模数据集上的预训练来增强YOLO的开发词汇检测能力。
YOLO-world提出了一种prompt-then-detect范式:先提示,再检测。即将单词先转化成一系列离线的embedding,再将其重参数为模型的参数,参与到目标检测任务中来。相当于在部署的时候可以直接砍掉CLIP部分,直接把想要检测的类别的text embedding放到YOLO-World中进行推理,所以前向速度非常快。
Text-guide CSPLayer: 采用max-sigmoid attention来实现文本和图像的融合其中
X
l
X_l
Xl是来自不同层的图像特征,W是text embedding,计算特征图与text embedding的相似度矩阵,取最大值在sigmoid后作为权重加权原特征图
X
l
′
=
X
l
⋅
δ
(
max
j
∈
{
1..
C
}
(
X
l
W
j
⊤
)
)
⊤
X_l^{\prime}=X_l \cdot \delta\left(\max _{j \in\{1 . . C\}}\left(X_l W_j^{\top}\right)\right)^{\top}
Xl′=Xl⋅δ(j∈{1..C}max(XlWj⊤))⊤
不过在代码实现的时候,其实concat了每一个block的输出:
# yolo_world/models/layers/yolo_bricks.py:145行
def forward(self, x: Tensor, guide: Tensor) -> Tensor:
"""Forward process."""
x_main = self.main_conv(x)
x_main = list(x_main.split((self.mid_channels, self.mid_channels), 1))
x_main.extend(blocks(x_main[-1]) for blocks in self.blocks)
x_main.append(self.attn_block(x_main[-1], guide))
return self.final_conv(torch.cat(x_main, 1))
Image-Pooling Attention: 利用图像感知信息增强text embedding,文本嵌入的更新方式如下:
W
′
=
W
+
MultiHead-Attention
(
W
,
X
^
,
X
^
)
W^{\prime}=W+\text{MultiHead-Attention}(W,\hat X, \hat X)
W′=W+MultiHead-Attention(W,X^,X^)
X是来自于3个不同尺度的图像特征,对每个尺度进行最大池化max-pooling,得到3x3大小的特征图,3组就是27个patch-token。
YOLO-World的检测头还是复用了YOLOv8的解耦头,只不过将分类分支修改成了object embedding。object embedding与text embedding需要先进行L2范数归一化,再进行距离计算,其计算公式如下:
s
k
,
j
=
α
∣
∣
e
k
∣
∣
2
∗
∣
∣
w
j
∣
∣
2
+
β
s_{k,j} = \alpha ||e_k||^2*||w_j||^2 + \beta
sk,j=α∣∣ek∣∣2∗∣∣wj∣∣2+β
其中
s
k
,
j
s_{k,j}
sk,j表示文本
w
j
w_j
wj与目标嵌入
e
k
e_k
ek之间的距离,
α
\alpha
α和
β
\beta
β是可学习的比例因子和位移因子。
训练使用在线词汇表,推理使用离线词汇表。
训练时:
测试时: 设置需要的词,并直接获取词向量参与到目标检测中,而不再用CLIP进行编码。
其他细节:
文章中设计了一个数据生产流程,对CC3M中的246K图片生成了821K的伪标注。
其生成流程如下:
结论一:增加高质量数据效果提升显著。
验证Text-guided CSPLayers和Image-Pooling Attention的作用分别可以提升0.8和0.3个点,但是只加入GQA数据集可以直接提升7.2个点,还是证明了加入数据的有效性。
*注:GQA是斯坦福大学教授 Christopher Manning 及其学生 Drew Hudson 一同打造的全新图像场景图问答数据集,旨在推动场景理解与视觉问答研究领域的进步,详细数据链接:https://cs.stanford.edu/people/dorarad/gqa * 。
结论二:在YOLO-Wolrd里面,CLIP优于BERT。