FCN原论文的结构和原理

学习FCN的原理的主要方法是类比图像分类模型,而且里面对backbone的修改也需要分类模型的知识,没有分类模型的知识可以说在分割任务上是寸步难行,之前走了整整一个月的弯路,始终没有什么本质的进展,整个11月在深度学习上都没有什么进展,完全找不到学习的方向,都是东学一点,西学一点,11月主要做的是对于论文的流程有了一个大概的了解,对于地学的一些基础知识进行了学习和实践。经过分类模型的学习,再看分割任务有种豁然开朗的感觉。

言归正传。

FCN提出时间是2015年,那时候还没有种类繁多的分类模型作为分割模型backbone来搭建,原论文用的是vgg16作为backbone,官方代码用的是resnet作为backbone。

 这个是热力图,进行上采样后的一类目标像素的热力图,一个物体经特征提取后像素值是差不多的,或者说对应位置的张量值。

用的vgg作为backbone主要是用到了7*7*512的这一层。还用到了之前的池化层进行特征融合,具体32s版本,16s版本,8s版本 的结构见下面的ppt,32s就是上采样32倍,因为224*224*3的输入图像到vgg16的7*7*256这一层就已经是输入图像大小的1/32,即w/n,h/n,就需要上采样n倍。

 原论文中的vgg输入时卷积层进行padding=100的设置是防止输入图片太小报错,实际上没有必要,只要改一下FC1层3*3卷积核个数就可以了。

下面这是FCN-32s版本的结构,vgg作为backbone,到h/32*w/32这一层,之后使用一个步长为1的7*7卷积核不改变图像尺寸,通道数变为4096,激活,Dropout,再用一个步长为1的1*1卷积核把通道变为4096,主要作用是交流不同层的信息,再用一个步长为1的1*1的卷积核把通道数变为类别数num_cls,输入每个像素点会在这num_cls个通道上都有一个值,softmax取出最大的那个值,所在层的索引序号和对应的类别一匹配,就是这个像素的预测类别。最后直接用转置卷积进行上采样,s32表示32倍上采样,直接用的Bilinear interpolation双线性插值的上采样方法,论文源码中冻结了转置卷积的参数,因为作者发现冻结不冻结效果差别不大,原因可能是32倍上采样实在是太大了的原因,冻结的话甚至可以直接用pytorch官方提供的Bilinear interpolation方法。

FCN-16s版本的网络,FC6模块,FC7模块,变通道模块个数为num_cls的模块和以上32s版本一样,变化在于16s版本提取出了vgg网络在输出h/32*w/32之前的pooling4层的特征,这一层输出是h/16*w/16大小,这个先进行1*1变通道为num_cls,再和上采样两倍后特征图尺寸变成h/16*w/16,通道为num_cls的特征图进行对应相加融合pooling4层的尺度的特征,再对融合后的进行16倍上采样得到和输入一样的w,h的输出特征图,通道数是num_cls。

FCN-8s和之前的16s差不多,又多提取了pooling3层的特征进行融合上采样,如下图。

还有一个损失计算部分,和分类网络类似,计算输出长度的一维张量的类别索引处的1和输出对应位置的张量值的交叉熵计算得到损失,分割网络计算每个像素点的真实类别的索引对应的通道处的张量1和计算输出的对应像素的对应通道处的张量值的交叉熵损失,再把所有Pixel的cross Entropy Loss求平均,得到一张图片的损失值。或者说一批图片的损失值(这个涉及到数据加载和处理过程,具体是什么到代码中理解)。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值