Skip to content

Latest commit

 

History

History
199 lines (121 loc) · 9.28 KB

TrainNote.md

File metadata and controls

199 lines (121 loc) · 9.28 KB

训练

概述

​ 训练分为两步:

  1. 训练 Real-ESRNet

    说明:L1 Loss训练生成器1000k Steps,此时模型目标为生成接近原图的图像。(增加这一步相对直接对抗训练应该能得到更好的结果)

  2. 训练 Real-ESRGAN

    说明:Loss为L1 Loss,GAN Loss,感知Loss(基于VGG19权重),这步模型目标除了接近原图外还有使图片看起来更好。

数据集

  1. 【官方可选、个人推荐】生成多尺寸图片

    生成多尺寸图片可以获得更多参考,使模型对不同大小(准确说单位面积内信息量不同的)图片有更好适应。(例如2k图截取128px只有一个眼睛的部分时,而480p图截取128px可能包含一个头)

    默认代码一张图生成4张(0.75 0.5 1/3 最短边400px) 图片

    代码:scripts/generate_multiscale_DF2K.py

  2. 【可选】裁剪为子图

裁剪为小图能加快读取效率,而不是读取整张图再随机裁剪出gt大小图片。但储存空间占用更多。

代码:scripts/extract_subimages.py

  1. 生成文件表

代码:scripts/generate_meta_info.py

注:以上自带的代码均为读取单个文件夹,可以适配为os.walk读取所有文件。

RealESRGANDataset文件表格式注意:列表中每一行一张图片,此路径与后续配置文件中dataroot_gt拼接后构成完整路径,路径默认不能带空格

如果你已经整理了带空格文件名或文件夹名数据集,或者不喜欢这个要求,可以修改dataset代码

以下为磁盘读取部分为例:

位置:realesrgan\data\realesrgan_dataset.py

class RealESRGANDataset ->def __init__

self.paths = [line.strip().split(' ')[0] for line in fin]改为

self.paths = [line.replace('\n','') for line in fin]

模型训练

1. Real-ESRNet

  1. 预训练模型

    官方训练文档中让下载预先训练的ESRGAN,有需要可以下载,节省一些训练时间。

    除了文档中给出的模型,其他模型应该也可以作为预训练模型,但注意文档给出的是的是realesrnet_x4plus 使用其他模型后续注意配置文件要匹配。

  2. 配置文件

    更多配置见后文,例如图片增强设置与模型结构等,这里为基本设置

    1. 修改datasets部分
    # dataset and data loader settings
    datasets:
      train:
        dataroot_gt: datasets/DF2K # 1. 这里填数据根目录
        meta_info: list.txt # 2. 文件表路径
        batch_size_per_gpu: 12 # 批量大小 12大概占12.5G显存
    1. 训练时开启验证:

    取消val部分注释,共两处,数据与参数设置处

    PairedImageDataset注意:原图与待超分图需要一一对应,文件名相同,图片尺寸根据模型scale倍数设置,如4倍时,待超分图需要为原图1/4尺寸。

    (易炸提示:注意不能整除倍率的图片,要保证待超分图大小乘以倍率为原图大小)

      # 取消注释这些以进行验证
      # val:
      #   name: validation
      #   type: PairedImageDataset
      #   dataroot_gt: path_to_gt # 原图文件夹
      #   dataroot_lq: path_to_lq # 待超分图文件夹 
      #   io_backend:
      #     type: disk
    
    ...
    
      # 取消注释这些以进行验证
      # 验证设置
      # val:
      #   val_freq: 5000 # 验证频率,单位:步,直接填整数也行
      #   save_img: True
    
      #   metrics:
      #     psnr: # 指标名称,可以是任意的
      #       type: calculate_psnr
      #       crop_border: 4
      #       test_y_channel: false
  3. 正式训练前,推荐使用调试模式测试,调试模式会每步输出信息,并在开始几步后测试验证,确认无误后再正式训练。

    单卡命令示例(多卡见官方文档):

    python realesrgan/train.py -opt options/train_realesrnet_x4plus.yml --debug
    

    正式训练(--auto_resume在下次会接上最近保存的模型继续训练):

    python realesrgan/train.py -opt options/train_realesrnet_x4plus.yml --auto_resume
    

    保存频率可在配置文件中logger-> save_checkpoint_freq处修改

    Net模型官方默认1000k Step ,减少是否影响效果待测试。(个人觉得如果loss与验证指标基本不动应该就差不多了)

