type
status
date
slug
summary
tags
category
icon
password
Property
全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换。 与之前在图像分类或目标检测部分介绍的卷积神经网络不同,全卷积网络将中间层特征图的高和宽变换回输入图像的尺寸:这是通过在转置卷积(transposed convolution)实现的。 因此,输出的类别预测与输入图像在像素级别上具有一一对应关系:通道维的输出即该位置对应像素的类别预测。
构造模型
全卷积网络先使用卷积神经网络抽取图像特征,然后通过卷积层将通道数变换为类别个数,最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。模型输出与输入图像的高和宽相同,并在空间位置上一一对应:最终输出的通道包含了该空间位置像素的类别预测。
下面我们使用一个基于ImageNet数据集预训练的ResNet-18模型来抽取图像特征,并将该网络实例记为
pretrained_net
。可以看到,ResNet-18模型的最后几层包括全局平均汇聚层和全连接层,然而全卷积网络中不需要它们。初始化转置卷积层
在图像处理中,我们有时需要将图像放大,即上采样(upsampling)。 双线性插值(bilinear interpolation) 是常用的上采样方法之一,也经常用于初始化转置卷积层。
双线性插值:假设给定输入图像,要计算上采样输出图像上的每个像素。 首先,将输出图像的坐标 映射到输入图像的坐标 上。 例如,根据输入与输出的尺寸之比来映射。 请注意,映射后的 和 是实数。 然后,在输入图像上找到离坐标 最近的4个像素。 最后,输出图像在坐标 上的像素依据输入图像上这4个像素及其与的相对距离来计算。
双线性插值的上采样可以通过转置卷积层实现,内核由以下
bilinear_kernel
函数构造构造一个将输入的高和宽放大2倍的转置卷积层,并将其卷积核用
bilinear_kernel
函数初始化读取图像
X
,将上采样的结果记作Y
,为了打印图像,需要调整通道维的位置可以看到,转置卷积层将图像的高和宽分别放大了2倍。 除了坐标刻度不同,双线性插值放大的图像和原图看上去没什么两样
在全卷积网络中,我们用双线性插值的上采样初始化转置卷积层。对于1×1卷积层,我们使用Xavier初始化参数
读取数据集
指定随机裁剪的输出图像的形状为320×480:高和宽都可以被32整除
训练
这里的损失函数和准确率计算与图像分类中的并没有本质上的不同,因为我们使用转置卷积层的通道来预测像素的类别,所以需要在损失计算中指定通道维。 此外,模型基于每个像素的预测类别是否正确来计算准确率
预测
在预测时,我们需要将输入图像在各个通道做标准化,并转成卷积神经网络所需要的四维输入格式
为了可视化预测的类别给每个像素,我们将预测类别映射回它们在数据集中的标注颜色
积层输出的高或宽会与输入图像的尺寸有偏差。 为了解决这个问题,我们可以在图像中截取多块高和宽为32的整数倍的矩形区域,并分别对这些区域中的像素做前向传播。 请注意,这些区域的并集需要完整覆盖输入图像。 当一个像素被多个区域所覆盖时,它在不同区域前向传播中转置卷积层输出的平均值可以作为
softmax
运算的输入,从而预测类别。为简单起见,只读取几张较大的测试图像,并从图像的左上角开始截取形状为320×480的区域用于预测。 对于这些测试图像,逐一打印它们截取的区域,再打印预测结果,最后打印标注的类别。