FCN核心技术(六点剖析)

网上有很多关于FCN的博客和解说,但是在关键技术上的解说比较适合中级学者,对于初学者来说比较难理解,这里就自己的理解做比较详细的学习笔记,供以后查看。如有错误请批评指正,万分感激!

一. FC 到 FNC
以AlexNet为例,就是将后面三层全连接层换成卷积核为662564096、1140964096、1140961000的卷积层。其中前两个数字表示卷积核大小,第三个数字表示每个卷积核的通道数,第四个数字表示卷积核的数量即神经元个数。Fully Convolutional Networks for Semantic Segmentation文章中第八层的图片张数是21,所以第八层是11409621,而不是114096*1000。

二. 反卷积具体步骤:
函数:torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride, padding, output_padding, groups, bias,
dilation)

参数的含义如下:
in_channels(int) – 输入信号的通道数
out_channels(int) – 卷积产生的通道数
kerner_size(int or tuple) - 卷积核的大小
stride(int or tuple,optional) - 卷积步长
padding(int or tuple, optional) - 卷积时输入的padding数
output_padding(int or tuple, optional) - 输出的1高与1宽共两边补0的层数
groups(int, optional) – 从输入通道到输出通道的阻塞连接数
bias(bool, optional)-如果bias=True,添加偏置
dilation(int or tuple, optional) – 卷积核元素之间的间距

函数工作步骤:
1. 对卷积结果(输入特征图)做补0扩充操作(插值),每两个像素间补(stride-1)个0。
Interpolated_side=input_side+( stride-1)( input_side-1)
2. 对扩充后的结果padding,padding个数(p’)为:
p’=kernel_size-padding(卷积操作时设置的padding值)-1。
3. 用卷积核filter对padding后的结果进行stride’为1的卷积操作。
out_side= (Interpolated_side - kernel_size+2
p’)/stride’+1
=( input_side+( stride-1)(input_side-1)- kernel_size+2( kernel_size-padding(卷积操作时设置的padding值)-1)/1+1
=( input_side-1)* stride-2* padding(卷积的padding值)+ kernel_size

因此torch.nn.ConvTranspose2d()函数与torch.nn.Conv2d()具有相同的kernel_size、stride以及padding这三个参数。

三. 跳级结构(skip layer):
FCN-32s:
1. 对最后一层得到的结果进行反卷积,扩大尺寸到输入图片的尺寸
FCN-16s:
1. 对最后一层得到的结果进行反卷积,扩大尺寸到前一层池化后得到结果的尺寸
2. 对前一层的池化结果进行一个卷积核为1x1 的卷积,使其产生一个额外的分类预测,通道数与最后一层反卷积后的结果相同。
3. 将1与2的结果相加,在对相加的结果进行反卷积,扩大尺寸到输入图片的尺寸
FCN-8s:
1. 对最后一层得到的结果进行反卷积,扩大尺寸到倒数第三层池化后得到结果的尺寸
2. 对倒数第二层池化层得到的结果进行一个卷积核为1x1 的卷积,使其产生一个额外的分类预测,通道数与最后一层反卷积后的结果相同,再对其进行反卷积,扩大尺寸到倒数第三层池化后得到结果的尺寸
3. 对倒数第三层池化层得到的结果进行一个卷积核为1x1 的卷积,使其产生一个额外的分类预测,通道数与最后一层反卷积后的结果相同。
4. 将上三部得到的结果相加,再对相加的结果进行反卷积,扩大尺寸到输入图片的尺寸
在这里插入图片描述
图1 跳级结构示意图

注:对于上采样后尺寸比上一层尺寸大的情况进行crop,使得尺寸相等后进行相加操作。

四. 结合分类与位置两种信息:
CNN能够给出图片中物体的分类,而FCN的结果是将整个图片的所有像素进行分类和以热力图显示,能够在分类的同时给出物体的位置,并且在反卷积的过程中,每往上一层,其位置信息更精确,因为反卷积的步长越小,所获得的信息越多。

五. 分割原理(训练):
将跳级结构得到的结果(softmax后)的每一张图片的相同像素位置值进行比较,取概率最大的值作为该位置的最后分类结果,最终得到一张分类好的图片(对原图片的每个位置的像素进行分类)。对该图片的每一个像素值进行softmax loss之后求和,再利用随机梯度下降的方式进行权重的更新优化。值得提及的是,当训练的minibatch size设置为一张图片时(图片的像素数就是类别数),整张图片一次迭代的随机梯度值就等于一个像素的随机梯度值(一个像素对应的loss function的梯度值)。

六. 评价标准:
在这里插入图片描述
其中,nij表示将本属于第i类的像素预测为属于第j类的像素数量;ncl表示像素的类别总数;ti表示属于第i类的像素总数。

七. 代码实现:
https://github.com/shelhamer/fcn.berkeleyvision.org
https://github.com/bat67/pytorch-FCN-easiest-demo

八. 参考文献与博客:
1. Fully Convolutional Networks for Semantic Segmentation
2. FCN算法详解(https://blog.csdn.net/attitude_yu/article/details/84697181)
3. ConvTranspose2d原理,深度网络如何进行上采样?(https://blog.csdn.net/qq_27261889/article/details/86304061)
4. pytorch实现FCN全卷积网络的语义分割(Fully Convolutional Networks for Semantic Segmentation论文简单复现)(https://blog.csdn.net/bat67/article/details/84766714)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值