0
点赞
收藏
分享

微信扫一扫

使用Graph进行视觉识别

使用Graph进行视觉识别_计算机视觉
图卷积


文章目录

  • ​​Introduction​​
  • ​​Graphs come to rescue​​
  • ​​Semantic Segmentation​​
  • ​​Graph Convolution Units (GCU)​​
  • ​​图投影​​
  • ​​图卷积​​
  • ​​格拉夫重新投影​​
  • ​​架构和实现​​

Introduction

卷积神经网络在视觉识别任务中取得了巨大的成功。本文部分我cularly专注于语义分割。使用 CNN 背后的逻辑是图像具有局部性,即彼此靠近的像素更相关。CNN 能够通过卷积运算捕捉到这一点,考虑的局部区域(正式称为感受野)取决于内核大小。图像中还存在有助于视觉识别任务的长期依赖关系。为此,概念是堆叠可能会在理论上增加感受野的卷积层。所以现在长距离和短距离依赖都被考虑在内,把网络放在训练上,你很容易得到结果!

但我相信你很清楚,理论和实践相匹配的情况并不多。最近发表的一篇论文(罗文杰等人)表明感受野不随卷积层的数量线性增长,而且它们受到严重限制。此外,感受野取决于各种其他因素,例如初始化方案。那么解决方法是什么呢?

Graphs come to rescue

如果我们能够将图像分成多个区域并使用这些区域来提取特征并进一步处理图像会怎样。除此之外,区域之间也将存在依赖关系,这将有助于获得远程依赖关系。所有这一切都可以使用图像的图形表示来实现。

广义上讲,图中的所有顶点将代表图像中的不同区域。边缘将表示区域之间的关系或相似性。

使用Graph进行视觉识别_计算机视觉_02
圆圈代表具有代表该区域的相应特征向量的区域。边缘是区域之间的相似性。

Semantic Segmentation

语义分割是为每个像素分配一个它所属的类的任务。一个基本的技术是有一个编码器,然后是一个解码器,其输出将是像素级别的分配。

细分是如何工作的?让我们举一个非常基本的例子,假设有一个图像只由红色、蓝色、绿色组成,如图所示

使用Graph进行视觉识别_特征向量_03
图1

图 1 并假设这些颜色代表一些对象。现在假设谁想要将图像分割为由颜色表示的三个对象。你需要什么特征向量来做到这一点?对此,只有颜色就足够了。如果我们说特征向量,那么每个特征向量的深度为 3;对于红色 [0,0,1],对于蓝色 [1,0,0],对于绿色 [0, 1, 0]。如您所见,这些特征足以将图像分割为 3 个区域。现在考虑现实生活中的图像,例如图 2 中给出的图像。你能只使用颜色来完成任务吗?没有权利。我们需要图像中存在的每个对象的特征表示,将其与其他对象分开并使相似的对象更接近,这是编码器进入图片的地方。它将彩色图像表示转换为某种潜在空间表示,其中同一对象的特征更近,不同对象的特征彼此远离。显然,编码器需要训练。一旦我们在一些潜在空间中拥有分离不同对象的特征,我们就需要将信息传播到像素级别,这就是解码器发挥作用的地方。

让我们了解图如何在语义分割中发挥作用。一旦使用编码器提取特征向量,图就会发挥作用。考虑图2中的图像。图像从上到下依次为实际图像、ground truth、FCN分割、GCU分割。在这张图片中,当使用 FCN 时,枕头和床类的概率非常接近。因此,您可以在 Fig2 中看到枕头和床已合并。

现在假设一个图形表示跟随一个编码器。由编码器产生的图像的特征向量表示被强制划分为多达 8 个区域(即 8 个顶点的图形)] 如果我说在损失方面,如果顶点为空,则损失会更高,即没有像素分配给它。在这种情况下,在培训的初始阶段,枕头和床也将分配到同一班级。但是当我们进一步训练网络时,每个特征向量都被分配给一个顶点,即没有顶点是空的。图像将在图形表示中分割的可能区域是地面实况中的区域。因此,在训练结束时枕头和床将被分成两个不同的区域。通过乘以一些权重来进一步处理分配给顶点的特征,并且所得特征向量与来自编码器的特征向量一起被进一步用于分割。因此图形表示进一步改进了图像的特征表示。

可能发生的一件显而易见的事情是在将图像划分为多个区域时对图像进行过度分割。但是过度分割的区域会在卷积等进一步操作后重新组合。

现在的问题是如何将图像的基于网格的表示转换为这种图形表示并学习图形表示的参数,答案是图卷积单元(GCU)。
使用Graph进行视觉识别_卷积_04

