PyTorch深度学习实战 | 搭建卷积神经网络进行图像分类与图像风格迁移
创始人
2025-05-28 06:34:25
0

PyTorch是当前主流深度学习框架之一,其设计追求最少的封装、最直观的设计,其简洁优美的特性使得PyTorch代码更易理解,对新手非常友好。
本文为实战篇,介绍搭建卷积神经网络进行图像分类与图像风格迁移。

1、实验数据准备

本文中准备使用MIT67数据集,这是一个标准的室内场景检测数据集,一共有67个室内场景,每类包括80张训练图片和20张测试图片,大家可以登录http://web.mit.edu/torralba/www/indoor.html,在如图1所示的页面中,下载得到这个数据集。

■ 图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的构造函数来自动生成这个类。

2●重载data.Dataset类

可以发现,在构造DataLoader的时候,第一个参数是MyDataset类对象,首先需要定义这个类。这个类是data.Dataset这个PyTorch框架中的数据类的继承,需要重写以下几个函数,其中尤其要注意使得__getitem__()方法可以返回tensor格式的预处理后的图像和标签。

3●transform数据预处理

PyTorch中利用torchvision中的transforms包对图像输入进行预处理,在上一步重载data.Dataset中可以找到这个函数。这个函数接受一个PIL图像,首先缩放到256×256×3,然后随机截取成224×224×3,这是为了保证训练集的多样性,然后转化成PyTorch运算所接受的tensor格式,最后进行数据标准化。

3、图像风格迁移

VGG模型是由Simonyan等人于2014年提出的图像分类模型,这一模型采用了简单粗暴的堆砌3×3卷积层的方式构建模型,并花费了大量的时间逐层训练,最终斩获了2014年ImageNet图像分类比赛的亚军。这一模型的优点是结构简单,容易理解,便于利用到其他任务当中。

VGG-19网络的卷积部分由5个卷积块构成,每个卷积块中有多个卷积(convolution)层,结尾处有一个池化(pooling)层,如图2所示。

■ 图2 VGG-19的网络结构

卷积层中的不同卷积核会被特定的图像特征激活,图3展示了不同卷积层内卷积核的可视化(通过梯度上升得到)。可以看到,低层卷积核寻找的特征较为简单,而高层卷积核寻找的特征比较复杂。

■ 图3 VGG网络中部分卷积层内卷积核的可视化

4、图像风格迁移介绍

图像风格迁移是指将一张风格图Is的风格与另一张内容图Ic的内容相结合并生成新的图像。Gatys等人于2016年提出了一种简单而有效的方法,利用预训练的VGG网络提取图像特征,并基于图像特征组合出了两种特征度量,一种用于表示图像的内容,另一种用于表示图像的风格。他们将这两种特征度量加权组合,通过最优化的方式生成新的图像,使新的图像同时具有一幅图像的风格和另一幅图像的内容。

图4对风格迁移的内部过程进行了可视化。上面的一行中,作者将VGG网络不同层的输出构建风格表示,再反过来进行可视化,得到重构的风格图片;下面的一行中,作者将VGG网络不同层的输出构建内容表示,再反过来进行可视化,得到重构的内容图片。可以看到,低层卷积层提取的风格特征较细节,提取的内容特征较详细;高层卷积层提取的风格特征较整体,提取的内容特征较概括。

■ 图4 风格迁移中使用的风格数学表示和内容数学表示

5、内容损失函数

1●内容损失函数的定义

内容损失函数用于衡量两幅图像之间的内容差异大小,其定义如下。

其中,Xl和Yl分别是两幅图片由VGG网络某一卷积层提取的特征图(feature map),l表示卷积层的下标,i和j表示矩阵中行与列的下标。可见两幅图像的内容损失函数是由特征图对位求差得到的。低层卷积特征图对图片的描述较为具体,高层卷积特征图对图片的描述较为概括。Gatys等人选择了第4个卷积块的第2层(conv4_2)用于计算内容损失,因为我们希望合成的图片的内容与内容图大体相近,但不是一笔一画都一模一样。

2●内容损失模块的实现

模块在初始化时需要将内容图片的特征图传入,通过detach()方法告诉AutoGrad优化时不要变更其中的内容。forward()方法实现上面的公式即可。

6、风格损失函数

1●风格损失函数的定义

风格损失函数用于衡量两幅图像之间的风格差异大小。首先需要通过计算特征图的Gram矩阵得到图像风格的数学表示。给定VGG在一幅图像中提取的特征图Xl,与之对应的Gram矩阵Gl定义如下。

Gram矩阵本质上是特征的协方差矩阵(只是没有减去均值),表示的是特征与特征(卷积核与卷积核)的相关性。

设由以上方式获得Xl和Yl对应的Gram矩阵Gl和Hl,风格损失函数定义如下。

其中,Nl和Ml分别为特征图的通道数与边长,ωl为权重。Gatys等选择了conv1_1,conv2_1, conv3_1, conv4_1, conv5_1用于计算风格损失。

2●计算Gram矩阵函数的实现

因为PyTorch传入数据必须以批的形式,传入的input的大小为[batch_size, channels, height, width]。计算Gram矩阵时,先用view方法改变张量的形状,然后再将它与它自己转置进行点积即可。

3●风格损失模块的实现

模块在初始化时需要将风格图片的特征图传入并计算其Gram矩阵,通过detach()方法告诉AutoGrad优化时不要变更其中的内容。forward()方法实现上面的公式即可。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...