全卷积网络FCN几点认识
2017-09-04 10:38
211 查看
FCN全卷积网络,作为语义分割的鼻祖,研究了一下,但是,其中几个问题一直没有想明白,现汇总一下。
1、首个卷积层为什么pad=100 ?
我们从VGG16网络结构中探究原因。
VGG16的特点是,conv5之前的卷积层均使用卷积核 kernel_size=3,pad=1,因此,卷积前后不改变数据尺寸,改变featrueMap的尺寸只有pooling层。
现在我们只考虑pooling层,所有pooling层参数也一致: kernel_size: 2,stride: 2
设pool1的输入图像尺寸为 h
pool1:h1=(h−2)/2+1=h/2
pool2:h2=(h1−2)/2+1=h/22
pool3:h3=(h2−2)/2+1=h/23
…………………………
…………………………
pool5:h5=(h4−2)/2+1=h/25
可以看出,图像尺寸缩小了32倍。之后为卷积化后的fc6。
fc6:h6=(h5−7)/1+1=(h−192)/25 …………………………………………………………….式(1)
后接着的层为 fc7和 score_fr_sem层,此两层均为 1*1卷积核,不会对featureMap大小产生影响。因此输入反卷积层的输入尺寸为 h6!!!!!
通过以上可以看出,如果不加pad 100,那么原始图像尺寸小于192则出现问题。当pad 100后,原始图像尺寸设为h′,则输入至pool1的尺寸为:
conv1:h=(h′−3+2∗100)/1+1=h′+198
带入式(1),最终可知输入反卷积的尺寸为:
fc6:h6=(h′+6)/25
2、反卷积层和Crop层如何产生和原图尺寸相同的输出?
stride=32,因为图像缩小了32倍,因此在featureMap上相邻像素在原图的间隔为32.
kernel_size=64,不明白是啥原因。只知道64可保证2*2个featureMap的值参与局部差值运算。
卷积后的输出尺寸计算方法:
W=(Wi−kernelSize+2∗pad)/stride+1
因此反卷积输出尺寸计算方法:
Wi=W∗stride−stride+kernelSize−2∗pad
因此根据以上公式,继续推倒:
upscore:h7=(h6−1)∗32+64=((h+6)/32−1)∗32+64=h+38
反卷积之后与原图的尺寸不一致,因此需要crop层参与剪切。
1、axis 从 0开始,
2、offset 偏移量
参数axis=2,表明我们只想裁剪后两个维度,亦即输出尺寸,offset=19,对应于C = A[: , : , 19: 19+h , 19: 19+h ],这正是从(h+38,w+38)的upscore层中裁剪出中间的(h,h)的图像,这也就产生了和原图尺寸相同的最终输出!
3、Deconv层,学习率为0,如何理解?
我们知道,如果lr_mult=0,则在训练过程中,该层的参数不会参与学习,而默认初始化为constant初始化为,均为0,那么该层有啥作用呢?
通过查看solver.py文件可知,当网络模型加载之后,又调用了surgery.interp函数对反卷积层进行了参数初始化(线性差值)。
surgery.py只要调用 upsample_filt函数生成核函数的参数,如下,7*7卷积核生成数据如下:
4 FCN为什么能进行分割任务呢?
直观上理解,最后全链接层的输出视为heatmap,它的每一个点代表类别概率,代表了某一感受野下的类别。
1、首个卷积层为什么pad=100 ?
我们从VGG16网络结构中探究原因。
VGG16的特点是,conv5之前的卷积层均使用卷积核 kernel_size=3,pad=1,因此,卷积前后不改变数据尺寸,改变featrueMap的尺寸只有pooling层。
现在我们只考虑pooling层,所有pooling层参数也一致: kernel_size: 2,stride: 2
设pool1的输入图像尺寸为 h
pool1:h1=(h−2)/2+1=h/2
pool2:h2=(h1−2)/2+1=h/22
pool3:h3=(h2−2)/2+1=h/23
…………………………
…………………………
pool5:h5=(h4−2)/2+1=h/25
可以看出,图像尺寸缩小了32倍。之后为卷积化后的fc6。
fc6:h6=(h5−7)/1+1=(h−192)/25 …………………………………………………………….式(1)
后接着的层为 fc7和 score_fr_sem层,此两层均为 1*1卷积核,不会对featureMap大小产生影响。因此输入反卷积层的输入尺寸为 h6!!!!!
通过以上可以看出,如果不加pad 100,那么原始图像尺寸小于192则出现问题。当pad 100后,原始图像尺寸设为h′,则输入至pool1的尺寸为:
conv1:h=(h′−3+2∗100)/1+1=h′+198
带入式(1),最终可知输入反卷积的尺寸为:
fc6:h6=(h′+6)/25
2、反卷积层和Crop层如何产生和原图尺寸相同的输出?
stride=32,因为图像缩小了32倍,因此在featureMap上相邻像素在原图的间隔为32.
kernel_size=64,不明白是啥原因。只知道64可保证2*2个featureMap的值参与局部差值运算。
卷积后的输出尺寸计算方法:
W=(Wi−kernelSize+2∗pad)/stride+1
因此反卷积输出尺寸计算方法:
Wi=W∗stride−stride+kernelSize−2∗pad
因此根据以上公式,继续推倒:
upscore:h7=(h6−1)∗32+64=((h+6)/32−1)∗32+64=h+38
反卷积之后与原图的尺寸不一致,因此需要crop层参与剪切。
1、axis 从 0开始,
2、offset 偏移量
参数axis=2,表明我们只想裁剪后两个维度,亦即输出尺寸,offset=19,对应于C = A[: , : , 19: 19+h , 19: 19+h ],这正是从(h+38,w+38)的upscore层中裁剪出中间的(h,h)的图像,这也就产生了和原图尺寸相同的最终输出!
3、Deconv层,学习率为0,如何理解?
我们知道,如果lr_mult=0,则在训练过程中,该层的参数不会参与学习,而默认初始化为constant初始化为,均为0,那么该层有啥作用呢?
通过查看solver.py文件可知,当网络模型加载之后,又调用了surgery.interp函数对反卷积层进行了参数初始化(线性差值)。
surgery.py只要调用 upsample_filt函数生成核函数的参数,如下,7*7卷积核生成数据如下:
[[ 0.0625 0.125 0.1875 0.25 0.1875 0.125 0.0625] [ 0.125 0.25 0.375 0.5 0.375 0.25 0.125 ] [ 0.1875 0.375 0.5625 0.75 0.5625 0.375 0.1875] [ 0.25 0.5 0.75 1. 0.75 0.5 0.25 ] [ 0.1875 0.375 0.5625 0.75 0.5625 0.375 0.1875] [ 0.125 0.25 0.375 0.5 0.375 0.25 0.125 ] [ 0.0625 0.125 0.1875 0.25 0.1875 0.125 0.0625]]
4 FCN为什么能进行分割任务呢?
直观上理解,最后全链接层的输出视为heatmap,它的每一个点代表类别概率,代表了某一感受野下的类别。
相关文章推荐
- ESXi虚拟网络配置的几点认识
- 全卷积网络 FCN 详解(很好,详看)
- 图像语义分割,全卷积网络FCN和条件随机场CRF、马尔可夫随机场MRF
- 剖析手写数字识别器LeNet-5认识卷积网络
- 全卷积网络FCN详解
- 全卷积网络(FCN)与图像分割
- 语义分割-1:FCN全卷积网络的语义分割实现
- R-FCN:基于区域的全卷积网络来检测物体 论文解读
- 全卷积网络 FCN 详解
- 全卷积网络 FCN 详解
- 全卷积网络 FCN 详解
- 论文理解 R-FCN:基于区域的全卷积网络来检测物体
- RCNN学习笔记(8):Fully Convolutional Networks for Semantic Segmentation(全卷积网络FCN)
- 全卷积网络(FCN)与图像分割
- 全卷积网络:从图像级理解到像素级理解-FCN图像分割边缘检测
- RCNN学习笔记(8):Fully Convolutional Networks for Semantic Segmentation(全卷积网络FCN)
- R-FCN:基于区域的全卷积网络来检测物体
- 全卷积网络FCN详解
- FCN 全卷积网络训练
- R-FCN:基于区域的全卷积网络来检测物体