目录
背景
《bringing old photos back to life》是一篇用于老照片修复的论文,论文的故事讲的很好,但是不利于读者的理解,而且代码中的很多细节,论文中并未提到。具体的代码背景等可以查看我之前写的一些文章,本次博客主要记录我用它的模型做的我一些任务(去雾),并写出一些主要得坑和tips。
下面从三部分记录,分别为数据的处理,模型修改,模型训练,中间加插一些坑与tips。过些时间我会上传一份我训练的代码和数据集(等我的论文出版之后吧==)。
数据的处理
原始论文得数据处理就是一个坑。
1.
原论文一共需要两种数据集,一种是清晰的图片(Pascal VOC dataset),一种是他们收集的老照片(5718张,未公开)。
其实,准确的说还有两种,即利用清晰得图片(Pascal VOC dataset)通过降质算法(如高斯、白噪声、椒盐等)模拟生成的模糊图片,这一步骤嵌入在模型里,训练时自动生成;单纯这样不足还以模拟破旧的照片,还需要一些裂痕(mask,未公开),这比较复杂,需要标注生成。
你如果想要完全复原原始论文,是不可能的!我没关注他们最近是否完全公开了数据集。
但是,你可以拿它来做类似得任务,你只需要有 三种图像,输入图像(可由输出图像生成),输出图像,真实收集的输入图像(可无)。
因此,你如果实在想使用这个模型的话,你最少可以只有一种数据,就是你想要模型的输出的图像,,前提是你模拟生成的输入图像(如利用清晰图像生成的雾图,利用清晰的图像生成的海底图像....)足够逼真。当然,这里的输入和输出互相可以调换,做相反的任务,哈哈,我已经用它做了加雾和去雾,你们不要再做了喔 ==!,如果不嫌弃需要我的论文的话,可以私聊我。
2.
有了数据之后,如果按照他们的流程,你需要将训练数据进行打包,即把各训练集分别打包成一个文件,这样可能会让模型读取数据更快。但是,这在训练时会直接内存爆掉(严重会使电脑死机...),因为,它会一次性读取所有的数据!
因此,如果你的内存不大的话,一个解决办法是,不进行打包,修改它得dataload文件,读取训练所需要的图像,而不是读取打包的所有图像。
模型修改
模型修改可以分两大部分:一是直接添加模块,主要加在网络的mapping net上;二是修改模型的主要部分,如映射,对齐。
1.
添加小模块,为什么不添加到编码和解码上呢? 主要是我觉得如果你在编码器上添加的话,而解码器进行的是完全逆的操作,你添加的模块需要能进行逆的操作,不然可能模型会坏掉(当然,只是我的猜测,你们可以看下模型)。
因此,添加模块操作最简单的是在论文中的mapping T,在代码中是mapping_model。你可以添加任何即插即用的模块,如注意力,往里怼就行,(注意通道数即可,好像是64),然后开启你的改模型之旅吧==!
2.
论文模型有两个重点,一个是mapping T,另一个是align ,即对齐操作。我们加小模块就是在mapping T里面加的。
注意的是,默认情况下,mapping T是在最后训练的,前面会先训练VAE A 和VAE B(A、B无先后),然后固定住VAE A和VAE B的权重,再训练mapping T。
因此,你可以尝试完全删除mapping T,查看训练的结果,当然肯定很差;或者删除之后,你可以不固定VAE A,B的权重,训练的结果应该还凑合(未尝试),但是这就失去了模型的灵魂,因为这只训练一个VAE A 和 VAEB 一样了。你可以尝试删除align操作,在代码里只有一行,就是一个对抗损失而已,你也可以尝试将align操作反向一下,这样可以用于你做相反的任务!
模型训练
其实做好了第一步的 数据的处理, 训练就很简单了,可以完全按照代码中得readme进行操作。
需要注意的是,代码中有进行人脸提取和优化的操作,用的是Unet,在论文中并未提及,我也没细致的查看。其实如果不做原始任务,这部分没啥用。
另外,模型针对有无裂缝使用了不同的模型,我们使用无裂缝的代码。有裂缝的代码主要用部分卷积partial convolution。
后续
=================================分割线================
请查看该系列的下一篇文章,代码开源实现,地址: