修改 第九章img

This commit is contained in:
shw2018 2018-10-31 10:05:07 +08:00
parent fb1b259cb4
commit 6be57a1ee2
58 changed files with 758 additions and 47 deletions

BIN
.DS_Store vendored

Binary file not shown.

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.ipynb_checkpoints
.DS_Store

View File

@ -3,7 +3,7 @@
作者scutan90
编辑者shw2018UESTC_孙洪卫_硕Wechatsunhwee
提交2018.10.25
更新2018.10.28
更新2018.10.31
#########################################################
# **第九章 图像分割**
@ -27,11 +27,11 @@
  
对于一般的分类CNN网络如VGG和Resnet都会在网络的最后加入一些全连接层经过softmax后就可以获得类别概率信息。但是这个概率信息是1维的即只能标识整个图片的类别不能标识每个像素点的类别所以这种全连接方法不适用于图像分割。
<center><img src="../img/ch8/figure_8.1.1_1.jpg"></center>
<center><img src="../img/ch9/figure_9.1.1_1.jpg"></center>
&emsp;&emsp;
而FCN提出可以把后面几个全连接都换成卷积这样就可以获得一张2维的feature map后接softmax获得每个像素点的分类信息从而解决了分割问题如图4。
<center><img src="../img/ch8/figure_8.1.1_2.jpg"></center>
<center><img src="../img/ch9/figure_9.1.1_2.jpg"></center>
<center>图 4</center>
**8.1.2 FCN网络结构**
@ -39,13 +39,13 @@
&emsp;&emsp;
FCN对图像进行像素级的分类从而解决了语义级别的图像分割semantic segmentation问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类全联接层softmax输出不同FCN可以接受任意尺寸的输入图像采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。
下图是语义分割所采用的全卷积网络(FCN)的结构示意图:
<center><img src="../img/ch8/figure_8.1.2_1.jpg"></center>
<center><img src="../img/ch9/figure_9.1.2_1.jpg"></center>
**8.1.3全卷积网络举例?**
&emsp;&emsp;
通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务因为它们最后都得到整个输入图像的一个概率向量比如AlexNet的ImageNet模型输出一个1000维的向量表示输入图像属于每一类的概率(softmax归一化)。
<center><img src="../img/ch8/figure_8.1.3_1.jpg"></center>
<center><img src="../img/ch9/figure_9.1.3_1.jpg"></center>
&emsp;&emsp;
如图所示:
@ -103,13 +103,13 @@ FCN对图像进行像素级的分类从而解决了语义级别的图像分
一个确定的CNN网络结构之所以要固定输入图片大小是因为全连接层权值数固定而该权值数和feature map大小有关, 但是FCN在CNN的基础上把1000个结点的全连接层改为含有1000个1×1卷积核的卷积层经过这一层还是得到二维的feature map同样我们也不关心这个feature map大小, 所以对于输入图片的size并没有限制。
&emsp;&emsp;
如下图所示FCN将传统CNN中的全连接层转化成卷积层对应CNN网络FCN把最后三层全连接层转换成为三层卷积层:
<center><img src="../img/ch8/figure_8.1.7_1.png"></center>
<center><img src="../img/ch9/figure_9.1.7_1.png"></center>
<center>一个分类网络</center>
<center><img src="../img/ch8/figure_8.1.7_2.png"></center>
<center><img src="../img/ch9/figure_9.1.7_2.png"></center>
<center>变为全卷积网络</center>
<center><img src="../img/ch8/figure_8.1.7_3.png"></center>
<center><img src="../img/ch9/figure_9.1.7_3.png"></center>
<center>End-to-end, pixels-to pixels网络</center>
<center><img src="../img/ch8/figure_8.1.7_4.jpg"></center>
<center><img src="../img/ch9/figure_9.1.7_4.jpg"></center>
&emsp;&emsp;
1全连接层转化为全卷积层 : 在传统的CNN结构中前5层是卷积层第6层和第7层分别是一个长度为4096的一维向量第8层是长度为1000的一维向量分别对应1000个不同类别的概率。FCN将这3层表示为卷积层卷积核的大小 (通道数,宽,高) 分别为 (4096,1,1)、(4096,1,1)、(1000,1,1)。看上去数字上并没有什么差别但是卷积跟全连接是不一样的概念和计算过程使用的是之前CNN已经训练好的权值和偏置但是不一样的在于权值和偏置是有自己的范围属于自己的一个卷积核。
@ -130,16 +130,16 @@ Upsampling的操作可以看成是反卷积(deconvolutional),卷积运算的
反卷积的运算如下所示:
&emsp;&emsp;
蓝色是反卷积层的input绿色是反卷积层的outputFull padding, transposed Full padding, transposed。
<center><img src="../img/ch8/figure_8.1.8_1.png"></center>
<center><img src="../img/ch9/figure_9.1.8_1.png"></center>
<center>上图中的反卷积input是2×2, output是4×4。 Zero padding, non-unit strides, transposed。</center>
<center><img src="../img/ch8/figure_8.1.8_2.png"></center>
<center><img src="../img/ch9/figure_9.1.8_2.png"></center>
<center>上图中的反卷积input feature map是3×3, 转化后是5×5, output是5×5</center>
**8.1.9跳级(skip)结构**
&emsp;&emsp;
对CNN的结果做处理得到了dense prediction而作者在试验中发现得到的分割结果比较粗糙所以考虑加入更多前层的细节信息也就是把倒数第几层的输出和最后的输出做一个fusion实际上也就是加和
<center><img src="../img/ch8/figure_8.1.9_1.png"></center>
<center><img src="../img/ch9/figure_9.1.9_1.png"></center>
&emsp;&emsp;
实验表明这样的分割结果更细致更准确。在逐层fusion的过程中做到第三行再往下结果又会变差所以作者做到这里就停了。
@ -164,7 +164,7 @@ Upsampling的操作可以看成是反卷积(deconvolutional),卷积运算的
*灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出。*
&emsp;&emsp;
*对于不同尺寸的输入图像各层数据的尺寸heightwidth相应变化深度channel不变。*
<center><img src="../img/ch8/figure_8.1.10_1.png"></center>
<center><img src="../img/ch9/figure_9.1.10_1.png"></center>
&emsp;&emsp;
1全卷积层部分进行特征提取, 提取卷积层3个蓝色层的输出来作为预测21个类别的特征。
@ -173,18 +173,18 @@ Upsampling的操作可以看成是反卷积(deconvolutional),卷积运算的
&emsp;&emsp;&emsp;&emsp;
1) 以经典的AlexNet分类网络为初始化。最后两级是全连接红色参数弃去不用。
<center><img src="../img/ch8/figure_8.1.10_2.png"></center>
<center><img src="../img/ch9/figure_9.1.10_2.png"></center>
&emsp;&emsp;&emsp;&emsp;
2) 从特征小图()预测分割小图(),之后直接升采样为大图。
<center><img src="../img/ch8/figure_8.1.10_3.png"></center>
<center><img src="../img/ch9/figure_9.1.10_3.png"></center>
<center>反卷积橙色的步长为32这个网络称为FCN-32s</center>
&emsp;&emsp;&emsp;&emsp;
3) 升采样分为两次完成橙色×2, 在第二次升采样前把第4个pooling层绿色的预测结果蓝色融合进来。使用跳级结构提升精确性。
<center><img src="../img/ch8/figure_8.1.10_4.png"></center>
<center><img src="../img/ch9/figure_9.1.10_4.png"></center>
<center>第二次反卷积步长为16这个网络称为FCN-16s</center>
&emsp;&emsp;&emsp;&emsp;
4) 升采样分为三次完成橙色×3, 进一步融合了第3个pooling层的预测结果。
<center><img src="../img/ch8/figure_8.1.10_5.png"></center>
<center><img src="../img/ch9/figure_9.1.10_5.png"></center>
<center>第三次反卷积步长为8记为FCN-8s</center>
其他参数:
@ -198,7 +198,7 @@ learning rate0.001。
反卷积参数初始化为bilinear插值。
&emsp;&emsp;
最后一层反卷积固定位bilinear插值不做学习。
<center><img src="../img/ch8/figure_8.1.10_6.png"></center>
<center><img src="../img/ch9/figure_9.1.10_6.png"></center>
**8.1.11 FCN缺点**
@ -219,7 +219,7 @@ learning rate0.001。
第二定位准确性和上下文间不可兼得。大的patches需要更多的max-pooling层这样减小了定位准确性(为什么因为你是对以这个像素为中心的点进行分类如果patch太大最后经过全连接层的前一层大小肯定是不变的如果你patch大就需要更多的pooling达到这个大小)因为Pooling层会降低分辨率丢失信息)而小的patches只能看到很小的局部信息包含的背景信息不够。许多现在的方法使用不同层的特征来同时兼容定位和利用context。
&emsp;&emsp;
在这篇论文,我们建立了一个更好全卷积方法。我们定义和扩展了这个方法它使用更少的训练图片但产生更精确的分割。
<center><img src="../img/ch8/figure_8.2_1.png"></center>
<center><img src="../img/ch9/figure_9.2_1.png"></center>
&emsp;&emsp;
(1) 使用全卷积神经网络。(全卷积神经网络就是卷积取代了全连接层,全连接层必须固定图像大小而卷积不用,所以这个策略使得,你可以输入任意尺寸的图片,而且输出也是图片,所以这是一个端到端的网络。)
@ -317,7 +317,7 @@ def get_unet():
3这种上采样模式可以包含到任何编码-解码网络中。
&emsp;&emsp;
SegNet网络的结构如下图所示
<center><img src="../img/ch8/figure_8.3_1.jpg"></center>
<center><img src="../img/ch9/figure_9.3_1.jpg"></center>
&emsp;&emsp;
SegNet网络结构如图1所示Input为输入图片Output为输出分割的图像不同颜色代表不同的分类。语义分割的重要性就在于不仅告诉你图片中某个东西是什么而且告知你他在图片的位置。我们可以看到是一个对称网络由中间绿色pooling层与红色upsampling层作为分割左边是卷积提取高维特征并通过pooling使图片变小SegNet作者称为Encoder右边是反卷积在这里反卷积与卷积没有区别与upsampling通过反卷积使得图像分类后特征得以重现upsampling使图像变大SegNet作者称为Decoder最后通过Softmax输出不同分类的最大值。这就是大致的SegNet过程下面对这个过程里面使用到的方法进行介绍。
@ -325,7 +325,7 @@ SegNet网络结构如图1所示Input为输入图片Output为输出分割
编码网络与滤波器族卷积得到特征图进行BNReLU最大池化。最大池化是为了获得空间小位移的平移不变。最大池化和下采样损失了边缘细节因此在编码过程中保存边缘信息很重要。考虑到内存原因只保存最大池化索引如最大特征值的位置。
&emsp;&emsp;
SegNet解码技术如下图所示
<center><img src="../img/ch8/figure_8.3_2.jpg"></center>
<center><img src="../img/ch9/figure_9.3_2.jpg"></center>
&emsp;&emsp;
解码网络使用保存的最大池化索引上采样得到稀疏的特征图将特征图与可训练的解码滤波器族卷积得到致密的特征图。之后进行BN。高维的特征图输入soft-max层对每个像素进行分类得到每个像素属于K类的概率。 图3中右边是FCN的解码技术FCN对编码的特征图进行降维降维后输入到解码网络解码网络中上采样使用反卷积实现上采样的特征图与降维的编码图进行element-wise add得到最终的解码特征图。FCN解码模型需要存储编码特征图在嵌入式设备中内存紧张。
@ -346,11 +346,11 @@ SegNet的Encoder过程中卷积的作用是提取特征SegNet使用的卷
3小物体信息无法重建 (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体信息将理论上无法重建。)
&emsp;&emsp;
举例如下:
<center><img src="../img/ch8/figure_8.3_3.png"></center>
<center><img src="../img/ch9/figure_9.3_3.png"></center>
<center>Dilated Convolution with a 3 x 3 kernel and dilation rate 2</center>
&emsp;&emsp;
下面看一下dilated conv原始论文[4]中的示意图
<center><img src="../img/ch8/figure_8.3_4.jpg"></center>
<center><img src="../img/ch9/figure_9.3_4.jpg"></center>
&emsp;&emsp;
(a) 图对应3x3的1-dilated conv和普通的卷积操作一样(b)图对应3x3的2-dilated conv实际的卷积kernel size还是3x3但是空洞为1也就是对于一个7x7的图像patch只有9个红色的点和3x3的kernel发生卷积操作其余的点略过。也可以理解为kernel的size为7x7但是只有图中的9个点的权重不为0其余都为0。 可以看到虽然kernel size只有3x3但是这个卷积的感受野已经增大到了7x7如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话那么每个红点就是1-dilated的卷积输出所以感受野为3x3所以1-dilated和2-dilated合起来就能达到7x7的conv,(c)图是4-dilated conv操作同理跟在两个1-dilated和2-dilated conv的后面能达到15x15的感受野。对比传统的conv操作3层3x3的卷积加起来stride为1的话只能达到(kernel-1) * layer+1=7的感受野也就是和层数layer成线性关系而dilated conv的感受野是指数级的增长。
@ -363,7 +363,7 @@ dilated的好处是不做pooling损失信息的情况下加大了感受野
网络结构:
&emsp;&emsp;
RefineNet block的作用就是把不同resolution level的feature map进行融合。网络结构如下
<center><img src="../img/ch8/figure_8.4_1.png"></center>
<center><img src="../img/ch9/figure_9.4_1.png"></center>
&emsp;&emsp;
最左边一栏就是FCN的encoder部分(文中是用的ResNet)先把pretrained ResNet按feature map的分辨率分成四个ResNet blocks然后向右把四个blocks分别作为4个path通过RefineNet block进行融合refine最后得到一个refined feature map(接softmax再双线性插值输出)。
注意除了RefineNet-4所有的RefineNet block都是二输入的用于融合不同level做refine而单输入的RefineNet-4可以看作是先对ResNet的一个task adaptation。
@ -372,7 +372,7 @@ RefineNet block的作用就是把不同resolution level的feature map进行融
**RefineNet Block**
&emsp;&emsp;
接下来仔细看一下RefineNet block可以看到主要组成部分是Residual convolution unit, Multi-resolution fusion, Chained residual pooling, Output convolutions. 切记这个block作用是融合多个level的feature map输出单个level的feature map但具体的实现应该是和输入个数、shape无关的。
<center><img src="../img/ch8/figure_8.4_2.png"></center>
<center><img src="../img/ch9/figure_9.4_2.png"></center>
&emsp;&emsp;
Residual convolution unit就是普通的去除了BN的residual unit
@ -391,7 +391,7 @@ Output convolutions就是输出前再加一个RCU。
作者认为FCN存在的主要问题是没有采取合适的策略来用全局的信息本文的做法就是借鉴SPPNet来设计了PSPNet解决这个问题。
&emsp;&emsp;
很多State-of-the-art的场景解析框架都是基于FCN的.基于CNN的方法能够增强动态物体的理解但是在无限制词汇和不同场景中仍然面临挑战.举个例子,如下图.
<center><img src="../img/ch8/figure_8.6_1.png"></center>
<center><img src="../img/ch9/figure_9.6_1.png"></center>
&emsp;&emsp;
FCN认为右侧框中是汽车但是实际上是船如果参考上下文的先验知识就会发现左边是一个船屋进而推断是框中是船.FCN存在的主要问题就是不能利用好全局的场景线索。
@ -415,10 +415,10 @@ FCN认为右侧框中是汽车但是实际上是船如果参考上下文
(3) 不显眼的类别Inconspicuous Classes
&emsp;&emsp;
总结以上结果发现以上问题部分或者全部与上下文关系和全局信息有关系因此本文提出了PSPNet.框架如下:
<center><img src="../img/ch8/figure_8.6_2.png"></center>
<center><img src="../img/ch9/figure_9.6_2.png"></center>
&emsp;&emsp;
并且加入额外的深度监督 Loss
<center><img src="../img/ch8/figure_8.6_3.png"></center>
<center><img src="../img/ch9/figure_9.6_3.png"></center>
## **8.7 DeepLab系列**
@ -460,7 +460,7 @@ DCNN 的分类不变形影响空间精度。DeepLabv2 是采样全连接的 CRF
好的论文不止说明怎么做还告诉为什么。DeepLab 延续到 DeepLabv3 系列,依然是在空洞卷积做文章,但是探讨不同结构的方向。
&emsp;&emsp;
DeepLabv3 论文比较了多种捕获多尺度信息的方式:
<center><img src="../img/ch8/figure_8.6_4.png"></center>
<center><img src="../img/ch9/figure_9.6_4.png"></center>
&emsp;&emsp;
1.Image Pyramid将输入图片放缩成不同比例分别应用在 DCNN 上,将预测结果融合得到最终输出。
@ -489,7 +489,7 @@ deeplab V3新设计的aspp结构解决了问题1deeplab v3+主要目的在于
问题2 可以使用空洞卷积替代更多的pooling层来获取分辨率更高的feature。但是feature分辨率更高会极大增加运算量。 以deeplab v3 使用的resnet101为例 stride=16将造成后面9层feature变大后面9层的计算量变为原来的2*2=4倍大。stride=8则更为恐怖后面78层的计算量都会变大很多。
&emsp;&emsp;
解决方案1、编解码器结构。2 Modified Aligned Xception
<center><img src="../img/ch8/figure_8.6_5.png"></center>
<center><img src="../img/ch9/figure_9.6_5.png"></center>
&emsp;&emsp;
在deeplabv3 基础上 加入解码器。 A是aspp结构。 A的8*的上采样可以看做是一个naïve的解码器。 B是编解码结构。集合了高层和底层的feature。 C就是本文采取的结构。Conv2图中红色的提取到结果和最后提取出的feature上采样4后融合。
@ -497,7 +497,7 @@ deeplab V3新设计的aspp结构解决了问题1deeplab v3+主要目的在于
方法:
&emsp;&emsp;
1Encoder-Decoder with Atrous Convolution
<center><img src="../img/ch8/figure_8.6_6.png"></center>
<center><img src="../img/ch9/figure_9.6_6.png"></center>
&emsp;&emsp;
编码器采用deeplabv3。
@ -509,7 +509,7 @@ deeplab V3新设计的aspp结构解决了问题1deeplab v3+主要目的在于
2Modified Aligned Xception
&emsp;&emsp;
Xception 主要采用了deepwish seperable convolution来替换原来的卷积层。简单的说就是这种结构能在更少参数更少计算量的情况下学到同样的信息。这边则是考虑将原来的resnet-101骨架网换成xception。
<center><img src="../img/ch8/figure_8.6_7.png"></center>
<center><img src="../img/ch9/figure_9.6_7.png"></center>
&emsp;&emsp;
红色部分为修改
@ -522,7 +522,7 @@ Xception 主要采用了deepwish seperable convolution来替换原来的卷积
## **8.8 Mask-R-CNN**
**8.8.1 Mask-RCNN 的网络结构示意图**
<center><img src="../img/ch8/figure_8.8_1.png"></center>
<center><img src="../img/ch9/figure_9.8_1.png"></center>
&emsp;&emsp;
其中 黑色部分为原来的 Faster-RCNN红色部分为在 Faster网络上的修改
@ -545,7 +545,7 @@ Xception 主要采用了deepwish seperable convolution来替换原来的卷积
&emsp;&emsp;
来看下后面两种 RCNN 方法与 Mask 结合的示意图:
<center><img src="../img/ch8/figure_8.8_2.png"></center>
<center><img src="../img/ch9/figure_9.8_2.png"></center>
&emsp;&emsp;
图中灰色部分是 原来的 RCNN 结合 ResNet or FPN 的网络,下面黑色部分为新添加的并联 Mask层这个图本身与上面的图也没有什么区别旨在说明作者所提出的Mask RCNN 方法的泛化适应能力 - 可以和多种 RCNN框架结合表现都不错。
@ -574,12 +574,12 @@ $$
$Lmask(Cls_k) = Sigmoid (Cls_k)$,平均二值交叉熵 average binary cross-entropyLoss通过逐像素的 Sigmoid 计算得到。
&emsp;&emsp;
Why K个mask通过对每个 Class 对应一个 Mask 可以有效避免类间竞争(其他 Class 不贡献 Loss )。
<center><img src="../img/ch8/figure_8.8_3.png"></center>
<center><img src="../img/ch9/figure_9.8_3.png"></center>
&emsp;&emsp;
通过结果对比来看Table2 b也就是作者所说的 Decouple 解耦,要比多分类 的 Softmax 效果好很多。
&emsp;&emsp;
另外,作者给出了很多实验分割效果,就不都列了,只贴一张 和 FCIS 的对比图FCIS 出现了Overlap 的问题)
<center><img src="../img/ch8/figure_8.8_4.png"></center>
<center><img src="../img/ch9/figure_9.8_4.png"></center>
## **8.9 CNN在基于弱监督学习的图像分割中的应用**
@ -604,10 +604,10 @@ https://zhuanlan.zhihu.com/p/23811946
ScribbleSup: Scribble-Supervised Convolutional Networks for Semantic Segmentation (CVPR 2016)
&emsp;&emsp;
香港中文大学的Di Lin提出了一个基于Scribble标记的弱监督学习方法。 Scribble是一个很方便使用的标记方法因此被用得比较广泛。如下图只需要画五条线就能完成对一副图像的标记工作。
<center><img src="../img/ch8/figure_8.9_1.png"></center>
<center><img src="../img/ch9/figure_9.9_1.png"></center>
&emsp;&emsp;
ScribbleSup分为两步第一步将像素的类别信息从scribbles传播到其他未标记的像素自动完成所有的训练图像的标记工作 第二步使用这些标记图像训练CNN。在第一步中该方法先生成super-pxels, 然后基于graph cut的方法对所有的super-pixel进行标记。
<center><img src="../img/ch8/figure_8.9_2.png"></center>
<center><img src="../img/ch9/figure_9.9_2.png"></center>
&emsp;&emsp;
Graph cut 的能量函数为:
$$
@ -619,7 +619,7 @@ $$
\sum_{i}\psi _i^{scr}\left ( y_i | X,S \right ) +\sum _i-logP\left(y_i | X,\theta \right)+\sum_{i,j}\psi _{ij}\left ( y_i,y_j| X \right )
$$
上式的最优化是通过交替求 和 的最优值来实现的。文章中发现通过三次迭代就能得到比较好的结果。
<center><img src="../img/ch8/figure_8.9_3.png"></center>
<center><img src="../img/ch9/figure_9.9_3.png"></center>
**8.9.2 图像级别标记**
@ -627,7 +627,7 @@ $$
Constrained Convolutional Neural Networks for Weakly Supervised Segmentation ICCV 2015
&emsp;&emsp;
UC Berkeley的Deepak Pathak 使用了一个具有图像级别标记的训练数据来做弱监督学习。训练数据中只给出图像中包含某种物体但是没有其位置信息和所包含的像素信息。该文章的方法将image tags转化为对CNN输出的label分布的限制条件因此称为 Constrained convolutional neural network (CCNN).
<center><img src="../img/ch8/figure_8.9_4.png"></center>
<center><img src="../img/ch9/figure_9.9_4.png"></center>
&emsp;&emsp;
该方法把训练过程看作是有线性限制条件的最优化过程:
$$
@ -638,7 +638,7 @@ subject \, \,to \, \, \,\, A\vec{P}\geq \vec{b,} \, \, \,\, \, \, \, \,\sum
$$
&emsp;&emsp;
其中 是一个隐含的类别分布, 是CNN预测的类别分布。目标函数是KL-divergence最小化。其中的线性限制条件来自于训练数据上的标记例如一幅图像中前景类别像素个数期望值的上界或者下界物体大小、某个类别的像素个数在某图像中为0或者至少为1等。该目标函数可以转化为为一个loss function然后通过SGD进行训练。
<center><img src="../img/ch8/figure_8.9_5.png"></center>
<center><img src="../img/ch9/figure_9.9_5.png"></center>
&emsp;&emsp;
实验中发现单纯使用Image tags作为限制条件得到的分割结果还比较差在PASCAL VOC 2012 test数据集上得到的mIoU为35.6%加上物体大小的限制条件后能达到45.1% 如果再使用bounding box做限制可以达到54%。FCN-8s可以达到62.2%,可见弱监督学习要取得好的结果还是比较难。
@ -648,7 +648,7 @@ $$
Weakly- and Semi-Supervised Learning of a DCNN for Semantic Image Segmentation
&emsp;&emsp;
Google的George Papandreou 和UCLA的Liang-Chieh Chen等在DeepLab的基础上进一步研究了使用bounding box和image-level labels作为标记的训练数据。使用了期望值最大化算法EM来估计未标记的像素的类别和CNN的参数。
<center><img src="../img/ch8/figure_8.9_6.png"></center>
<center><img src="../img/ch9/figure_9.9_6.png"></center>
&emsp;&emsp;
对于image-level标记的数据我们可以观测到图像的像素值 和图像级别的标记 ,但是不知道每个像素的标号 ,因此把 当做隐变量。使用如下的概率图模式:
$$
@ -656,7 +656,7 @@ P\left ( x,y,z;\theta \right ) = P\left ( x \right )\left (\prod_{m=1}^{M} P\lef
$$
&emsp;&emsp;
使用EM算法估计 和 。E步骤是固定 求 的期望值M步骤是固定 使用SGD计算。
<center><img src="../img/ch8/figure_8.9_7.png"></center>
<center><img src="../img/ch9/figure_9.9_7.png"></center>
&emsp;&emsp;
对于给出bounding box标记的训练图像该方法先使用CRF对该训练图像做自动分割然后在分割的基础上做全监督学习。通过实验发现单纯使用图像级别的标记得到的分割效果较差但是使用bounding box的训练数据可以得到较好的结果在VOC2012 test数据集上得到mIoU 62.2%。另外如果使用少量的全标记图像和大量的弱标记图像进行结合,可以得到与全监督学习(70.3%)接近的分割结果(69.0%)。
@ -671,7 +671,7 @@ $$
$$
&emsp;&emsp;
其中 是一个特征矩阵,每列代表了对于的类别的聚类特征。 是将第 个super-pixel划分到第 类的代价。在这个目标函数的基础上,根据不同的弱标记方式,可以给出不同的限制条件,因此该方法就是在相应的限制条件下求最大间隔聚类。
<center><img src="../img/ch8/figure_8.9_8.png"></center>
<center><img src="../img/ch9/figure_9.9_8.png"></center>
&emsp;&emsp;
该方法在Siftflow数据集上得到了比较好的结果比state-of-the-art的结果提高了10%以上。
@ -686,18 +686,18 @@ $$
卷积神经网络结构的设计主要朝着两个方向发展一个是更宽的网络代表GoogleNet、VGG一个是更深的网络代表ResNet。但是随着层数的加深会出现一个问题——梯度消失这将会导致网络停止训练。到目前为止解决这个问题的思路基本都是在前后层之间加一个identity connections(short path)。
![](../img/ch8/8-10-3.png)
![](../img/ch9/8-10-3.png)
由上图中可知Resnet是做值的相加也就是add操作通道数是不变的。而DenseNet是做通道的合并也就是Concatenation操作就像Inception那样。从这两个公式就可以看出这两个网络的本质不同。此外DensetNet的前面一层输出也是后面所有层的输入这也不同于ResNet残差网络。
![](../img/ch8/8-10-1.png)
![](../img/ch9/8-10-1.png)
DenseNet的Block结构如上图所示。
1*1卷积核的目的减少输入的特征图数量这样既能降维减少计算量又能融合各个通道的特征。我们将使用BottleNeck Layers的DenseNet表示为DenseNet-B。(在论文的实验里将1×1×n小卷积里的n设置为4kk为每个H产生的特征图数量)
![](../img/ch8/8-10-2.png)
![](../img/ch9/8-10-2.png)
上图是DenseNet网络的整体网络结构示意图。其中1*1卷积核的目的是进一步压缩参数并且在Transition Layer层有个参数Reduction范围是0到1表示将这些输出缩小到原来的多少倍默认是0.5这样传给下一个Dense Block的时候channel数量就会减少一半。当Reduction的值小于1的时候我们就把带有这种层的网络称为DenseNet-C。

View File

@ -0,0 +1,709 @@
#########################################################
### 深度学习500问-第九章 图像分割(md版本
作者scutan90
编辑者shw2018UESTC_孙洪卫_硕Wechatsunhwee
提交2018.10.25
更新2018.10.28
#########################################################
# **第九章 图像分割**
## **8.1 传统的基于CNN的分割方法缺点**
&emsp;&emsp;
传统的基于CNN的分割方法为了对一个像素分类使用该像素周围的一个图像块作为CNN的输入用于训练与预测这种方法主要有几个缺点
&emsp;&emsp;
1存储开销大例如对每个像素使用15 * 15的图像块然后不断滑动窗口将图像块输入到CNN中进行类别判断因此需要的存储空间随滑动窗口的次数和大小急剧上升
&emsp;&emsp;
2效率低下相邻像素块基本上是重复的针对每个像素块逐个计算卷积这种计算有很大程度上的重复
&emsp;&emsp;
3像素块的大小限制了感受区域的大小通常像素块的大小比整幅图像的大小小很多只能提取一些局部特征从而导致分类性能受到限制。
&emsp;&emsp;
而全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。
**8.1 FCN**
**8.1.1 FCN改变了什么?**
&emsp;&emsp;
对于一般的分类CNN网络如VGG和Resnet都会在网络的最后加入一些全连接层经过softmax后就可以获得类别概率信息。但是这个概率信息是1维的即只能标识整个图片的类别不能标识每个像素点的类别所以这种全连接方法不适用于图像分割。
<center><img src="../img/ch9/figure_9.1.1_1.jpg"></center>
&emsp;&emsp;
而FCN提出可以把后面几个全连接都换成卷积这样就可以获得一张2维的feature map后接softmax获得每个像素点的分类信息从而解决了分割问题如图4。
<center><img src="../img/ch9/figure_9.1.1_2.jpg"></center>
<center>图 4</center>
**8.1.2 FCN网络结构**
&emsp;&emsp;
FCN对图像进行像素级的分类从而解决了语义级别的图像分割semantic segmentation问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类全联接层softmax输出不同FCN可以接受任意尺寸的输入图像采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。
下图是语义分割所采用的全卷积网络(FCN)的结构示意图:
<center><img src="../img/ch9/figure_9.1.2_1.jpg"></center>
**8.1.3全卷积网络举例?**
&emsp;&emsp;
通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务因为它们最后都得到整个输入图像的一个概率向量比如AlexNet的ImageNet模型输出一个1000维的向量表示输入图像属于每一类的概率(softmax归一化)。
<center><img src="../img/ch9/figure_9.1.3_1.jpg"></center>
&emsp;&emsp;
如图所示:
&emsp;&emsp;
1在CNN中, 猫的图片输入到AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高, 用来做分类任务。
&emsp;&emsp;
2FCN与CNN的区别在于把于CNN最后的全连接层转换成卷积层输出的是一张已经Label好的图片, 而这个图片就可以做语义分割。
&emsp;&emsp;
3CNN的强大之处在于它的多层结构能自动学习特征并且可以学习到多个层次的特征 较浅的卷积层感知域较小,学习到一些局部区域的特征 较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。高层的抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高, 所以我们常常可以将卷积层看作是特征提取器。
**8.1.4为什么CNN对像素级别的分类很难**
&emsp;&emsp;
1存储开销很大。例如对每个像素使用的图像块的大小为15x15然后不断滑动窗口每次滑动的窗口给CNN进行判别分类因此则所需的存储空间根据滑动窗口的次数和大小急剧上升。
&emsp;&emsp;
2计算效率低下。相邻的像素块基本上是重复的针对每个像素块逐个计算卷积这种计算也有很大程度上的重复。
&emsp;&emsp;
3像素块大小的限制了感知区域的大小。通常像素块的大小比整幅图像的大小小很多只能提取一些局部的特征从而导致分类的性能受到限制。
**8.1.5全连接层和卷积层如何相互转化?**
&emsp;&emsp;
**两者相互转换的可能性:**
&emsp;&emsp;
全连接层和卷积层之间唯一的不同就是卷积层中的神经元只与输入数据中的一个局部区域连接,并且在卷积列中的神经元共享参数。然而在两类层中,神经元都是计算点积,所以它们的函数形式是一样的。因此,将此两者相互转化是可能的:
&emsp;&emsp;
1对于任一个卷积层都存在一个能实现和它一样的前向传播函数的全连接层。权重矩阵是一个巨大的矩阵除了某些特定块其余部分都是零。而在其中大部分块中元素都是相等的。
&emsp;&emsp;
2任何全连接层都可以被转化为卷积层。比如VGG16中第一个全连接层是25088 * 4096的数据尺寸将它转化为512 * 7 * 7 * 4096的数据尺寸即一个K=4096的全连接层输入数据体的尺寸是7 * 7 * 512这个全连接层可以被等效地看做一个F=7, P=0, S=1, K=4096 的卷积层。换句话说就是将滤波器的尺寸设置为和输入数据体的尺寸一致7 * 7, 这样输出就变为1 * 1 * 4096, 本质上和全连接层的输出是一样的。
&emsp;&emsp;
**输出激活数据体深度是由卷积核的数目决定的(K=4096)。**
&emsp;&emsp;
在两种变换中将全连接层转化为卷积层在实际运用中更加有用。假设一个卷积神经网络的输入是227x227x3的图像一系列的卷积层和下采样层将图像数据变为尺寸为7x7x512的激活数据体, AlexNet的处理方式为使用了两个尺寸为4096的全连接层最后一个有1000个神经元的全连接层用于计算分类评分。我们可以将这3个全连接层中的任意一个转化为卷积层
&emsp;&emsp;
1第一个连接区域是[7x7x512]的全连接层令其滤波器尺寸为F=7,K=4096这样输出数据体就为[1x1x4096]。
&emsp;&emsp;
2第二个全连接层令其滤波器尺寸为F=1,K=4096这样输出数据体为[1x1x4096]。
&emsp;&emsp;
3最后一个全连接层也做类似的令其F=1,K=1000最终输出为[1x1x1000]。
**8.1.6 FCN的输入图片为什么可以是任意大小**
&emsp;&emsp;
对于CNN一幅输入图片在经过卷积和pooling层时这些层是不关心图片大小的。比如对于一个卷积层outputsize = (inputsize - kernelsize) / stride + 1它并不关心inputsize多大对于一个inputsize大小的输入feature map滑窗卷积输出outputsize大小的feature map即可。pooling层同理。但是在进入全连接层时feature map假设大小为n×n要拉成一条向量而向量中每个元素共n×n个作为一个结点都要与下一个层的所有结点假设4096个全连接这里的权值个数是4096×n×n而我们知道神经网络结构一旦确定它的权值个数都是固定的所以这个n不能变化n是conv5的outputsize所以层层向回看每个outputsize都要固定那每个inputsize都要固定因此输入图片大小要固定。
**8.1.7把全连接层的权重W重塑成卷积层的滤波器有什么好处**
&emsp;&emsp;
这样的转化可以在单个向前传播的过程中, 使得卷积网络在一张更大的输入图片上滑动,从而得到多个输出(可以理解为一个label map)。
&emsp;&emsp;
比如: 我们想让224×224尺寸的浮窗以步长为32在384×384的图片上滑动把每个经停的位置都带入卷积网络最后得到6×6个位置的类别得分, 那么通过将全连接层转化为卷积层之后的运算过程为:
&emsp;&emsp;
如果224×224的输入图片经过卷积层和下采样层之后得到了[7x7x512]的数组那么384×384的大图片直接经过同样的卷积层和下采样层之后会得到[12x12x512]的数组, 然后再经过上面由3个全连接层转化得到的3个卷积层最终得到[6x6x1000]的输出((12 7)/1 + 1 = 6), 这个结果正是浮窗在原图经停的6×6个位置的得分。
&emsp;&emsp;
一个确定的CNN网络结构之所以要固定输入图片大小是因为全连接层权值数固定而该权值数和feature map大小有关, 但是FCN在CNN的基础上把1000个结点的全连接层改为含有1000个1×1卷积核的卷积层经过这一层还是得到二维的feature map同样我们也不关心这个feature map大小, 所以对于输入图片的size并没有限制。
&emsp;&emsp;
如下图所示FCN将传统CNN中的全连接层转化成卷积层对应CNN网络FCN把最后三层全连接层转换成为三层卷积层:
<center><img src="../img/ch9/figure_9.1.7_1.png"></center>
<center>一个分类网络</center>
<center><img src="../img/ch9/figure_9.1.7_2.png"></center>
<center>变为全卷积网络</center>
<center><img src="../img/ch9/figure_9.1.7_3.png"></center>
<center>End-to-end, pixels-to pixels网络</center>
<center><img src="../img/ch9/figure_9.1.7_4.jpg"></center>
&emsp;&emsp;
1全连接层转化为全卷积层 : 在传统的CNN结构中前5层是卷积层第6层和第7层分别是一个长度为4096的一维向量第8层是长度为1000的一维向量分别对应1000个不同类别的概率。FCN将这3层表示为卷积层卷积核的大小 (通道数,宽,高) 分别为 (4096,1,1)、(4096,1,1)、(1000,1,1)。看上去数字上并没有什么差别但是卷积跟全连接是不一样的概念和计算过程使用的是之前CNN已经训练好的权值和偏置但是不一样的在于权值和偏置是有自己的范围属于自己的一个卷积核。
&emsp;&emsp;
2CNN中输入的图像大小是统一固定成227x227大小的图像第一层pooling后为55x55第二层pooling后图像大小为27x27第五层pooling后的图像大小为13x13, 而FCN输入的图像是H * W大小第一层pooling后变为原图大小的1/2第二层变为原图大小的1/4第五层变为原图大小的1/8第八层变为原图大小的1/16。
&emsp;&emsp;
3经过多次卷积和pooling以后得到的图像越来越小分辨率越来越低。其中图像到H/32 * W/32的时候图片是最小的一层时所产生图叫做heatmap热图热图就是我们最重要的高维特征图得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling把图像进行放大几次到原图像的大小。
&emsp;&emsp;
相较于使用被转化前的原始卷积神经网络对所有36个位置进行迭代计算优化模型然后再对36个位置做预测使用转化后的卷积神经网络进行一次前向传播计算要高效得多因为36次计算都在共享计算资源。这一技巧在实践中经常使用通常将一张图像尺寸变得更大然后使用变换后的卷积神经网络来对空间上很多不同位置进行评价得到分类评分然后在求这些分值的平均值。
**8.1.8反卷积层理解**
&emsp;&emsp;
Upsampling的操作可以看成是反卷积(deconvolutional)卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过bp算法学习得到。反卷积层也是卷积层不关心input大小滑窗卷积后输出output。deconv并不是真正的deconvolution卷积的逆变换最近比较公认的叫法应该是transposed convolutiondeconv的前向传播就是conv的反向传播。
&emsp;&emsp;
反卷积参数: 利用卷积过程filter的转置实际上就是水平和竖直方向上翻转filter作为计算卷积前的特征图。
&emsp;&emsp;
反卷积的运算如下所示:
&emsp;&emsp;
蓝色是反卷积层的input绿色是反卷积层的outputFull padding, transposed Full padding, transposed。
<center><img src="../img/ch9/figure_9.1.8_1.png"></center>
<center>上图中的反卷积input是2×2, output是4×4。 Zero padding, non-unit strides, transposed。</center>
<center><img src="../img/ch9/figure_9.1.8_2.png"></center>
<center>上图中的反卷积input feature map是3×3, 转化后是5×5, output是5×5</center>
**8.1.9跳级(skip)结构**
&emsp;&emsp;
对CNN的结果做处理得到了dense prediction而作者在试验中发现得到的分割结果比较粗糙所以考虑加入更多前层的细节信息也就是把倒数第几层的输出和最后的输出做一个fusion实际上也就是加和
<center><img src="../img/ch9/figure_9.1.9_1.png"></center>
&emsp;&emsp;
实验表明这样的分割结果更细致更准确。在逐层fusion的过程中做到第三行再往下结果又会变差所以作者做到这里就停了。
**8.1.10模型训练**
&emsp;&emsp;
1用AlexNetVGG16或者GoogleNet训练好的模型做初始化在这个基础上做fine-tuning全部都fine-tuning只需在末尾加上upsampling参数的学习还是利用CNN本身的反向传播原理。
&emsp;&emsp;
2采用whole image做训练不进行patchwise sampling。实验证明直接用全图已经很effective and efficient。
&emsp;&emsp;
3对class score的卷积层做全零初始化。随机初始化在性能和收敛上没有优势。
*举例:*
&emsp;&emsp;
*FCN例子: 输入可为任意尺寸图像彩色图像输出与输入尺寸相同深度为20类目标+背景=21模型基于AlexNet。*
&emsp;&emsp;
*蓝色:卷积层。*
&emsp;&emsp;
*绿色Max Pooling层。*
&emsp;&emsp;
*黄色: 求和运算, 使用逐数据相加,把三个不同深度的预测结果进行融合:较浅的结果更为精细,较深的结果更为鲁棒。*
&emsp;&emsp;
*灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出。*
&emsp;&emsp;
*对于不同尺寸的输入图像各层数据的尺寸heightwidth相应变化深度channel不变。*
<center><img src="../img/ch9/figure_9.1.10_1.png"></center>
&emsp;&emsp;
1全卷积层部分进行特征提取, 提取卷积层3个蓝色层的输出来作为预测21个类别的特征。
&emsp;&emsp;
2图中虚线内是反卷积层的运算, 反卷积层3个橙色层可以把输入数据尺寸放大。和卷积层一样升采样的具体参数经过训练确定。
&emsp;&emsp;&emsp;&emsp;
1) 以经典的AlexNet分类网络为初始化。最后两级是全连接红色参数弃去不用。
<center><img src="../img/ch9/figure_9.1.10_2.png"></center>
&emsp;&emsp;&emsp;&emsp;
2) 从特征小图()预测分割小图(),之后直接升采样为大图。
<center><img src="../img/ch9/figure_9.1.10_3.png"></center>
<center>反卷积橙色的步长为32这个网络称为FCN-32s</center>
&emsp;&emsp;&emsp;&emsp;
3) 升采样分为两次完成橙色×2, 在第二次升采样前把第4个pooling层绿色的预测结果蓝色融合进来。使用跳级结构提升精确性。
<center><img src="../img/ch9/figure_9.1.10_4.png"></center>
<center>第二次反卷积步长为16这个网络称为FCN-16s</center>
&emsp;&emsp;&emsp;&emsp;
4) 升采样分为三次完成橙色×3, 进一步融合了第3个pooling层的预测结果。
<center><img src="../img/ch9/figure_9.1.10_5.png"></center>
<center>第三次反卷积步长为8记为FCN-8s</center>
其他参数:
&emsp;&emsp;
minibatch20张图片。
&emsp;&emsp;
learning rate0.001。
&emsp;&emsp;
初始化分类网络之外的卷积层参数初始化为0。
&emsp;&emsp;
反卷积参数初始化为bilinear插值。
&emsp;&emsp;
最后一层反卷积固定位bilinear插值不做学习。
<center><img src="../img/ch9/figure_9.1.10_6.png"></center>
**8.1.11 FCN缺点**
&emsp;&emsp;
1得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多但是上采样的结果还是比较模糊和平滑对图像中的细节不敏感。
&emsp;&emsp;
2对各个像素进行分类没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整spatial regularization步骤缺乏空间一致性。
## **8.2 U-Net**
&emsp;&emsp;
卷积网络的典型利用是在分类任务输出任务的单个类标签。然而在许多视觉任务尤其是生物医学图像处理目标输出应该包括定位等每个像素都应该有类标签。另外大量的训练图片往往超过生物医学图像的任务要求。所以Ciresan等训练了一个神经网络用滑动窗口来预测每个像素的类标签提供像素的周围区域patch作为输入。首先这个网络可以定位。第二输入的是patches这样训练数据就比图片数据多很多。
&emsp;&emsp;
明显的Ciresan的方法有两个缺点。
&emsp;&emsp;
第一它很慢因为这个网络必须训练每个patch并且因为patch间的重叠有很多的冗余(冗余会造成什么影响呢卷积核里面的W就是提取特征的权重两个块如果重叠的部分太多这个权重会被同一些特征训练两次造成资源的浪费减慢训练时间和效率虽然说会有一些冗余训练集大了准确率不就高了吗可是你这个是相同 的图片啊重叠的东西都是相同的举个例子我用一张相同的图片训练20次按照这个意思也是增大了训练集啊可是会出现什么结果呢很显然会导致过拟合也就是对你这个图片识别很准别的图片就不一定了)。
&emsp;&emsp;
第二定位准确性和上下文间不可兼得。大的patches需要更多的max-pooling层这样减小了定位准确性(为什么因为你是对以这个像素为中心的点进行分类如果patch太大最后经过全连接层的前一层大小肯定是不变的如果你patch大就需要更多的pooling达到这个大小)因为Pooling层会降低分辨率丢失信息)而小的patches只能看到很小的局部信息包含的背景信息不够。许多现在的方法使用不同层的特征来同时兼容定位和利用context。
&emsp;&emsp;
在这篇论文,我们建立了一个更好全卷积方法。我们定义和扩展了这个方法它使用更少的训练图片但产生更精确的分割。
<center><img src="../img/ch9/figure_9.2_1.png"></center>
&emsp;&emsp;
(1) 使用全卷积神经网络。(全卷积神经网络就是卷积取代了全连接层,全连接层必须固定图像大小而卷积不用,所以这个策略使得,你可以输入任意尺寸的图片,而且输出也是图片,所以这是一个端到端的网络。)
&emsp;&emsp;
(2) 左边的网络contracting path使用卷积和maxpooling。
&emsp;&emsp;
(3) 右边的网络expansive path:使用上采样与左侧contracting path ,pooling层的featuremap相结合然后逐层上采样到392X392的大小heatmap。pooling层会丢失图像信息和降低图像分辨率且是不可逆的操作对图像分割任务有一些影响对图像分类任务的影响不大为什么要做上采样
&emsp;&emsp;
因为上采样可以补足一些图片的信息,但是信息补充的肯 定不完全,所以还需要与左边的分辨率比较高的图片相连接起来(直接复制过来再裁剪到与上采样图片一样大小),这就相当于在高分辨率和更抽象特征当中做一个折衷,因为随着卷积次数增多,提取的特征也更加有效,更加抽象,上采样的图片是经历多次卷积后的图片,肯定是比较高效和抽象的图片,然后把它与左边不怎么抽象但更高分辨率的特征图片进行连接)。
&emsp;&emsp;
(4) 最后再经过两次卷积达到最后的heatmap再用一个1X1的卷积做分类这里是分成两类所以用的是两个神经元做卷积得到最后的两张heatmap,例如第一张表示的是第一类的得分即每个像素点对应第一类都有一个得分第二张表示第二类的得分heatmap,然后作为softmax函数的输入算出概率比较大的softmax类选择它作为输入给交叉熵进行反向传播训练。
## 下面是U-Net模型的代码实现贡献者黄钦建华南理工大学
```
def get_unet():
inputs = Input((img_rows, img_cols, 1))
conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
# pool1 = Dropout(0.25)(pool1)
# pool1 = BatchNormalization()(pool1)
conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1)
conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
# pool2 = Dropout(0.5)(pool2)
# pool2 = BatchNormalization()(pool2)
conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool2)
conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv3)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
# pool3 = Dropout(0.5)(pool3)
# pool3 = BatchNormalization()(pool3)
conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool3)
conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)
# pool4 = Dropout(0.5)(pool4)
# pool4 = BatchNormalization()(pool4)
conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool4)
conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv5)
up6 = concatenate([Conv2DTranspose(256, (2, 2), strides=(
2, 2), padding='same')(conv5), conv4], axis=3)
# up6 = Dropout(0.5)(up6)
# up6 = BatchNormalization()(up6)
conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(up6)
conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv6)
up7 = concatenate([Conv2DTranspose(128, (2, 2), strides=(
2, 2), padding='same')(conv6), conv3], axis=3)
# up7 = Dropout(0.5)(up7)
# up7 = BatchNormalization()(up7)
conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(up7)
conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv7)
up8 = concatenate([Conv2DTranspose(64, (2, 2), strides=(
2, 2), padding='same')(conv7), conv2], axis=3)
# up8 = Dropout(0.5)(up8)
# up8 = BatchNormalization()(up8)
conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(up8)
conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv8)
up9 = concatenate([Conv2DTranspose(32, (2, 2), strides=(
2, 2), padding='same')(conv8), conv1], axis=3)
# up9 = Dropout(0.5)(up9)
# up9 = BatchNormalization()(up9)
conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(up9)
conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv9)
# conv9 = Dropout(0.5)(conv9)
conv10 = Conv2D(1, (1, 1), activation='sigmoid')(conv9)
model = Model(inputs=[inputs], outputs=[conv10])
model.compile(optimizer=Adam(lr=1e-5),
loss=dice_coef_loss, metrics=[dice_coef])
return model
```
## **8.3 SegNet**
&emsp;&emsp;
可训练的图像分割引擎包含一个encoder网络一个对应的decoder网络衔接像素级分类层解码网络与VGG16的13层卷积层相同。解码网络是将低分辨率的编码特征图映射到全分辨率的特征图。解码网络使用最大池化层的池化索引进行非线性上采样上采样过程就不需要学习。上采样得到的稀疏图与可训练的滤波器卷积得到致密的特征图。
&emsp;&emsp;
使用池化层索引进行上采样的优势:
&emsp;&emsp;
1提升边缘刻画度
&emsp;&emsp;
2减少训练的参数
&emsp;&emsp;
3这种上采样模式可以包含到任何编码-解码网络中。
&emsp;&emsp;
SegNet网络的结构如下图所示
<center><img src="../img/ch9/figure_9.3_1.jpg"></center>
&emsp;&emsp;
SegNet网络结构如图1所示Input为输入图片Output为输出分割的图像不同颜色代表不同的分类。语义分割的重要性就在于不仅告诉你图片中某个东西是什么而且告知你他在图片的位置。我们可以看到是一个对称网络由中间绿色pooling层与红色upsampling层作为分割左边是卷积提取高维特征并通过pooling使图片变小SegNet作者称为Encoder右边是反卷积在这里反卷积与卷积没有区别与upsampling通过反卷积使得图像分类后特征得以重现upsampling使图像变大SegNet作者称为Decoder最后通过Softmax输出不同分类的最大值。这就是大致的SegNet过程下面对这个过程里面使用到的方法进行介绍。
&emsp;&emsp;
编码网络与滤波器族卷积得到特征图进行BNReLU最大池化。最大池化是为了获得空间小位移的平移不变。最大池化和下采样损失了边缘细节因此在编码过程中保存边缘信息很重要。考虑到内存原因只保存最大池化索引如最大特征值的位置。
&emsp;&emsp;
SegNet解码技术如下图所示
<center><img src="../img/ch9/figure_9.3_2.jpg"></center>
&emsp;&emsp;
解码网络使用保存的最大池化索引上采样得到稀疏的特征图将特征图与可训练的解码滤波器族卷积得到致密的特征图。之后进行BN。高维的特征图输入soft-max层对每个像素进行分类得到每个像素属于K类的概率。 图3中右边是FCN的解码技术FCN对编码的特征图进行降维降维后输入到解码网络解码网络中上采样使用反卷积实现上采样的特征图与降维的编码图进行element-wise add得到最终的解码特征图。FCN解码模型需要存储编码特征图在嵌入式设备中内存紧张。
&emsp;&emsp;
SegNet的Encoder过程中卷积的作用是提取特征SegNet使用的卷积为same卷积详见卷积神经网络CNN1)即卷积后不改变图片大小在Decoder过程中同样使用same卷积不过卷积的作用是为upsampling变大的图像丰富信息使得在Pooling过程丢失的信息可以通过学习在Decoder得到。SegNet中的卷积与传统CNN的卷积并没有区别。
## **8.4 空洞卷积(Dilated Convolutions)**
&emsp;&emsp;
在图像分割领域图像输入到CNN典型的网络比如FCN[3]FCN先像传统的CNN那样对图像做卷积再pooling降低图像尺寸的同时增大感受野但是由于图像分割预测是pixel-wise的输出所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测upsampling一般采用deconv反卷积操作deconv可参见知乎答案如何理解深度学习中的deconvolution networks之前的pooling操作使得每个pixel预测都能看到较大感受野信息。因此图像分割FCN中有两个关键一个是pooling减小图像尺寸增大感受野另一个是upsampling扩大图像尺寸。在先减小再增大尺寸的过程中肯定有一些信息损失掉了那么能不能设计一种新的操作不通过pooling也能有较大的感受野看到更多的信息呢答案就是dilated conv。
&emsp;&emsp;
以前的CNN主要问题总结
&emsp;&emsp;
1Up-sampling / pooling layer
&emsp;&emsp;
2内部数据结构丢失空间层级化信息丢失。
&emsp;&emsp;
3小物体信息无法重建 (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体信息将理论上无法重建。)
&emsp;&emsp;
举例如下:
<center><img src="../img/ch9/figure_9.3_3.png"></center>
<center>Dilated Convolution with a 3 x 3 kernel and dilation rate 2</center>
&emsp;&emsp;
下面看一下dilated conv原始论文[4]中的示意图
<center><img src="../img/ch9/figure_9.3_4.jpg"></center>
&emsp;&emsp;
(a) 图对应3x3的1-dilated conv和普通的卷积操作一样(b)图对应3x3的2-dilated conv实际的卷积kernel size还是3x3但是空洞为1也就是对于一个7x7的图像patch只有9个红色的点和3x3的kernel发生卷积操作其余的点略过。也可以理解为kernel的size为7x7但是只有图中的9个点的权重不为0其余都为0。 可以看到虽然kernel size只有3x3但是这个卷积的感受野已经增大到了7x7如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话那么每个红点就是1-dilated的卷积输出所以感受野为3x3所以1-dilated和2-dilated合起来就能达到7x7的conv,(c)图是4-dilated conv操作同理跟在两个1-dilated和2-dilated conv的后面能达到15x15的感受野。对比传统的conv操作3层3x3的卷积加起来stride为1的话只能达到(kernel-1) * layer+1=7的感受野也就是和层数layer成线性关系而dilated conv的感受野是指数级的增长。
&emsp;&emsp;
dilated的好处是不做pooling损失信息的情况下加大了感受野让每个卷积输出都包含较大范围的信息。在图像需要全局信息或者语音文本需要较长的sequence信息依赖的问题中都能很好的应用dilated conv比如图像分割、语音合成WaveNet、机器翻译ByteNet中。
## **8.5 RefineNet**
&emsp;&emsp;
网络结构:
&emsp;&emsp;
RefineNet block的作用就是把不同resolution level的feature map进行融合。网络结构如下
<center><img src="../img/ch9/figure_9.4_1.png"></center>
&emsp;&emsp;
最左边一栏就是FCN的encoder部分(文中是用的ResNet)先把pretrained ResNet按feature map的分辨率分成四个ResNet blocks然后向右把四个blocks分别作为4个path通过RefineNet block进行融合refine最后得到一个refined feature map(接softmax再双线性插值输出)。
注意除了RefineNet-4所有的RefineNet block都是二输入的用于融合不同level做refine而单输入的RefineNet-4可以看作是先对ResNet的一个task adaptation。
&emsp;&emsp;
**RefineNet Block**
&emsp;&emsp;
接下来仔细看一下RefineNet block可以看到主要组成部分是Residual convolution unit, Multi-resolution fusion, Chained residual pooling, Output convolutions. 切记这个block作用是融合多个level的feature map输出单个level的feature map但具体的实现应该是和输入个数、shape无关的。
<center><img src="../img/ch9/figure_9.4_2.png"></center>
&emsp;&emsp;
Residual convolution unit就是普通的去除了BN的residual unit
&emsp;&emsp;
Multi-resolution fusion是先对多输入的feature map都用一个卷积层进行adaptation(都化到最小的feature map的shape)再上采样再做element-wise的相加。注意如果是像RefineNet-4那样的单输入block这一部分就直接pass了
&emsp;&emsp;
Chained residual pooling 没太看懂怎么残差相加的(其中的ReLU非常重要),之后再修改;
&emsp;&emsp;
Output convolutions就是输出前再加一个RCU。
## **8.6 PSPNet**
&emsp;&emsp;
场景解析对于无限制的开放词汇和不同场景来说是具有挑战性的.本文使用文中的pyramid pooling module实现基于不同区域的上下文集成提出了PSPNet实现利用上下文信息的能力进行场景解析。
&emsp;&emsp;
作者认为FCN存在的主要问题是没有采取合适的策略来用全局的信息本文的做法就是借鉴SPPNet来设计了PSPNet解决这个问题。
&emsp;&emsp;
很多State-of-the-art的场景解析框架都是基于FCN的.基于CNN的方法能够增强动态物体的理解但是在无限制词汇和不同场景中仍然面临挑战.举个例子,如下图.
<center><img src="../img/ch9/figure_9.6_1.png"></center>
&emsp;&emsp;
FCN认为右侧框中是汽车但是实际上是船如果参考上下文的先验知识就会发现左边是一个船屋进而推断是框中是船.FCN存在的主要问题就是不能利用好全局的场景线索。
&emsp;&emsp;
对于尤其复杂的场景理解之前都是采用空间金字塔池化来做的和之前方法不同为什么不同需要参考一下经典的金字塔算法本文提出了pyramid scene parsing network(PSPNet)。
&emsp;&emsp;
本文的主要贡献如下:
&emsp;&emsp;
(1) 提出了PSPNet在基于FCN的框架中集成困难的上下文特征
&emsp;&emsp;
(2) 通过基于深度监督误差开发了针对ResNet的高效优化策略
&emsp;&emsp;
(3) 构建了一个用于state-of-the-art的场景解析和语义分割的实践系统具体是什么
&emsp;&emsp;
通过观察FCN的结果发现了如下问题
&emsp;&emsp;
(1) 关系不匹配Mismatched Relationship
&emsp;&emsp;
(2) 易混淆的类别Confusion Categories
&emsp;&emsp;
(3) 不显眼的类别Inconspicuous Classes
&emsp;&emsp;
总结以上结果发现以上问题部分或者全部与上下文关系和全局信息有关系因此本文提出了PSPNet.框架如下:
<center><img src="../img/ch9/figure_9.6_2.png"></center>
&emsp;&emsp;
并且加入额外的深度监督 Loss
<center><img src="../img/ch9/figure_9.6_3.png"></center>
## **8.7 DeepLab系列**
**8.7.1 DeepLabv1**
&emsp;&emsp;
DeepLab 是结合了深度卷积神经网络DCNNs和概率图模型DenseCRFs的方法。
&emsp;&emsp;
在实验中发现 DCNNs 做语义分割时精准度不够的问题,根本原因是 DCNNs 的高级特征的平移不变性,即高层次特征映射,根源于重复的池化和下采样。
&emsp;&emsp;
针对信号下采样或池化降低分辨率DeepLab 是采用的 atrous带孔算法扩展感受野获取更多的上下文信息。
&emsp;&emsp;
分类器获取以对象中心的决策是需要空间变换的不变性,这天然地限制了 DCNN 的定位精度DeepLab 采用完全连接的条件随机场CRF提高模型捕获细节的能力。
&emsp;&emsp;
除空洞卷积和 CRFs 之外,论文使用的 tricks 还有 Multi-Scale features。其实就是 U-Net 和 FPN 的思想,在输入图像和前四个最大池化层的输出上附加了两层的 MLP第一层是 128 个 3×3 卷积,第二层是 128 个 1×1 卷积。最终输出的特征与主干网的最后一层特征图融合,特征图增加 5×128=640 个通道。
&emsp;&emsp;
实验表示多尺度有助于提升预测结果,但是效果不如 CRF 明显。
&emsp;&emsp;
论文模型基于 VGG16在 Titan GPU 上运行速度达到了 8FPS全连接 CRF 平均推断需要 0.5s ,在 PASCAL VOC-2012 达到 71.6% IOU accuracy。
**8.7.2 DeepLabv2**
&emsp;&emsp;
DeepLabv2 是相对于 DeepLabv1 基础上的优化。DeepLabv1 在三个方向努力解决但是问题依然存在特征分辨率的降低、物体存在多尺度DCNN 的平移不变性。
&emsp;&emsp;
因 DCNN 连续池化和下采样造成分辨率降低DeepLabv2 在最后几个最大池化层中去除下采样,取而代之的是使用空洞卷积,以更高的采样密度计算特征映射。
&emsp;&emsp;
物体存在多尺度的问题DeepLabv1 中是用多个 MLP 结合多尺度特征解决,虽然可以提供系统的性能,但是增加特征计算量和存储空间。
&emsp;&emsp;
论文受到 Spatial Pyramid Pooling (SPP) 的启发,提出了一个类似的结构,在给定的输入上以不同采样率的空洞卷积并行采样,相当于以多个比例捕捉图像的上下文,称为 ASPP (atrous spatial pyramid pooling) 模块。
&emsp;&emsp;
DCNN 的分类不变形影响空间精度。DeepLabv2 是采样全连接的 CRF 在增强模型捕捉细节的能力。
&emsp;&emsp;
论文模型基于 ResNet在 NVidia Titan X GPU 上运行速度达到了 8FPS全连接 CRF 平均推断需要 0.5s ,在耗时方面和 DeepLabv1 无差异,但在 PASCAL VOC-2012 达到 79.7 mIOU。
**8.7.3 DeepLabv3**
&emsp;&emsp;
好的论文不止说明怎么做还告诉为什么。DeepLab 延续到 DeepLabv3 系列,依然是在空洞卷积做文章,但是探讨不同结构的方向。
&emsp;&emsp;
DeepLabv3 论文比较了多种捕获多尺度信息的方式:
<center><img src="../img/ch9/figure_9.6_4.png"></center>
&emsp;&emsp;
1.Image Pyramid将输入图片放缩成不同比例分别应用在 DCNN 上,将预测结果融合得到最终输出。
&emsp;&emsp;
2.Encoder-Decoder利用 Encoder 阶段的多尺度特征,运用到 Decoder 阶段上恢复空间分辨率,代表工作有 FCN、SegNet、PSPNet 等工。
&emsp;&emsp;
3.Deeper w. Atrous Convolution在原始模型的顶端增加额外的模块例如 DenseCRF捕捉像素间长距离信息。
&emsp;&emsp;
4.Spatial Pyramid Pooling空间金字塔池化具有不同采样率和多种视野的卷积核能够以多尺度捕捉对象。
&emsp;&emsp;
DeepLabv1-v2 都是使用带孔卷积提取密集特征来进行语义分割。但是为了解决分割对象的多尺度问题DeepLabv3 设计采用多比例的带孔卷积级联或并行来捕获多尺度背景。
&emsp;&emsp;
此外DeepLabv3 将修改之前提出的带孔空间金字塔池化模块,该模块用于探索多尺度卷积特征,将全局背景基于图像层次进行编码获得特征,取得 state-of-art 性能,在 PASCAL VOC-2012 达到 86.9 mIOU。
**8.7.4 DeepLabv3+**
&emsp;&emsp;
语义分割关注的问题:
&emsp;&emsp;
1、 实例对象多尺度问题。
&emsp;&emsp;
2、 因为深度网络存在stride=2的层会导致feature分辨率下降从而导致预测精度降低而造成的边界信息丢失问题。
&emsp;&emsp;
deeplab V3新设计的aspp结构解决了问题1deeplab v3+主要目的在于解决问题2。
&emsp;&emsp;
问题2 可以使用空洞卷积替代更多的pooling层来获取分辨率更高的feature。但是feature分辨率更高会极大增加运算量。 以deeplab v3 使用的resnet101为例 stride=16将造成后面9层feature变大后面9层的计算量变为原来的2*2=4倍大。stride=8则更为恐怖后面78层的计算量都会变大很多。
&emsp;&emsp;
解决方案1、编解码器结构。2 Modified Aligned Xception
<center><img src="../img/ch9/figure_9.6_5.png"></center>
&emsp;&emsp;
在deeplabv3 基础上 加入解码器。 A是aspp结构。 A的8*的上采样可以看做是一个naïve的解码器。 B是编解码结构。集合了高层和底层的feature。 C就是本文采取的结构。Conv2图中红色的提取到结果和最后提取出的feature上采样4后融合。
&emsp;&emsp;
方法:
&emsp;&emsp;
1Encoder-Decoder with Atrous Convolution
<center><img src="../img/ch9/figure_9.6_6.png"></center>
&emsp;&emsp;
编码器采用deeplabv3。
&emsp;&emsp;
解码器部分先从低层级选一个feature将低层级的feature用1 * 1的卷积进行通道压缩原本为256通道或者512通道目的在于减少低层级的比重。作者认为编码器得到的feature具有更丰富的信息所以编码器的feature应该有更高的比重。 这样做有利于训练。
&emsp;&emsp;
再将编码器的输出上采样使其分辨率与低层级feature一致。 举个例子如果采用resnet conv2 输出的feature则这里要* 4上采样。 将两种feature 连接后再进行一次3 * 3的卷积细化作用然后再次上采样就得到了像素级的预测。 后面的实验结果表明这种结构在 stride=16 时既有很高的精度速度又很快。stride=8相对来说只获得了一点点精度的提升但增加了很多的计算量。
&emsp;&emsp;
2Modified Aligned Xception
&emsp;&emsp;
Xception 主要采用了deepwish seperable convolution来替换原来的卷积层。简单的说就是这种结构能在更少参数更少计算量的情况下学到同样的信息。这边则是考虑将原来的resnet-101骨架网换成xception。
<center><img src="../img/ch9/figure_9.6_7.png"></center>
&emsp;&emsp;
红色部分为修改
&emsp;&emsp;
更多层重复8次改为16次基于MSRA目标检测的工作
&emsp;&emsp;
将原来简单的pool层改成了stride为2的deepwish seperable convolution。
&emsp;&emsp;
额外的RELU层和归一化操作添加在每个 3 × 3 depthwise convolution之后原来只在1 * 1卷积之后
## **8.8 Mask-R-CNN**
**8.8.1 Mask-RCNN 的网络结构示意图**
<center><img src="../img/ch9/figure_9.8_1.png"></center>
&emsp;&emsp;
其中 黑色部分为原来的 Faster-RCNN红色部分为在 Faster网络上的修改
&emsp;&emsp;
1将 Roi Pooling 层替换成了 RoiAlign
&emsp;&emsp;
2添加并列的 FCN 层mask 层);
&emsp;&emsp;
先来概述一下 Mask-RCNN 的几个特点(来自于 Paper 的 Abstract
&emsp;&emsp;
1在边框识别的基础上添加分支网络用于 语义Mask 识别;
&emsp;&emsp;
2训练简单相对于 Faster 仅增加一个小的 Overhead可以跑到 5FPS
&emsp;&emsp;
3可以方便的扩展到其他任务比如人的姿态估计 等;
&emsp;&emsp;
4不借助 Trick在每个任务上效果优于目前所有的 single-model entries包括 COCO 2016 的Winners。
**8.8.2 RCNN行人检测框架**
&emsp;&emsp;
来看下后面两种 RCNN 方法与 Mask 结合的示意图:
<center><img src="../img/ch9/figure_9.8_2.png"></center>
&emsp;&emsp;
图中灰色部分是 原来的 RCNN 结合 ResNet or FPN 的网络,下面黑色部分为新添加的并联 Mask层这个图本身与上面的图也没有什么区别旨在说明作者所提出的Mask RCNN 方法的泛化适应能力 - 可以和多种 RCNN框架结合表现都不错。
**8.8.3 Mask-RCNN 技术要点**
&emsp;&emsp;
**1.技术要点1 - 强化的基础网络**
&emsp;&emsp;
通过 ResNeXt-101+FPN 用作特征提取网络,达到 state-of-the-art 的效果。
&emsp;&emsp;
**2.技术要点2 - ROIAlign**
&emsp;&emsp;
采用 ROIAlign 替代 RoiPooling改进池化操作。引入了一个插值过程先通过双线性插值到14*14再 pooling到7*7很大程度上解决了仅通过 Pooling 直接采样带来的 Misalignment 对齐问题。
&emsp;&emsp;
PS 虽然 Misalignment 在分类问题上影响并不大,但在 Pixel 级别的 Mask 上会存在较大误差。
&emsp;&emsp;
后面我们把结果对比贴出来Table2 c & d能够看到 ROIAlign 带来较大的改进可以看到Stride 越大改进越明显。
&emsp;&emsp;
**3.技术要点3 - Loss Function**
&emsp;&emsp;
每个 ROIAlign 对应 K * m^2 维度的输出。K 对应类别个数,即输出 K 个maskm对应 池化分辨率7 * 7。Loss 函数定义:
$$
Lmask(Cls_k)=Sigmoid(Cls_k)
$$
&emsp;&emsp;
$Lmask(Cls_k) = Sigmoid (Cls_k)$,平均二值交叉熵 average binary cross-entropyLoss通过逐像素的 Sigmoid 计算得到。
&emsp;&emsp;
Why K个mask通过对每个 Class 对应一个 Mask 可以有效避免类间竞争(其他 Class 不贡献 Loss )。
<center><img src="../img/ch9/figure_9.8_3.png"></center>
&emsp;&emsp;
通过结果对比来看Table2 b也就是作者所说的 Decouple 解耦,要比多分类 的 Softmax 效果好很多。
&emsp;&emsp;
另外,作者给出了很多实验分割效果,就不都列了,只贴一张 和 FCIS 的对比图FCIS 出现了Overlap 的问题)
<center><img src="../img/ch9/figure_9.8_4.png"></center>
## **8.9 CNN在基于弱监督学习的图像分割中的应用**
&emsp;&emsp;
https://zhuanlan.zhihu.com/p/23811946
&emsp;&emsp;
最近基于深度学习的图像分割技术一般依赖于卷积神经网络CNN的训练训练过程中需要非常大量的标记图像即一般要求训练图像中都要有精确的分割结果。
&emsp;&emsp;
对于图像分割而言要得到大量的完整标记过的图像非常困难比如在ImageNet数据集上有1400万张图有类别标记有50万张图给出了bounding box,但是只有4460张图像有像素级别的分割结果。对训练图像中的每个像素做标记非常耗时特别是对医学图像而言完成对一个三维的CT或者MRI图像中各组织的标记过程需要数小时。
&emsp;&emsp;
如果学习算法能通过对一些初略标记过的数据集的学习就能完成好的分割结果,那么对训练数据的标记过程就很简单,这可以大大降低花在训练数据标记上的时间。这些初略标记可以是:
&emsp;&emsp;
1 只给出一张图像里面包含哪些物体,
&emsp;&emsp;
2 给出某个物体的边界框,
&emsp;&emsp;
3 对图像中的物体区域做部分像素的标记例如画一些线条、涂鸦等scribbles)。
**8.9.1 Scribble标记**
&emsp;&emsp;
ScribbleSup: Scribble-Supervised Convolutional Networks for Semantic Segmentation (CVPR 2016)
&emsp;&emsp;
香港中文大学的Di Lin提出了一个基于Scribble标记的弱监督学习方法。 Scribble是一个很方便使用的标记方法因此被用得比较广泛。如下图只需要画五条线就能完成对一副图像的标记工作。
<center><img src="../img/ch9/figure_9.9_1.png"></center>
&emsp;&emsp;
ScribbleSup分为两步第一步将像素的类别信息从scribbles传播到其他未标记的像素自动完成所有的训练图像的标记工作 第二步使用这些标记图像训练CNN。在第一步中该方法先生成super-pxels, 然后基于graph cut的方法对所有的super-pixel进行标记。
<center><img src="../img/ch9/figure_9.9_2.png"></center>
&emsp;&emsp;
Graph cut 的能量函数为:
$$
\sum_{i}\psi _i\left ( y_i | X,S \right ) +\sum_{i,j}\psi _{ij}\left ( y_i,y_j,X \right )
$$
&emsp;&emsp;
在这个graph中每个super-pixel是graph中的一个节点相接壤的super-pixel之间有一条连接的边。这个能量函数中的一元项包括两种情况一个是来自于scribble的一个是来自CNN对该super-pixel预测的概率。整个最优化过程实际上是求graph cut能量函数和CNN参数联合最优值的过程
$$
\sum_{i}\psi _i^{scr}\left ( y_i | X,S \right ) +\sum _i-logP\left(y_i | X,\theta \right)+\sum_{i,j}\psi _{ij}\left ( y_i,y_j| X \right )
$$
上式的最优化是通过交替求 和 的最优值来实现的。文章中发现通过三次迭代就能得到比较好的结果。
<center><img src="../img/ch9/figure_9.9_3.png"></center>
**8.9.2 图像级别标记**
&emsp;&emsp;
Constrained Convolutional Neural Networks for Weakly Supervised Segmentation ICCV 2015
&emsp;&emsp;
UC Berkeley的Deepak Pathak 使用了一个具有图像级别标记的训练数据来做弱监督学习。训练数据中只给出图像中包含某种物体但是没有其位置信息和所包含的像素信息。该文章的方法将image tags转化为对CNN输出的label分布的限制条件因此称为 Constrained convolutional neural network (CCNN).
<center><img src="../img/ch9/figure_9.9_4.png"></center>
&emsp;&emsp;
该方法把训练过程看作是有线性限制条件的最优化过程:
$$
\underset{\theta, P}{minimize} \;\;\;\;\;\;\;\;\;\;\;D(P(X)||Q(X|\theta))
$$
$$
subject \, \,to \, \, \,\, A\vec{P}\geq \vec{b,} \, \, \,\, \, \, \, \,\sum_x P\left(X \right )=1.
$$
&emsp;&emsp;
其中 是一个隐含的类别分布, 是CNN预测的类别分布。目标函数是KL-divergence最小化。其中的线性限制条件来自于训练数据上的标记例如一幅图像中前景类别像素个数期望值的上界或者下界物体大小、某个类别的像素个数在某图像中为0或者至少为1等。该目标函数可以转化为为一个loss function然后通过SGD进行训练。
<center><img src="../img/ch9/figure_9.9_5.png"></center>
&emsp;&emsp;
实验中发现单纯使用Image tags作为限制条件得到的分割结果还比较差在PASCAL VOC 2012 test数据集上得到的mIoU为35.6%加上物体大小的限制条件后能达到45.1% 如果再使用bounding box做限制可以达到54%。FCN-8s可以达到62.2%,可见弱监督学习要取得好的结果还是比较难。
**8.9.3 DeepLab+bounding box+image-level labels**
&emsp;&emsp;
Weakly- and Semi-Supervised Learning of a DCNN for Semantic Image Segmentation
&emsp;&emsp;
Google的George Papandreou 和UCLA的Liang-Chieh Chen等在DeepLab的基础上进一步研究了使用bounding box和image-level labels作为标记的训练数据。使用了期望值最大化算法EM来估计未标记的像素的类别和CNN的参数。
<center><img src="../img/ch9/figure_9.9_6.png"></center>
&emsp;&emsp;
对于image-level标记的数据我们可以观测到图像的像素值 和图像级别的标记 ,但是不知道每个像素的标号 ,因此把 当做隐变量。使用如下的概率图模式:
$$
P\left ( x,y,z;\theta \right ) = P\left ( x \right )\left (\prod_{m=1}^{M} P\left ( y_m|x;\theta \right )\right )P\left ( z|y \right )
$$
&emsp;&emsp;
使用EM算法估计 和 。E步骤是固定 求 的期望值M步骤是固定 使用SGD计算。
<center><img src="../img/ch9/figure_9.9_7.png"></center>
&emsp;&emsp;
对于给出bounding box标记的训练图像该方法先使用CRF对该训练图像做自动分割然后在分割的基础上做全监督学习。通过实验发现单纯使用图像级别的标记得到的分割效果较差但是使用bounding box的训练数据可以得到较好的结果在VOC2012 test数据集上得到mIoU 62.2%。另外如果使用少量的全标记图像和大量的弱标记图像进行结合,可以得到与全监督学习(70.3%)接近的分割结果(69.0%)。
**8.9.4统一的框架**
&emsp;&emsp;
Learning to Segment Under Various Forms of Weak Supervision (CVPR 2015)
&emsp;&emsp;
Wisconsin-Madison大学的Jia Xu提出了一个统一的框架来处理各种不同类型的弱标记图像级别的标记、bounding box和部分像素标记如scribbles。该方法把所有的训练图像分成共计 个super-pixel对每个super-pixel提取一个 维特征向量。因为不知道每个super-pixel所属的类别相当于无监督学习因此该方法对所有的super-pixel做聚类使用的是最大间隔聚类方法(max-margin clustering, MMC),该过程的最优化目标函数是:
$$
\frac{1}{2}tr\left ( W^TW \right ) + \lambda\sum_{p=1}^{n}\sum_{c=1}^{C}\xi \left ( w_c;x_p;h_p^c \right )
$$
&emsp;&emsp;
其中 是一个特征矩阵,每列代表了对于的类别的聚类特征。 是将第 个super-pixel划分到第 类的代价。在这个目标函数的基础上,根据不同的弱标记方式,可以给出不同的限制条件,因此该方法就是在相应的限制条件下求最大间隔聚类。
<center><img src="../img/ch9/figure_9.9_8.png"></center>
&emsp;&emsp;
该方法在Siftflow数据集上得到了比较好的结果比state-of-the-art的结果提高了10%以上。
&emsp;&emsp;
小结在弱标记的数据集上训练图像分割算法可以减少对大量全标记数据的依赖在大多数应用中会更加贴合实际情况。弱标记可以是图像级别的标记、边框和部分像素的标记等。训练的方法一般看做是限制条件下的最优化方法。另外EM算法可以用于CNN参数和像素类别的联合求优。
## 8.10 DenseNet贡献者黄钦建华南理工大学
这篇论文是CVPR2017年的最佳论文。
卷积神经网络结构的设计主要朝着两个方向发展一个是更宽的网络代表GoogleNet、VGG一个是更深的网络代表ResNet。但是随着层数的加深会出现一个问题——梯度消失这将会导致网络停止训练。到目前为止解决这个问题的思路基本都是在前后层之间加一个identity connections(short path)。
![](../img/ch9/8-10-3.png)
由上图中可知Resnet是做值的相加也就是add操作通道数是不变的。而DenseNet是做通道的合并也就是Concatenation操作就像Inception那样。从这两个公式就可以看出这两个网络的本质不同。此外DensetNet的前面一层输出也是后面所有层的输入这也不同于ResNet残差网络。
![](../img/ch9/8-10-1.png)
DenseNet的Block结构如上图所示。
1*1卷积核的目的减少输入的特征图数量这样既能降维减少计算量又能融合各个通道的特征。我们将使用BottleNeck Layers的DenseNet表示为DenseNet-B。(在论文的实验里将1×1×n小卷积里的n设置为4kk为每个H产生的特征图数量)
![](../img/ch9/8-10-2.png)
上图是DenseNet网络的整体网络结构示意图。其中1*1卷积核的目的是进一步压缩参数并且在Transition Layer层有个参数Reduction范围是0到1表示将这些输出缩小到原来的多少倍默认是0.5这样传给下一个Dense Block的时候channel数量就会减少一半。当Reduction的值小于1的时候我们就把带有这种层的网络称为DenseNet-C。
DenseNet网络的优点包括
1、减轻了梯度消失
2、加强了feature的传递
3、更有效地利用了feature 
4、一定程度上较少了参数数量
5、一定程度上减轻了过拟合

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 220 KiB

