课程链接: 清华大学驭风计划
代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com)
驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算机语言(刘知远教授) 以及数据结构与算法(邓俊辉教授)。本人是综合成绩第一名,除了数据结构与算法其他单科均为第一名。代码和报告均为本人自己实现,由于篇幅限制,只展示任务布置以及关键代码,如果需要报告或者代码可以私聊博主
机器学习部分授课老师为胡晓林教授,主要主要通过介绍回归模型,多层感知机,CNN,优化器,图像分割,RNN & LSTM 以及生成式模型入门深度学习
有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~
任务介绍
1. 任务简介
本次案例将使用生成对抗网络来实现4倍图像超分辨任务,输入一张低分辨率图像,生成器会生成一张4倍超分辨率的图像,如图1所示。生成对抗网络选用SRGAN结构 [1] 。本案例训练集使用DIV2K数据集 [2] ,包含有800张2K左右高分辨率的图像和800张对应的低分辨率图像;测试集使用DIV2K验证集 [2] 、Set5、Set14、B100、Urban100五个数据集,分别包括高分辨率图像和对应的低分辨率图像。训练集和测试集中的所有低分辨图像都是由高分辨率图像下采样得到,下采样方法为使用Matlab中的resize函数,scale factor为0.25,其余为默认参数(双三次插值)…
本案例使用 PSNR 与 SSIM 两个评价指标来衡量生成的高分辨率图像的质量,但指标的高低并不能直接反应图像质量的好坏,因此最终结果评价会加入人工评价,具体见第 4 部分的要求。
2. 方法描述
本案例涉及到两种内容损失函数,第一种为图像像素空间的MSE损失,第二种为图像特征空间的MSE损失。
像素空间的MSE损失表示为:
而特征空间的MSE损失如下图:
除此之外还有对抗损失函数损失
3. 参考程序
本案例提供了部分代码供使用,各程序简介如下:
create_data_lists.py : 下载好训练集和测试集后,根据提供的数据集地址来生成案例训练测试所需要的 csv 文件。
datasets.py : 定义符合 pytorch 标准的 Dataset 类,供读入数据,注意训练阶段每张图片采样了 100 个 patch 来扩充训练集。
imresize.py : 用 python 实现了 matlab resize 函数,用于图像下采样。目前python 第三方包中尚未有能得到与 matlab resize 函数一样结果的函数。
solver.py : 定义了一个 epoch 的训练过程。
models.py : 定义 SRGAN 模型结构,需要自行实现。
train.ipynb : 用于训练的 jupyter 文件,其中超参数需要自行调节,训练过程中可以看到模型损失的变化,每个 epoch 训练后都会进行模型保存。
test.ipynb : 加载指定的训练好的模型文件,在 5 个测试集上进行测试,计算并报告各个数据集上的 PSNR 和 SSIM 指标数值。
super_resolution.ipynb : 加载指定的训练好的模型文件,针对单个图片进行 4倍超分辨,并对结果进行可视化。
utils.py : 定义了一些可能会用到的函数,如图像数值格式转换等。
环境要求:python 包 pytorch, torchvision, numpy, csv, PIL, matplotlib, easydict,tqdm 等。
使用说明
- 下载训练集和测试集[5],更改 create_data_lists.py 中数据集存放的位置,指定输出文件夹,运行该文件生成案例所需的 csv 文件;
- 按照 SRGAN 网络结构完成 models.py;
- 运行 train.ipynb 训练网络,现在的训练模式为初始化生成器和判别器后,对生成器和判别器进行交替更新。这样的训练模式只能得到一个表现很差的模型。案例要求自行设计训练模式,如加入生成器的预训练等[4],更改 solver.py 和 train.ipynb 训练出一个性能好的模型;
- 运行 test.ipynb 对训练的模型进行测试,现在是对 5 个测试集进行 PSNR和 SSIM 的计算。其中包含了 DIV2K 数据集中的验证集,这个验证集也可以作为训练时用于调整参数的验证集(如需验证请自行修改 train.ipynb实现,不做要求);
- 模型训练好之后运行 super_resolution.ipynb 生成供人工测评的图片。
4. 要求和建议
完成 models.py 文件,可参考原论文[1];
调节 train.ipynb 中的超参数,使网络结构与原论文保持一致。运行 train.ipynb使案例可以跑通基础模式的训练;
设计生成器和判别器的训练方式,可参考[4]中的训练方式,修改 solver.py 和train.ipynb 训练出性能更好的模型;
运行 test.ipynb 对模型在 5 个测试集上进行测试,记录 PSNR 与 SSIM 结果;
运行 super_resolution.ipynb,为 Set5 测试集中的每一张低分辨图片生成相应的高分辨图片,保留结果供人工评价;
完成一个实验报告,内容包括生成器和判别器的训练方式说明、模型最佳参数和对应的测试集结果、Set5 测试集图片生成结果、自己所做的尝试和改进;
提交所有的代码文件,注意 jupyter 文件保留结果,请不要提交模型文件;
禁止任何形式的抄袭,借鉴开源程序务必加以说明。
报告
核心代码
生成器
判别器
结果
对比了SRGAN 和SRGAN+的性能对比