■ 图1 MIT67数据集
将下载的数据集解压,主要使用Image文件夹,这个文件夹一共包含6700张图片,还有TrainImages.txt,包含67×80张训练集图像路径和它们的标签,以及TestImages.txt,包含67×20张测试集图像路径和它们的标签。
2、数据预处理和准备
主要介绍如何利用PyTorch构建需要的场景识别算法。我们采用一个标准的ResNet-50网络,基于ResNet结构,构建一个在MIT67数据集上可以解决室内场景分类任务的模型。
1●数据集的读取
首先需要将下载的数据集读入内存,读入路径和标签这些信息存在于两个.label文件中。读取完成后应该得到一个图片路径组成的数组和一个标签组成的数组。这一步可以根据机器上的路径进行读取。将读取的结果记为train_list, train_labels(test_list, test_labels)。
我们的最终目标是将输入组织成DataLoader的结构,这个结构中将图片像素矩阵与label一一对应并且随机排序,这也是能够被PyTorch框架作为输入的标准结构。可以通过将上一步得到的数组放入DataLoader的构造函数来自动生成这个类。
VGG-19网络的卷积部分由5个卷积块构成,每个卷积块中有多个卷积(convolution)层,结尾处有一个池化(pooling)层,如图2所示。
■ 图2 VGG-19的网络结构
卷积层中的不同卷积核会被特定的图像特征激活,图3展示了不同卷积层内卷积核的可视化(通过梯度上升得到)。可以看到,低层卷积核寻找的特征较为简单,而高层卷积核寻找的特征比较复杂。
■ 图3 VGG网络中部分卷积层内卷积核的可视化
4、图像风格迁移介绍
图像风格迁移是指将一张风格图Is的风格与另一张内容图Ic的内容相结合并生成新的图像。Gatys等人于2016年提出了一种简单而有效的方法,利用预训练的VGG网络提取图像特征,并基于图像特征组合出了两种特征度量,一种用于表示图像的内容,另一种用于表示图像的风格。他们将这两种特征度量加权组合,通过最优化的方式生成新的图像,使新的图像同时具有一幅图像的风格和另一幅图像的内容。
图4对风格迁移的内部过程进行了可视化。上面的一行中,作者将VGG网络不同层的输出构建风格表示,再反过来进行可视化,得到重构的风格图片;下面的一行中,作者将VGG网络不同层的输出构建内容表示,再反过来进行可视化,得到重构的内容图片。可以看到,低层卷积层提取的风格特征较细节,提取的内容特征较详细;高层卷积层提取的风格特征较整体,提取的内容特征较概括。
5、内容损失函数
1●内容损失函数的定义
内容损失函数用于衡量两幅图像之间的内容差异大小,其定义如下。
2●内容损失模块的实现
模块在初始化时需要将内容图片的特征图传入,通过detach()方法告诉AutoGrad优化时不要变更其中的内容。forward()方法实现上面的公式即可。
1●风格损失函数的定义
风格损失函数用于衡量两幅图像之间的风格差异大小。首先需要通过计算特征图的Gram矩阵得到图像风格的数学表示。给定VGG在一幅图像中提取的特征图Xl,与之对应的Gram矩阵Gl定义如下。
2●计算Gram矩阵函数的实现
因为PyTorch传入数据必须以批的形式,传入的input的大小为[batch_size, channels, height, width]。计算Gram矩阵时,先用view方法改变张量的形状,然后再将它与它自己转置进行点积即可。
模块在初始化时需要将风格图片的特征图传入并计算其Gram矩阵,通过detach()方法告诉AutoGrad优化时不要变更其中的内容。forward()方法实现上面的公式即可。