2. Real-ESRGAN

  1. Net(realesrnet)训练完后,去experiments文件夹下找到训练完的模型,然后指定为gan的预训练模型,即在配置文件中修改pretrain_network_g (配置文件与上面Net模型成对,注意别选错了,例如train_realesrgan_x4plus.yml
  2. 修改配置文件内容然后训练,此步骤基本与上面Net模型相同。

微调

微调与数据准备与训练差不多,本文不再介绍。

更多

训练时降质图像合成方案(理论)

推荐1,2配合,4对插画比较激进,插画一般多为jpg,少量不当缩放与模糊,默认配置中加入高斯噪点,泊松噪点不太必要。考虑综合性能,12配合比较好。可训练一个仅缩放与一个带修复模型,最后得到两个模型,权重加权融合实现调整修复强度。

  1. 无退化,仅缩放
  2. jpg+不当缩放+模糊+伪影 二次jpg
  3. 仅jpg
  4. 默认2次退化

但后续测试发现,降质方案与最终效果的关系并不那么理想,例如出现了1效果比4还差,且1继续训练无改善的情况。

测试记录

训练时表现(以下为粗略记录,用来为快速调整与随便试试参考,部分意义不大的测试数据未保留,追求严谨应该分别做消融实验):

  1. 默认2次退化,默认训练配置(Net:L1 loss GAN:GAN+Perceptual loss) (PSNR Net 25.8 GAN 24)
    1. Net阶段 :开始边缘消失,严重模糊,稳定后整体较模糊。初始化训练,100k后变化不大,与200k对比后者细节稍好,600k后几乎无提升。
    2. GAN阶段:边缘逐渐清晰。10k后边缘已经锐利,但质量较低。100k~300k过程看起来边缘略微自然一些(并没有明显好转)。300k后几乎看不出提升。
    3. 存在问题:GAN阶段出现高频噪声,不当纹理,过度修复。例如将背景中远景,模糊,景深中的纹理也生成为锐利纹理;人物脸红效果被抹掉;星空背景,粒子特效被抹掉。继续训练无法改善,300k step仍然存在。
  2. 无退化,默认训练配置(PSNR Net 26 GAN 26)
    1. Net阶段:开始和插值后图片差不多,模糊没有2次退化时严重,逐渐清晰。10k后稳定,也是整体模糊,但比2次退化好一点。
    2. GAN阶段:继续训练5K后变化不大。
    3. 结果线条变粗,有轻微伪影,双重边缘。此处比较奇怪,按理说简单的仅缩放任务应该比修复+缩放简单,但训练一段时间后再无提升
  3. 仅Sinc模拟伪影:和无退化差不多,看起来无明显差别

​ 官方的Anime模型,高频噪声很少,但小图缩放效果较差,细节容易被抹掉,边缘颜色保留不当,边缘有一定弯曲等GAN失真。而1默认配置训练,问题差不多。跑完1发现效果不好,所以停下来理论分析了下,这个模型的默认配置是用于实景图超分的,与插画超分任务有一定区别。所以得到了合成方案2,另外插画边缘是更影响视觉观感的,其他色彩区域不太需要让模型过度注重。对此,打算尝试引入边缘损失(边缘检测,高频滤波)来引导模型注重边缘与高频。以下继续测试。

  1. 合成方案2轻度降质,默认配置基础上加上边缘损失(Canny+Sobel(Ksize 1)(L1 Mean)),默认权重:

    1. PSNR Net 28.5 GAN 28

    2. Net阶段:边缘明显比1,2清晰很多,稳定后效果已经不错,边缘仅略微模糊

    3. GAN阶段:边缘更清晰,有高频噪声,不当纹理。过度修复减轻。

尝试改善GAN失真

  1. 4的基础上拉高边缘损失权重(Canny4,Sobel16,SobelColor4),降低GAN与感知损失(GAN 0.1->0.05,P 1-0.05),并用Sobel结果提取原图带色彩部分再作为损失:

    1. 边缘与复杂处GAN失真减少一点,但出现双重边缘,边缘线条变粗问题(上面也有一点);缩放大图时粗边缘两端颜色正常,中间异常;带纹理边缘GAN失真效果严重。

    2. 怀疑对大图进行边缘提取时出现了两根线条,然后影响了模型。(考虑改Kernel Size以捕捉更大范围)

  2. 还原GAN与感知损失权重,边缘权重全设为1,SobelKernel改为3,双重线条,线条中间色彩异常,带纹理线条失真有改善。

其他优化方案考虑:

  1. 添加Texture Loss改善纹理与高频噪声?

数据相关:

  1. 开锐化:更锐利的边缘,但整体色彩与边缘色彩与原图有一定偏差,另外有点影响辉光,发光效果。(不推荐开)
  2. 图中含有jpg等低质量图片:
    1. 导致模型修复性能(降噪,抗模糊等)降低。
    2. 引入噪点(可能,此处在GAN阶段发现,但筛掉jpg后噪点少了一点点,也可能是错觉,未继续测试)

与本模型无关的其他:

  1. 关于EMA:快速调参测试时感觉可以关掉?
  2. FP16:Net模型配合Grad Scale还行,GAN测试中不稳定。显存能减少,但Scale占用也高,导致没能怎么加速。(总体来说不推荐)