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

0 综述

先上效果图,CPNet似乎对一些难样本有着更好的效果:

文中提到了下面关键字:

构建了corresponding prior map(CPmap),然后通过Context Prior Layer(CPLayer)来把这个CPmap融合到网络中,与此同时,使用Affinity Loss来对应这个CPLayer。

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

1 Context Prior

作者提出两个概念:

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

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

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

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).

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

2 构建Ideal Affinity Map

在使用Affinity Loss之前,需要先构建Ideal Affinity Map。

  • 现在我们有一个图片,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.

这个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.

图像分割 | Context Prior CPNet | CVPR2020的更多相关文章

  1. 多篇开源CVPR 2020 语义分割论文

    多篇开源CVPR 2020 语义分割论文 前言 1. DynamicRouting:针对语义分割的动态路径选择网络 Learning Dynamic Routing for Semantic Segm ...

  2. Spring MVC 学习总结(一)——MVC概要与环境配置

    一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...

  3. Correlation Filter in Visual Tracking

    涉及两篇论文:Visual Object Tracking using Adaptive Correlation Filters 和Fast Visual Tracking via Dense Spa ...

  4. 时空上下文视觉跟踪(STC)算法的解读与代码复现(转)

    时空上下文视觉跟踪(STC)算法的解读与代码复现 zouxy09@qq.com http://blog.csdn.net/zouxy09 本博文主要是关注一篇视觉跟踪的论文.这篇论文是Kaihua Z ...

  5. HttpClient(4.3.5) - HTTP Authentication

    HttpClient provides full support for authentication schemes defined by the HTTP standard specificati ...

  6. httpcomponents-client-4.4.x

    Chapter 1. Fundamentals Prev     Next Chapter 1. Fundamentals 1.1. Request execution The most essent ...

  7. httpcomponents-client-ga(4.5)

    http://hc.apache.org/httpcomponents-client-ga/tutorial/html/   Chapter 1. Fundamentals Prev     Next ...

  8. httpcomponents-client-4.3.x DOC

    Chapter 1. Fundamentals Prev     Next Chapter 1. Fundamentals 1.1. Request execution The most essent ...

  9. Spring MVC 学习总结(一)——MVC概要与环境配置(IDea与Eclipse示例)

    一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...

随机推荐

  1. canal-adapter1.1.14最新版本安装的过程中出现的NullPointerException异常

    记录一下我在安装 canal-adapter1.1.14最新版本安装的过程中出现的NullPointerException异常 以下是我的canal-adapter/logs文件夹内adapter.l ...

  2. .net core Api 部署到Linux

    一.环境介绍 1..net开发环境:asp.net core 3.1 2.Linux环境:CentOS Linux release 7.9.2009 (Core) 3.Swagger: Swashbu ...

  3. CF-1291 D - Irreducible Anagrams

    D. Irreducible Anagrams 题意 若两个字符串中每个字符的个数都是一样的,则称他们互为\(anagrams\).现在定义两个字符串s,t是\(reducible~anagram\) ...

  4. manacher算法——回文串计算的高效算法

    manacher算法的由来不再赘述,自行百度QWQ... 进入正题,manacher算法是一个高效的计算回文串的算法,回文串如果不知道可以给出一个例子:" noon ",这样应该就 ...

  5. Codeforces Round #608 (Div. 2) E. Common Number (二分,构造)

    题意:对于一个数\(x\),有函数\(f(x)\),如果它是偶数,则\(x/=2\),否则\(x-=1\),不断重复这个过程,直到\(x-1\),我们记\(x\)到\(1\)的这个过程为\(path( ...

  6. Leetcode(25)- k个一组翻转链表

    给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这个链表: ...

  7. EDA : quartus2 17.1lite + modelsim +verilog 使用流程

    首先   然后填充好自己写的代码 之后save as 存到自己的文件夹 会自动弹出   配置     Assignments settings   之后第一次编译 成功后processing star ...

  8. pyspark+anaconda配置

    参考 https://www.e-learn.cn/content/python/786199 注意 所有的变量都放在环境变量而非用户变量.比如JAVA_HOME. 不然虽然pyspark没问题,但是 ...

  9. Linux 驱动框架---驱动中的阻塞

    描述和API 阻塞IO和非阻塞IO的应用编程时的处理机制是不同的,如果是非阻塞IO在访问资源未就绪时就直接返回-EAGAIN,反之阻塞IO则会使当前用户进程睡眠直到资源可用.从应用场景来说两种方式分别 ...

  10. μC/OS-III---I笔记7---消息队列

    消息队列 任务之间仅仅靠信号量进行"沟通"是不够的,信号量可以标志事件的发生,却无法传递更多的数据,在需要任务间的数据信息传递时就绪要用到消息队列,传统我们一般在前后太系统中都是通 ...