Graph Convolution Units (GCU)

就像卷积在网格状结构上运行一样,GCU 在图状结构上运行。GCU有3个主要步骤

图投影

图投影:在这一步中,图像的网格状表示被转换为图形表示。该图由以下参数参数化:

  • V:图中顶点的数量,这意味着图像将被分割的区域数量。
  • W:代表区域的特征向量。形状为(d,V),其中d为特征向量的维度
  • 方差:它是分配给特定顶点的所有像素沿每个维度的方差。形状为 (d, V),其中 d 是特征向量的维度。

V是固定的,W和方差是在训练期间学习的。假设有一个高度为 H 和宽度为 W 的图像的二维特征图,并且每个元素的维度为 d。计算属于每个顶点的每个特征向量的概率,从而得到概率矩阵 Q。 下面的等式用于计算概率:

使用Graph进行视觉识别_卷积_05
其中 xᵢⱼ 是二维特征图的 iᵗʰ 行和 jᵗʰ 列的特征向量,wₖ 是表示 kᵗʰ 区域(顶点)的特征,σₖ 是沿顶点 k 的所有维度的方差。现在,通过取残差的加权平均来计算所有顶点的特征编码。残差越多,它在计算编码特征中的贡献就越小。使用下面给出的方程:

使用Graph进行视觉识别_计算机视觉_06
其中 zₖ 是编码特征。邻接矩阵由 ZᵀZ 计算,它给出了不同顶点之间的余弦相似度。这一步总共计算了3件事

  • 概率矩阵 Q,形状 ( HW, d)
  • 编码特征 Z,形状 (d, V)
  • 邻接矩阵 A,形状 (V, V) - 区域之间相似性的表示,因此它捕获图像中的远程依赖关系。

使用Graph进行视觉识别_人工智能_07

图卷积

这一步类似于卷积的前向步骤,即在生成的图上进行卷积。使用下面给出的等式:

使用Graph进行视觉识别_卷积_08
其中 W g 是形状的权重矩阵 (d, dₒᵤₜ)。如您所见,方程中有一个邻接矩阵 A,在计算新的编码特征时会考虑远程依赖关系。所以新的编码特征取决于所有区域(A)和当前编码特征(Z)。要阅读有关图卷积的信息,请参阅本文和本文。这些文章中提供了非常容易理解且足够的信息。

格拉夫重新投影

最后,图形被转换回该格子状结构,以可视化或做进一步的操作。方程如下
使用Graph进行视觉识别_特征向量_09

架构和实现

所使用的架构是预训练的 ResNet 50/101,在最后两层添加了扩张,因此输出被下采样了 8。紧随其后的是 GCU。在原始实现中,4 个 GCU 的输出连接到 ResNet 的输出,如下图所示。

使用Graph进行视觉识别_卷积_10
在这种情况下,d 是 1024,dₒᵤₜ 是 256。连接后的输出深度为 1024(来自 ResNet50)+ 256x4 = 2048。连接后的输出使用双线性插值进行上采样。接下来,卷积层用于将像素分配给不同的类。用于最小化误差的损失函数是负对数似然损失函数。
使用Graph进行视觉识别_人工智能_11
我的 Pytorch 实现可在此处获得。我在下面给出了实现细节。使用的数据集是 ADE20K。
使用Graph进行视觉识别_人工智能_12

  • 使用 ResNet50 dilated,在 ADE20K 上预训练,可在此处获得。ResNet50 的输出深度为 2048。
  • GCU 遵循 ResNet50。在论文中,连接了 4 个 GCU 单元,但由于计算能力有限,我只使用了 1 个具有 16 个顶点的 GCU。我编写了一个通用代码,因此您可以轻松修改 4 个 GCU 的代码。要了解有关 GCU 实现的更多详细信息,请参阅我的下一篇文章。
  • 在这种情况下,d 是 2048,dₒᵤₜ 是 256。连接后的输出深度为 2048(来自 ResNet50)+ 256= 2304
  • 接下来是双线性上采样操作,然后是 1 个卷积层。
  • 在馈送到网络之前,图像被调整为 512×512 的大小。
  • 由于计算有限,我使用了批量大小 1 并训练了 120 个 epoch,每个 epoch 有 1000 次迭代。
  • 使用 SGD 的动量为 0.9。学习率从 0.01 开始,随着训练的进行而衰减
  • 目前,该模型使用 2 个 GPU。一个 GPU 专用于 ResNet,另一个用于所有其他计算,如 GCU、上采样和卷积。

参考
​​​https://towardsdatascience.com/visual-recognition-using-graphs-9c446005736e​​


举报

相关推荐

使用mediapipe进行人脸识别

0 条评论