After

Width:  |  Height:  |  Size: 220 KiB

View File

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 188 KiB

View File

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

View File

Before

Width:  |  Height:  |  Size: 273 KiB

After

Width:  |  Height:  |  Size: 273 KiB

View File

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 148 KiB

View File

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 165 KiB

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

Before

Width:  |  Height:  |  Size: 359 KiB

After

Width:  |  Height:  |  Size: 359 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

View File

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 84 KiB

View File

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

View File

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

View File

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 185 KiB

View File

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 88 KiB

View File

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

View File

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 171 KiB

View File

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 123 KiB

View File

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 107 KiB

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

Before

Width:  |  Height:  |  Size: 216 KiB

After

Width:  |  Height:  |  Size: 216 KiB

View File

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 126 KiB

View File

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View File

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 184 KiB

View File

Before

Width:  |  Height:  |  Size: 556 KiB

After

Width:  |  Height:  |  Size: 556 KiB

View File

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 135 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 163 KiB

View File

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 159 KiB

View File

Before

Width:  |  Height:  |  Size: 222 KiB

After

Width:  |  Height:  |  Size: 222 KiB

View File

Before

Width:  |  Height:  |  Size: 318 KiB

After

Width:  |  Height:  |  Size: 318 KiB

View File

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 51 KiB

View File

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

View File

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View File

Before

Width:  |  Height:  |  Size: 426 KiB

After

Width:  |  Height:  |  Size: 426 KiB

View File

Before

Width:  |  Height:  |  Size: 268 KiB

After

Width:  |  Height:  |  Size: 268 KiB

View File

Before

Width:  |  Height:  |  Size: 267 KiB

After

Width:  |  Height:  |  Size: 267 KiB

View File

Before

Width:  |  Height:  |  Size: 258 KiB

After

Width:  |  Height:  |  Size: 258 KiB

View File

Before

Width:  |  Height:  |  Size: 211 KiB

After

Width:  |  Height:  |  Size: 211 KiB

View File

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

View File

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

View File

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB

View File

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 240 KiB