这几篇写的不详细,疑惑/感觉关键的部分提出来就行
介绍
FCN缺少全局场景类别线索的利用,所以会出现把船分类为车的错误。
(未来要是看不懂去看图2)
而以前为了理解复杂场景会采用空间金字塔池化获得全局图像级特征,空间金字塔池化网络对此加强。
所以本文的PSPnet实际上就是用空洞FCN关注局部线索,金字塔池化关注全局线索,把这两点融合提高预测精度。同时改进了优化策略,带深度监督的loss。
相关工作
本文基础结构是FCN+dilated。
其他人的工作包括:多尺度信息结合,结构(边界)预测。其中又看到了用CRF做后处理。
前人有利用全局上下文的,但是是用传统/全局池化,本文用的是金字塔,聚合不同区域上下文信息。
个人分析:
可能是因为全局描述子可能会对复杂场景的分类产生副作用。比如既有车又有船,直接用全局反而不如局部聚合。
PSPNet
细分一下问题:
1)未考虑上下文联系,结果与场景不匹配
2)类别特征相似,分割不完整
3)小物体容易被忽略/错分
金字塔模块
解决上面问题的方法其实就是综合上下文信息,因为CNN看上去感受野很大,但实际上在高层感受野远小于理论尺寸。(在这篇文章OBJECT DETECTORS EMERGE IN DEEP SCENE CNNS里面有说明,这个写完去补笔记)
全局平均池化也能做上下文,但是可能会错失必要信息。复杂场景直接全局生成一个向量是不完整的。而全局+子区域是有效的,在其他工作(SPM,SPPNet)中也有体现。
参考SPPNet里面的金字塔池化,本文做的pyramid pooling module也是分层处理不同子区域,然后和全局信息进行concat,如下图所示。
细节:
1)最上面的最粗糙,最接近全局池化(取决于最终生成的尺寸,文章称为bin)
2)这一部分的conv是为了不让整体feature map的权重过低,对子区域信息进行通道降维。
3)上采样做的是双线性插值。
4)金字塔尺寸可调,文章使用的的是4层,bin的大小分别是1,2,3,6
整体结构
上图。
深度监督loss
在前面提特征图的部分做的loss,当ResNet深度过大时辅助优化,分段做反向传播,并且改变两个loss的权重。论文这里是并行实现的,也就是一轮迭代两段同时更新。
这部分是预训练用的,大概意思应该就是在中间层直接softmax出来做一个辅助Loss。作者其实没基于数学分析,是实验佐证的效果。代码里的操作是把res4的输出做了和res5同样的操作,最后也是和真值做的交叉熵Loss,两者加权组合得到了最终Loss。(实际上后面的ablation把这个权重取0.4最优)
把加了loss的层提出来,变量如图所示:
计算梯度:
∂
l
1
∂
x
=
∂
l
1
∂
y
1
∂
y
1
∂
y
2
∂
y
2
∂
x
\frac{\partial l_1}{\partial x}=\frac{\partial l_1}{\partial y_1}\frac{\partial y_1}{\partial y_2}\frac{\partial y_2}{\partial x}
∂x∂l1=∂y1∂l1∂y2∂y1∂x∂y2
∂
l
2
∂
x
=
∂
l
2
∂
y
2
∂
y
2
∂
x
\frac{\partial l_2}{\partial x}=\frac{\partial l_2}{\partial y_2}\frac{\partial y_2}{\partial x}
∂x∂l2=∂y2∂l2∂x∂y2
∂
l
∂
x
=
α
∂
l
2
∂
x
+
(
1
−
α
)
∂
l
1
∂
x
\frac{\partial l}{\partial x}=\alpha\frac{\partial l_2}{\partial x}+(1-\alpha)\frac{\partial l_1}{\partial x}
∂x∂l=α∂x∂l2+(1−α)∂x∂l1
=
∂
y
2
∂
x
[
α
∂
l
2
∂
y
2
+
(
1
−
α
)
∂
l
1
∂
y
1
∂
y
1
∂
y
2
]
=\frac{\partial y_2}{\partial x}[\alpha\frac{\partial l_2}{\partial y_2}+(1-\alpha)\frac{\partial l_1}{\partial y_1}\frac{\partial y_1}{\partial y_2}]
=∂x∂y2[α∂y2∂l2+(1−α)∂y1∂l1∂y2∂y1]
强行解释一波:
感性理解的话,res4的特征表达能力应该不如res5,而从res5开始反向更新的能力不如res4,这里相当于中和了这两个方面,让网络可以更新,最终预测结果也更好。
定量来看一下这个问题:
我们最终用来预测的一定是res5后接的输出层,所以虽然Loss是关于加权组合的,但最终目标是让L1能尽量小才对。
而初始阶段的更新应该是L1,L2,L3同时下降,
直到:
(
1
−
α
)
∂
l
1
∂
x
→
0
(1-\alpha)\frac{\partial l_1}{\partial x}\rightarrow0
(1−α)∂x∂l1→0
时,主要梯度方向由
∂
l
2
∂
x
\frac{\partial l_2}{\partial x}
∂x∂l2决定,此时一次更新后的结果应使L2,L减小(调好学习率的话),但无法保证L1的增减性,但可以知道:
m
a
x
Δ
l
1
=
α
1
−
α
Δ
l
2
max\Delta l_1=\frac{\alpha}{1-\alpha}\Delta l_2
maxΔl1=1−ααΔl2
很明显
α
\alpha
α越小越好,也就是保证每次迭代L1最不容易增加,但是太小反而会不具有辅助作用,也就是不提供新的方向了,我想这也是最终取0.4可能接近最优的原因。
(还是不够严格。。。但已经尽力解释了,不知道有没有道理)
由此想到的东西:
1)做输出的时候是不是可以利用上res4的输出结果?相当于我组合的Loss就直接反映了结果的准确度,这时候我感觉
α
\alpha
α可能并没有那么重要?
2)多加几个这样的辅助模块?但这样的简单罗列可能意义不大。
实验
主要看ablation下面这张图:
1)平均池化更好,金字塔结构更好,维数约减更好。
2)辅助监督的ablation上面说了,权重0.4最好。
后面就没啥了,就是各种数据集效果特别好。
其实主要学的就是这个金字塔+残差的思想,还有对于aux loss怎么起作用的一个理解,后面这个还要仔细推一推,看看有没有什么实验能做。