简单粗暴——FCN
先附上 FCN论文
Pytorch实现 https://github.com/wkentaro/pytorch-fcn
一、学习目标
1、理解FCN原理
2、掌握FCN的关键技术
3、掌握FCN的实现
二、CNN 与 FCN 的区别
FCN与CNN的区域在把于CNN最后的全连接层换成卷积层。
对于一般的分类CNN网络,如VGG和Resnet,都会在网络的最后加入一些全连接层,经过softmax后就可以获得类别概率信息。但是这个概率信息是1维的,即只能标识整个图片的类别,不能标识每个像素点的类别,所以这种全连接方法不适用于图像分割。
而FCN提出可以把后面几个全连接都换成卷积,这样就可以获得一张2维的feature map,后接softmax获得每个像素点的分类信息,从而解决了分割问题,如下图。
经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特诊图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大到原图像的大小。
最后的输出是1000张heatmap经过upsampling变为原图大小的图片,为了对每个像素进行分类预测label成最后已经进行语义分割的图像,这里有一个小trick,就是最后通过逐个像素地求其在1000张图像该像素位置的最大数值描述(概率)作为该像素的分类。因此产生了一张已经分类好的图片,如上图右侧有狗猫图。
三、FCN结构
1、image经过多个conv和+一个max pooling变为pool1 feature,宽高变为1/2
2、pool1 feature再经过多个conv+一个max pooling变为pool2 feature,宽高变为1/4
3、pool2 feature再经过多个conv+一个max pooling变为pool3 feature,宽高变为1/8
4、pool3 feature再经过多个conv+一个max pooling变为pool4 feature,宽高变为1/16
5、直到pool5 feature,宽高变为1/32。
1、对于FCN-32s,直接对pool5 feature进行32倍上采样获得32x upsampled feature,再对32x upsampled feature每个点做softmax prediction获得32x upsampled feature prediction(即分割图)。
2、对于FCN-16s,首先对pool5 feature进行2倍上采样获得2x upsampled feature,再把pool4 feature和2x upsampled feature逐点相加,然后对相加的feature进行16倍上采样,并softmax prediction,获得16x upsampled feature prediction。
3、对于FCN-8s,首先进行pool4+2x upsampled feature逐点相加,然后又进行pool3+2x upsampled逐点相加,即进行更多次特征融合。具体过程与16s类似,不再赘述。
关于Skip Architecture 注意点
1、维度一致才能相加:spatial/channel
2、1 x 1 Convolution
作者在原文种给出3种网络结果对比,明显可以看出效果:FCN-32s < FCN-16s < FCN-8s,即使用多层feature融合有利于提高分割准确性。
四、FCN缺点
1、FCN-8s的结果还是不够精细
2、没有充分考虑像素之间的关系
五、VGG网络的FCN化
import math
import torch
import torch.nn as nn
import torch.nn.init as init
# 建立block
class Block(nn.Module):
def __init__(self, in_ch, out_ch):
super(Block, self).__init__()
self.conv1 = nn.Conv2d(in_ch, out_ch, kernel_size=3, padding=1)
self.bn1 = nn.BatchNorm2d(out_ch)
self.relu1 = nn.ReLU(inplace=True)
def forward</