简介
全称为Fully Convolutional Networksfor Semantic Segmentation,用于语义分割,是第一个将语义分割的网络做成全卷积的网络结构。
- FCN-VGG16是backbone
输入可以任意大小
一般的用法就是下降4strides后进行上采样,torchvision中的FCN就是resnet第四层出来后(已经下降了4strides,进入的时候最大池化一次,layer1没用空洞卷积,stride为2)后经过
class FCNHead(nn.Sequential): def __init__(self, in_channels, channels): inter_channels = in_channels // 4 layers = [ nn.Conv2d(in_channels, inter_channels, 3, padding=1, bias=False), nn.BatchNorm2d(inter_channels), nn.ReLU(), nn.Dropout(0.1), nn.Conv2d(inter_channels, channels, 1) ] super(FCNHead, self).__init__(*layers)
后,直接上采样
(这个不知道是哪来的)
蓝色:卷积层。
绿色:Max Pooling层。
黄色: 求和运算, 使用逐数据相加,把三个不同深度的预测结果进行融合:较浅的结果更为精细,较深的结果更为鲁棒。
灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出。(应该是双线性插值)
对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变。
- 卷积分类虽然在较深的层分类得分较高,但是在会丢失更多的细节特征信息
- 主要运用了卷积和反卷积取代了MLP层,真正实现全卷积
Skip Architectures (跳跃框架)
- 为了将层与层融合
- 首先通过裁剪填充将层的对应大小统一
- 为了弥补因为裁剪损失的信息,通过级联(concatenation)融合特征
- 最后通过由1×1卷积组成的“得分层”进行分类
- 将所有层这样做以后,将最后结果进行上采样后得出结果
- 每个“得分层”都是独立的,因此不会互相影响结果
ps:FCN-32s、FCN-16s、FCN-8s分别指在VGG16-FCN的第32步、第16步、第8步的池化层进行跳跃结构