推荐课程:FCN网络结构详解(语义分割)_哔哩哔哩_bilibili
感谢博主霹雳吧啦Wz / 太阳花的小绿豆提供视频讲解和源码支持,真乃神人也!
目录
1.FCN网络概述
2.几种不同的FCN网络
(1) FCN-32s
(2) FCN-16s
(3) FCN-8s
3.损失计算
FCN网络(Fully Convolutional Networks):首个端对端的针对像素级预测的全卷积网络。
FCN网络思想:输入图像经过多次卷积,得到一个通道数为21的特征图,再经过上采样,得到一个与原图同样大小的特征图,再经过Softmax函数处理就能得到该像素针对Pascal Voc数据集每一个类别的预测概率,选择最大概率的类别作为该像素的预测类别。
FCN网络在VGG网络上做出的修改:把VGG全连接层改为卷积层。一方面,可以不用固定输入图像的大小。另一方面,当输入图像大小大于24x24,最终得到的输出特征图的channel就会变为2D的数据,这时我们把channel提取出来就得到一张热图(heatmap)。
最上面一个网络模型为vgg 16。
FCN-32s:使用32倍的上采样。FCN-16s:使用16倍的上采样。FCN-8s:使用8倍的上采样。
VGG16 Backbone(主干网络)为VGG16网络全连接层之前的网络部分。注意:FCN网络把VGG全连接层改为卷积层,即其中两个卷积层为FC6,FC7。
模型的训练过程如下:
1.输入图片,首先,通过VGG16 Backbone(主干网络)会将图片下采样32倍,得到的特征图W、H为原图片大小的1/32,Channel变为512。
2.其次,经过size=7x7,padding=3,卷积核数为4096的FC6卷积,输出特征图大小不变,Channel变为4096。
3.再次,经过size=1x1,padding=1,卷积核数为4096为FC7卷积,输出特征图大小不变,Channel也不变。
4.然后,经过size=1x1,padding=1,卷积核数为num_class的卷积,输出的特征图大小不变,Channel变为num_class。
(num_class为分类个数,VGG网络全连接层会经过softmax进行多分类,因此我们要把Channel值设置为分类个数,确保参数个数与VGG保持一致。讲解视频中有提到!)
5.最后,经过一个size=64的上采样(即32倍的上采样),特征图恢复到原图大小。得到的特征图的Channel仍然为num_class。
(在源码中,这里没有使用上采样,而是直接使用双线性插值还原。原因是直接使用32倍的上采样效果不明显,不用也可以。这是由于直接放大32倍导致的。)
很明显FCN-16s网络在VGG16 Backbone(主干网络)之后分为两个分支:
1.最上面的分支其结构与FCN-32s的结构基本一致,唯一的不同在于采用了2倍的上采样(特征图大小扩大2倍),得到的特征图size=原图的1/16,Channel=num_class。
2.最下面的分支接受到VGG16主干网络中MaxPool4层输出的特征图(这里的特征图已经经过了16倍的下采样,大小为原图的1/16),再经过size=1x1,padding=1,卷积核数为num_class的卷积,得到size=原图的1/16,Channel=num_class的特征图。
3.得到的两个特征图进行矩阵相加,得到一个新的特征图。
4.最后,经过一个16倍的上采样,将特征图还原为原图大小。
很明显FCN-8s网络一共有3条分支。自上而下命名为分支1,分支2,分支3。
模型的训练过程如下:
1.分支1和分支2整体的结构与FCN-16s基本一致,唯一的不同在两个特征图相加后(第一个相加),经过一个2倍的上采样,得到一个size=原图大小的1/8,Channel=num_class的特征图。
2.分支3接受到VGG16主干网络中MaxPool3层输出的特征图(这里的特征图已经经过了8倍的下采样,大小为原图的1/8),再经过size=1x1,padding=1,卷积核数为num_class的卷积,得到size=原图的1/8,Channel=num_class的特征图。
3.得到的两个特征图进行矩阵相加,得到一个新的特征图。
4.最后,经过一个8倍的上采样,将特征图还原为原图大小。
左边的通过训练模型最终得到的特征图,右边为真实标记。
计算损失值过程:
1.特征图的每一个方格为一个pixel(像素),如上图沿Channel方向每个pixel还有三个参数。沿Channel方向为每个像素做softmax处理,就能得到每个像素的预测值。将预测值与对应真实值(在真实标记对应位置)计算交叉熵损失。
计算交叉熵损失公式:
2.计算每一个像素的损失值,求平均值,最终得到整个网络模型的损失值。