给定一张图片 $I$ 使用神经网络进行特征提取, 得到稠密的特征表示 $V$, 对像素的特征表示使用聚类算法进行聚类, 可以得到其聚类中心 $X_0$, 每个像素属于每个类别的概率 $P_0$, 将类别概率使用一个去argmax 操作, 得到像素到类别的分配 $G_0$.
然后, 我们使用边缘检测器(OWT-UCM) 进行边缘检测, 然后与 $G_0$ 合并, 即边缘检测得到的边缘加上 $G_0$ 的边缘, 也就是说两者的边缘都是 $G_e$ 的边缘, 这些边缘将像素分配图 $G$ 分割成各段 Segments, 然后使用 $G_e$ 进行对比学习.
为了在不同分割粒度下, 像素的稠密表示都能反应其所属类别, 比如说在细粒度的像素分配图 $G_0$ 中, 存在”手”和”腿”两种聚类中心, 但是在粗粒度的像素分配图中, 这两个类应该同属于”人”, 所以使用了不同层级的像素分配图 $G_i, i=\{ 0, 1, 2\}$ 进行对比学习.
下一层级的聚类中心与像素分配图的生成
clustering transformer enforces 目的是给出一个类别转移矩阵 $C_l^{l+1}$以及新的聚类中心 $X_{l+1}$. 使用当前的聚类中心在类别转移矩阵当中可以找到一个对应的最大概率的新聚类中心. 其中 $Q_{l+1}$ 是可学习的.
Segment 的对比学习
这一部分的目的是拉近相同类别Segment之间像素的类型, 推远不同类别 Segment 之间的像素类别. 给定图像 $I$ 以及对应的像素级稠密表示 $V$, $\boldsymbol { v } _ { i } = f _ { i } ( I ; \theta ) , \quad \left\| \boldsymbol { v } _ { i } \right\| = 1$. 我们可以得到每个 Segment $s$ 的类别中心:
$$ \boldsymbol { u } _ { s } \propto \operatorname { mean } \left( \boldsymbol { v } _ { i } : i \text { in segment } s \right) , \quad \left\| \boldsymbol { u } _ { s } \right\| = 1 $$
对比学习的损失可以写为:
$$ \mathcal { L } _ { f } ( G ) = \sum _ { i } - \log \frac { \sum _ { s \in G _ { i } ^ { + } } \exp \frac { \boldsymbol { v } _ { i } ^ { \top } \boldsymbol { u } _ { s } } { T } } { \sum _ { s \in G _ { i } ^ { + } } \exp \frac { \boldsymbol { v } _ { i } ^ { \top } \boldsymbol { u } _ { s } } { T } + \sum _ { s \in G _ { i } ^ { - } } \exp \frac { \boldsymbol { v } _ { i } ^ { \top } \boldsymbol { u } _ { s } } { T } } $$
$G^+_i$ 为在图像 $I$ 的任何视图中与像素 $i$ 类别相同的片段,除了 $i$ 自己所在的片段
$G_i^+$ 为在图像 $I$ 的任何视图中与像素 $i$ 类别不同的片段,除了 $i$ 自己所在的片段
<aside> 💡 为啥不用像素 $i$ 所在的片段, 咱也不知道
</aside>