语义分割系列论文 ParseNet


这是第一次尝试写博客,主要是在看ParseNet这篇论文时,不管是在知乎还是在CSDN,甚至在外网的medium上面,都没有找到讲解得十分清楚的博客。而自己相比与直接看论文原文,更喜欢看学术气没那么重,更贴近口语化的博客文章。我相信这样的铁汁不在少数,那么索性自己开通博客来写一下吧。

在语义分割领域,基础的网络如FCN、SegNet、U-Net的资料很全,刚刚入坑的同学肯定首先是把这些弄明白的,我也会assume你清楚这些最基础的知识。但接下来的学习路线就没那么清晰了,我自己也大概处于这样的阶段。后面应该会出一些deeplab等等更复杂一些的语义分割的文章,这次就从这个较简单的网络开始吧!

核心思想–Global Context

原文题目:ParseNet — Looking Wider to See Better
这是一篇ICLR2016的文章,到2020/04/25有538个引用。相比较U-Net等动辄上万引用的大作,ParseNet的影响力中规中据,但如果你想在语义分割领域深入下去的话,这也算是一个必读文章了。
此文章最核心的思想就是引入了global context,即全局信息。这点怎么理解呢?(敲黑板!)语义分割是对每一个像素点做分类,而在做此分类时我们需要整体的信息。举个例子你就明白了。和窥一斑而见全豹的逻辑正相反,如果只看这张猫咪图的一个像素点,或者一小片像素,我们就去说这些个像素是属于猫,或者豹,或者老虎,这样的准确率是很低的!
在这里插入图片描述
如下图所示,FCN没有考虑全局信息,在下半部的分割就很离谱了。可能让我们人类单独看这一片错误分割为bird、dog、sheep的图,把其他部分盖住,大概也很难看出这是一只猫。但我们如果考虑了全局的信息,那就很明显要分类成猫了。整篇文章的核心思想,就是加上了这global context!
在这里插入图片描述

理论感受野的大小(Receptive Field)

这时你心里应该有一个问号,至少我的内心os是“我当然知道这个了!卷积这个操作在创造之初不就是为了能够让后面的网络层看到更多信息而发明出来的么?那vgg来举例,第一个conv层中的每个点,是经过3×3的kernel得到的,第二个conv层再经过一个3×3的kernel那感受野(receptive field)不就是9×9了么?这样下去到最后一层时肯定都能看到全局的了!”我这里是犯了两个错误,第一个,连续的conv层不是3×3 -> 9×9 -> 27×27 -> 81×81这样增加的,你这是错误的认为stride也等于kernel size=3 了。通常stride=1时,感受野是 3×3 -> 5×5 -> 7×7 -> 9×9 这样增加的,你细品一下。如果是这样的话,那么若原始图像是1024×1024的话,最后一层岂不是很难拥有全局视野了么?这是你第二个错误,这全局视野主要是来自pooling层。按照vgg的结构,一个block由两个conv和一个pooling层组成,所以感受野的变化是3×3 -> 5×5 -> 10×10这个规律下去的。conv层增加2个像素,pooling层翻一倍。

理论上,后面层的网络是有很大感受野的。

实际感受野的大小

但文章这里强调了一下,实际上,感受野要小很多!(先看懂下面一段英文再继续!)

To identify the effective receptive field, we slide a small patch of random noise across the input image, and measure the change in the activation of the desired layer. If the activation does not vary significantly, that suggests the given random patch is outside of the empirical receptive field, as shown in Figure 2

原文这里方法讲得很清楚,就不翻译了。不过要注意,这里讨论的感受野,是网络中某一层activation map上的某点的感受野。图(c)中的红叉是在activation map上的某点给对应画在了原图中。可以看到理论上的感受野很大很方正,但实际中就会小很多。
在这里插入图片描述

此文章如何扩大感受野?

在这里插入图片描述
在feature map上面,我们以往做的pooling大多都是2×2的,这次是global的,然后再将其扩张成原来的大小,和之前的cat到一起,再传入下一层。

就这?就这??

对,就这!

文章没有给出整个网络的结构,所以不清楚这个module是怎么加到别的网络,加到哪几个层。我所能看明白的就是这些了。

疑点(读者可以忽略本节)

  1. early-fusion和late-fusion的区别。上面部分是early-fusion,而好像late-fusion是用这个global pooling之后的vector直接来分类,最后再和原本的分类一起的这两个分数再做一些操作。那么问题来了,既然你每个channel上只有一个数了,你怎么能对不同的位置做分割呢?
  2. L2 Norm。据文章说,做L2 Norm是因为low level和higher level的scale不同,low level的更大。我没有看懂是对谁来做这个norm,而且这个cat明明是一个layer内部的事情,传到后面并不存在层间的影响。
    在这里插入图片描述
    这个图的横坐标含义好像也没有说明。
  3. 那么至于如何用一个learnable的参数去赋给各个channel的值以权重,就更不明白了。

总结

这是一篇看懂的和看不懂的内容对半的文章,现在理解网上为什么没有详细的博客来介绍了,因为只看文章没人能看得全懂。毕竟这也算是一篇5年前的论文了,在当时大家还不知道SegNet,不知道U-Net,所以在当时的预备知识和现在我们的预备知识肯定是不同的。

网上仅找到了caffe的实现,没有tf和pytorch的code。

这些疑点也不会去细究了,只要记住此文的核心贡献,即通过全局的池化->反池化->与原feature map concatenate到一起,就能增加该层的感受野。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值