论文阅读:Pixels to Graphs by Associative Embedding

Pixels2Graph(NIPS 2017)

文章
  insight:现在做关系检测往往都是分为物体检测和关系识别两个步骤,可是这样的话,在第二步的时候往往会损失很多信息,本文希望从原图的像素信息一步同时得到物体和关系。
  其实本文的关键是associative embedding,今年ECCV的一篇CornerNet也是利用了这种想法,给目标检测带了新思路,我感觉应该也有这篇文章的灵感。
  本文的方法其实也是两步,首先检测最后要得到的场景图的每个元素,包括节点和边,然后对这些元素进行组合。第一步其实就是检测物体以及关系在图上的bbox,第二步就是决定每条边应该和哪两个点相连。下面详细介绍一下具体的算法。
论文阅读:Pixels to Graphs by Associative Embedding
Detecting graph elements:
  最终场景图的每个元素(点和边)在原图片上都有一个对应的位置,目标检测得到的bounding box的中心坐标就是场景图中点对应的位置,边的位置则是其两个关联的bounding box的中心坐标的均值。利用这样的思路,我们可以使用一个神经网络能够产生一个高分辨率的特征图,特征图上每个像素与原图像素一一对应。而每个位置的vector则表示这个位置是否存在一个节点或者边,如果是存在的就用该vector来预测这个元素的属性。
  卷积神经网络可以用来处理图像并产生一个hwf的特征tensor。所有对确定某个位置的点和边有必要的信息都被encode到了一个长度为f的vector里了。但是有个问题,多个边或者点可能在相同的位置,本论文也考虑了相应的对策。
  特征tensor的产生使用堆叠的hourglass网络。因为hourglass网络的特点是可以结合局部和全局的信息在整张图片上推理从而产生高质量的逐像素的预测。这个在人体骨骼关键点检测中用得比较多,但其实该论文也有这样的需求,因为既希望保留每个像素点和feature中的对应关系,又希望用到其它的信息。
  作为网络设计的一种选择,其实并不非得要求输出feature与输入分辨率完全匹配,当然这是能做到的,但另一方面输出分辨率越小,越容易发生重叠。如果重叠了,就说明这个点的长度为f的vector应该能encode所有这些重叠的elements所必要的信息,这是很难的。但是提高分辨率是能提高定位准确性的。
在由hourglass网络得到的特征tensor上使用1*1卷积和非线性**函数得到两个heatmap分别对应点和边。heatmap的每个像素值表示原图的该位置上有一个点或者边存在的似然,因此监督信号是一个和输出一样分辨率的0,1矩阵,损失函数直接使用交叉熵即可。
  得到了存在的似然后就需要对具体的属性进行预测,比如类别还有object的bounding box。为了预测某个位置的检测结果的属性,本文的方法是直接将该位置对应的vector输入一个全连接网络。当然,点和边需要两个不同的网络。
  总结一下,第一步:将图片通过堆叠的hourglass网络得到逐像素的特征tensor,之后会分为两条路,一条利用该tensor产生存在的似然,另一条对似然较高的vector利用全连接进行属性的判断。

Connecting elements with associative embedding
  为了能将第一步的检测结果进行组合得到完整的关系图,每个检测结果还需要有一个属性,对于每个点来说应该有一个唯一的标志(形式也是vector),对于每个边,应该能知道与之关联的两个点的标志。很关键的是,网络必须保证不同点的标志应该是不一样的,但指向相同物体的点的标志应该是相同的。
  作者应该也考虑过使用edge位置应该是vertex位置的平均处,但问题有两个,一是无法区分sub和obj,而是在结果多了的时候无法处理平均点相同的vertex对。
  假设每个节点的标志embedding为h_i,所有与之相连的边中它的embedding是h_ik(k=1,…,K_i),K_i是与之相连的总的边数。为了匹配点和边,需要一个“pull together”损失:
