图像分割 | Context Prior CPNet | CVPR2020

  • 文章转自微信公众号:「机器学习炼丹术」
  • 文章做者:炼丹兄(已受权)
  • 做者联系方式:cyx645016617
  • 论文名称:“Context Prior for Scene Segmentation”

0 综述

先上效果图,CPNet彷佛对一些难样本有着更好的效果:
微信

文中提到了下面关键字:
构建了corresponding prior map(CPmap),而后经过Context Prior Layer(CPLayer)来把这个CPmap融合到网络中,与此同时,使用Affinity Loss来对应这个CPLayer。网络

关于上面这句话如何解读,我先留着疑问。机器学习

1 Context Prior

做者提出两个概念:ide

  • intra-context:同一类别的像素之间的关系;
  • inter-context:不一样类别的像素之间的关系。

做者说,在图像分割任务中,每个图片都有对应的ground truth,可是ground truth中是每个像素所属于的类别,说模型很难从独立的像素中学习到contextual(上下文)信息,所以须要explicitly regularize network(显式的规范网络)学习

在论文中,做者使用Affinity Loss来显式的规范网络.this

For each pixel in the image, this loss forces the network to consider the pixels of the same category (intra-context) and the pixels among the different categories (inter-context).idea

这个损失可让模型考虑同一类别的其余像素和不一样类别的其余像素。spa

2 构建Ideal Affinity Map

在使用Affinity Loss以前,须要先构建Ideal Affinity Map。code

  • 如今咱们有一个图片,Image,这个图片的ground truth GT.
  • Image通过全卷积网络,获得尺寸HxW的特征图;
  • GT下采样到HxW大小,写做\(\widetilde{GT}\),而后对\(\widetilde{GT}\)作one hot encoding,这样获得一个HxWxC的张量,其中C为分割的类别数量,对这个张量记作\(\widehat{GT}\)
  • 经过reshape的方法,把\(\widehat{GT}\)的shape变成NxC,其中N=HxW,而后经过计算\(\widehat{GT}\widehat{GT}^{\mathrm{T}}\)获得一个NxN的矩阵,这个记作A;
  • A就是咱们所要的Ideal Affinity Map。

A is our desired Ideal Affinity Map with size N × N , which encodes which pixels belong to the same category. We employ the Ideal Affinity Map to supervise the learning of Context Prior Map.orm

这个A中每个1表示这一个像素和其余同一类别的像素,经过这个Ideal Affinity Map来训练CPMap

3 Affinity Loss

咱们用全卷积网络对Image进行特征提取,获得一个HxW的尺寸的特征图,这里咱们在上文已经说到了,可是没有说这个特征图的通道数是多少,看下图:

通道数是HxW,也就是上面提到的N,这样对于每个像素来讲,他的特征正好是1xN,这样和咱们获得的Ideal Affinity Map是否是恰好对应上了?

因此这里咱们就能够用简单的二值交叉熵来计算Predicted Prior Map和Ideal Affinity Map的损失:

这就完事了吗?并非:

However, such a unary loss only considers the isolated pixel in the prior map ignoring the semantic correlation with other pixels.

直观上感受,上面的其实只考虑了两个像素之间的关系,其实忽视了更多的语义关系。因此还须要另一部分损失。

a表示Idea Affinity Map中的元素,P表示从X获得的NxN的矩阵。
公式(2)表示,这里有点目标检测的味道了。

举个例子,假设总共有5个像素把:

  • a = [0,0,1,0,1],表示与同类的像素有第三个和第五个两个像素;
  • p = [0.1,0.2,0.8,0.2,0.9],表示预测出来的像素中,第一个像素有0.1的几率是同类的,第三个像素有0.8的几率是同类的;
  • \(\frac{ap}{a}\),恰好就是 真阳/样本为真的个数,为召回率
  • \(\frac{ap}{p}\),恰好就是 真阳/预测为真的个数,为精准率
    这一块讲解的比较粗糙,由于混淆矩阵,PR曲线,召回率精准率应该是你们了解的内容啦,若是不了解可的话能够阅读我以前写过的笔记。(已经记录了107篇笔记了。。我也懒得找文章连接了,抱歉哈哈)

做者原文:

对于公式(4),1-a恰好就是把0和1反过来了,这样1-a中的1表示的是不一样的两个像素,所以体现的是inter-class 不一样类的联系。

最后的最后,Affinity Loss为:

4 Context Prior Layer

CPLayer的结构以下,忽然一看还挺复杂的:

  • CPLayer的输入认为是X,就是\(shape=H\times W \times C_0\);
  • X通过一个aggregation module变成了\(shape=H\times W \times C_1的\widetilde{X}\);

这里来看一下aggregation module是如何整合了spatial information:

看起来就是用了两个并行的1xk和kx1的卷积,OK,这个地方不难。

  • \(\widetilde{X}\)通过一个1x1的卷积层和Sigmoid层,变成咱们的prior Map (P),这个P的shape=HxWxN;
  • 这里的P通过Affinity Loss的监督训练下,在理想状况下,P体现的就是像素之间的关系
  • 以前获得了\(\widetilde{X}\),reshape成\(N\times C_1\)的形状,(这里的\(C_1\)其实就是最终要分类的类别数)
  • 这里能够获得intra-class的信息\(Y=P\widetilde{X}\)
  • 也能够获得inter-class的信息\(\bar{Y}=(1-P)\widetilde{X}\)

这里我提示一下,怎么理解这个intra-class呢?从P中,能够找到一个像素和其余同类别的像素,从\(\widetilde{X}\)中,能够找到全部像素预测几率。所以Y中的每个像素的预测的几率值,实际上是考虑了同类别的其余像素的预测值综合起来的结果。所以这是一个类内上下文的综合考虑。

  • \(F = concat(X,Y,\bar{Y})\)

5 细节

以前计算的affinity Loss在论文中是写做\(L_p\),

  • 其中\(L_u\)是unary loss一元损失,也就是二值交叉熵;
  • \(L_g\)是global loss,也就是总体的一个损失;

而后整个模型的损失:

  • 除了咱们提到的\(L_p\),affinity loss,权重为1;
  • \(L_a\)是auxiliary loss ,权重为0.4
  • \(L_s\)是主要的main segmentation loss,权重为1.
相关文章
相关标签/搜索