论文阅读:Pixels to Graphs by Associative Embedding
另一方面为了区分不同的点,需要一个“push apart”损失:
论文阅读:Pixels to Graphs by Associative Embedding

论文中使用的margin=8,embedding的维度为8,和论文associative embedding中1维比起来,收敛得快很多。

Support for overlapping detections
  一个很简单的重叠的例子就是human wearing shirt,human和shirt的中心点很可能就重叠到一个像素点上了。一个简单的想法是利用类似于anchor的机制,引入一个新的维度,这样就可以放多个检测结果,并且这个维度上每个位置的检测结果是与其视觉特征有关的,但问题是,如果是物体的话,这样的方式是可行的,但是对于关系则不是。
  paper中还是采用了增加一个维度来解决重叠的问题,但是并没有强制特征与检测结果在该维度的位置的关系,即会强制检测结果的像素位置,但允许它出现在该位置的新维度上的任何地方。举个例子,原本某个点应该有两个检测结果,那么没有新维度的话,该点的监督信号就是1,引入新维度并且对特征与该维度的位置进行强制的话,可能就变成了[1 1 0 0](4维),没有强制的话就是[1 1 0 0 ]或者[1 0 1 0]什么都可以,只要里面有两个就ok。但是这样的话,由于事先不知道网络到底会把检测结果放在新维度的什么位置,因此在训练时就必须要一个额外的步骤来确定可能的位置,这样才能计算损失。
   用于物体和关系的新维度分别为s_o和s_r,这样的话,每个像素点对应的vector就要用来产生s_o个物体(类别,bounding box,embedding)和s_r个关系(类别,sub_embedding,obj_embedding)。还有需要注意的是,这种情况下采用了s_o+s_r个不同的全连接网络,分别对新维度上每个位置的物体和关系进行预测。此外,原本的两副heatmap也应该增加到新的维度。
   对于物体,网络在每个像素点产生s_o个结果,我们将ground truth的类别one-hot编码以及bounding box与每个预测结果进行比较,选择最match的来求损失函数,此处使用了匈牙利算法来寻找一个最优match,而且要注意两个ground truth不能与相同的位置match。对于关系也是是类似的,只不过用于match的向量成了类别one-hot码以及两个关联物体的标志embedding的拼接而已。match只是在训练时需要,推理时就不用了。

实验:
  论文中的hourglass网络输入分辨率为5125123,输出为6464256,即vector长度为256。几部分损失函数:分类、回归、embedding的权重都一样。设定s_o=3且s_r=6,实验表明这已经足够覆盖绝大部分检测结果了。
  为了提高关系识别的准确度,用其他算法得到的检测proposal可以作为先验使用,在predcls任务中,甚至可以使用ground truth。为了使用这些先验知识,可以扩展object detection的heatmap的通道数为2,一个通道表示检测结果的中心,一个通道作为bounding box的mask。如果有许多先验的object的话,一个通道就不够了,这时就可以用多个通道,这些通道可以代表类别或者尺寸
  在Visual Genome上进行了实验,采用的划分和message passing和neural-motifs一样(150类物体,50类关系),任务也还是neural-motifs里面那三种,结果如下
论文阅读:Pixels to Graphs by Associative Embedding
   有一点要说的是,在predcls任务中,看起来pix2graph优于neural-motifs的结果,但实际不是这样的,因为每个位置可能有s_t=6个关系,所以其实pix2graph产生的结果中,有的object pair会有多个关系,其实就是neural-motifs中所说的的without graph constrain
论文阅读:Pixels to Graphs by Associative Embedding
  还有一点,该方法在几种关系上的检测效果很差,可以见上表,但是最后总的结果竟然看起来还不错,这是为什么呢?因为在数据集中的二八定律,20%种关系占了总关系数目的80%的数量,而恰好这些关系又比较简单。我统计了该数据集split下的50种关系的比例如下图,top-10的关系竟然占了总数的90%!!可见目前的评价指标还有缺陷啊。
论文阅读:Pixels to Graphs by Associative Embedding