# Super_Resolution_GAN **Repository Path**: qingge_dada/super_-resolution_-gan ## Basic Information - **Project Name**: Super_Resolution_GAN - **Description**: 图像增强是 GAN 落地最成熟的一个方向,本项目通过图像增强中非常经典的超分辨率任务,从需求分析和数据收集开始,全链路探索GAN技术在企业中一步步落地,解决客户的实际需求 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2023-04-06 - **Last Updated**: 2026-01-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 图像增强超分辨率项目 ![image-20230404201856172](imgs/image-20230404201856172.png) **高清化**是社交网络发展的需求,展示设备的分辨率越来越高但许多仍经常传播的经典表情包分辨率较低,此外表情包图片在网络传播中经历了**多次压缩**进一步降低了质量,看见好的表情包想要收藏,但有时质量很低。 生成式对抗网络模型被誉为“下一代深度学习框架”是目前最强大的生成式模型,已在图像视频生成、增强、编辑等应用领域广泛落地。比如换脸、绘画、让人物跳舞、老片修复、以及让照片人脸动起来等等。 图像增强是 GAN 落地最成熟的一个方向,本项目通过图像增强中非常经典的超分辨率任务,从需求分析和数据收集开始,带全链路探索GAN技术在企业中一步步落地,解决客户的实际需求 ## 数据集构建 ### 需求 - 高清表情包图片 - 低清表情包图片 - 涵盖各种类别黑白简笔画动漫人脸动物 - 彩色简笔画真实人脸 ![image-20230408164138817](imgs/image-20230408164138817.png) ### 图片收集工具 Image-Downloader 工具 ### 主要目标 - 去除异常数据 - 提取图像基础信息和特征 - 阈值设置 - 数据均衡 ### 图片规格 文件信息 - 文件大小,分辨率,长宽比 颜色特征 - 直方图,亮度,对比度,饱和度 纹理特征 - 图像梯度 - 边缘提取 数据合并 图片去重 图片分类 高质量标准 分辨率、清晰度、噪声 高质量增强 降采样、锐化、去噪 ![image-20230408170203153](imgs/image-20230408170203153.png) ## Baseline搭建 ESRGAN ![image-20230408233241288](imgs/image-20230408233241288.png) [BasicSR](https://github.com/xinntao/BasicSR) 步骤: - 下载代码 - 下载预训练模型 - 修改配置文件 - 模型运行 ## 模型调参 待调节的参数模型结构 - block,深度,宽度,正则化 - 模型初始化 - 数据加载 - 裁剪,变换resize,batch size - 损失函数 - 优化器 - 学习速率 image-20230408235149807 image-20230408235158113 自动调参 - Gird Search - Random Search - Bayesian Optimization - 强化学习 - Auto ML 模型的调整 - 替换最后几层 - 修改输出channel数并保留原有参数 - 添加正则化 - 添加dropout - 使用Ensemble ![image-20230408235410859](imgs/image-20230408235410859.png) 常用调参技巧 - 越大的batch size使用越大的学习率 - 单卡batch size一般越大越好,多卡则不一定 - SGD,Momentem SGD - 学习率衰减,重置,warm up - 早期停止 - 训练更长的时间 ### 非GAN训练 批量调参训练 - 确定用于调参的子集规模 - 列出需要调整的参数 - 选择参数默认值 - 确定命名规则 - 确定模型评价方式 模型评价 - 有参考评价 - PSNR,SSIM - 无参考评价 - NIQE,SI - 主观评价 ![image-20230408235636956](imgs/image-20230408235636956.png) ### GAN训练 Beyond compare - 强大的文件比较软件 - 支持多种文件格式 - 可用于比较图像的细微差别 https://www.beyondcompare.cc/ image-20230408235724522 ## 改进 ### 面向真实场景的超分 超分辨率任务 Non-blind SR: 退化参数已知 Blind SR: 旨在恢复遭受未知和复杂退化的低分辨率图像。根据潜在退化过程,现有方法可分为显式建模和隐式建模 经典的退化模型,包括模糊、降采样、噪声和JPEG压缩,被广泛应用于显式建模。然而现实世界的退化通常过于复杂,难以用多次退化的简单组合来建模 隐式建模方法利用生成对抗网络(GAN)的数据分布学习来获得退化模型。但是,它们仅限于训练数据集中的退化,并且不能很好地推广到分布外的图像 Real-SR 为了生成更多的真实LR图片,设计了一个模拟真实世界图像的退化过程,任务LR图像由如下过程得到 : $$ I_{LR} =(I_{HR} * k_s) +n $$ 模糊LR图片通过对HR图片通过模糊核降采样,而这个模糊核是通过真实的模糊图片,使用``KernelGAN估计``的 通过注入从真实的噪声图像中收集到的``噪声斑块``来恢复真实的噪声分布 使用``patch判别器``而不是VGG-128 image-20230409000542983 ### Real-ESRGAN 复杂的退化通常来自不同退化过程的复杂组合,如相机成像系统、图像编辑和互联网传输例如拍照时,照片可能的几个退化有: 相机模糊、传感器噪声、锐化伪影和JPEG压缩编辑并上传到一个社交媒体应用程序,照片会进一步的压缩和产生不可预测的噪声当图像在互联网上共享多次时,上述过程会变得更加复杂 ![image-20230409000650648](imgs/image-20230409000650648.png) 此前应对真实世界超分任务的方法: - 一类涉及显式的退化表示,通常由两个组件组成: 退化预测和条件恢复。这些方法依赖于预定义的退化表示 (例如,退化类型和水平),并且通常考虑简单的合成退化。此外,不准确的退化估计将不可避免地导致伪影 - 另一类是获得生成尽可能接近真实数据的训练对,然后训练一个统一的网络来解决 Blind SR问题。训练对通常是 - 用特定的相机捕获,然后进行繁琐的对齐,但是其捕获的数据仅局限限于与特定相机相关的退化,因此不能很好地推广到其他真实图像 - 或直接从周期一致性损失的未配对数据中学习,但使用未配对数据学习细粒度退化具有挑战性,结果通常不令人满意 - 或用估计的模糊核和提取的噪声斑块合成 将经典的“一阶”退化模型扩展到现实世界退化的“高阶”退化模型,即退化用几个重复的退化过程建模,每个过程都是经典的退化模型。**根据经验,采用了一个二阶退化过程,以实现简单性和有效性之间的良好平衡**。 进一步在合成过程中加入了sinc滤波器,以模拟常见的振铃和超调伪影 由于退化空间远远大于ESRGAN,训练也变得具有挑战性。 具体来说: 判别器需要更强大的能力来区分真实度和复杂的训练输出,而来自判别器的梯度反馈需要更准确地提高局部细节。因此,将ESRGAN中的VGG风格的判别器改进为U-Net设计 U-Net的结构和复杂的退化也增加了训练的不稳定性。因此,采用谱归一化(Spectralnormalization)来稳定训练动力学 ### 谱归一化 矩阵的L2范数,又被称为矩阵的谱范数 在每一次训练迭代中对神经网络的每一层作奇异值(SVD)分解求解谱范数是不现实的,因此采用幂迭代的方法去迭代得到奇异值的近似解 ### 退化 为了包含更多样化的核形状,进一步采用了广义高斯模糊核和托盘形状的核 由于最近邻插值引入了错位问题,排除了它只考虑了面积、双线性和双边运算块效应通常由JPEG压缩引入,使用PyTorch实现JPEG压缩 使用了sinc滤波器,一个切断高频的理想滤波器,来合成训练对的振铃和超调伪影。在两个方面采用sinc滤波器:模糊过程和合成的最后一步。为了覆盖更大的退化空间,最后一个sinc滤波器和JPEG压缩的顺序被随机交换,因为一些图像可能首先被过度锐化 (带有超调伪影) ,然后进行JPEG压缩;而有些图像可能首先进行JPEG压缩,然后进行锐化操作 image-20230409001128332 退化总结 - 将经典的退化模型扩展到高阶退化过程,以建模更实际的退化 - 一个n阶模型涉及n个重复的退化过程,其中每个退化过程都采用了相同的过程,但不同的超参数。 - 这里的“高阶”不同于数学函数中使用的方法,主要是指同一操作的实施时间 - 根据经验,采用了一个二阶退化过程,它可以在保持简单性的同时处理大多数真实情况 ![image-20230409001355257](imgs/image-20230409001355257.png) 扩展了原始的×4ESRGAN架构, 以×2和×1的比例因子执行超分辨率 使用Pixel Unshuffle来减小空间大小和扩大通道大小,然后将输入输入到主ESRGAN体系结构中 ![image-20230409001425558](imgs/image-20230409001425558.png) U-Net 谱归一化判别器: Real-ESRGAN中的判别器对复杂的训练输出需要更大的判别能力。它不需要区分全局样式, 而是需要为局部纹理产生准确的梯度反馈。因此,将ESRGAN中的VGG的判别器改进为具有skip connection的U-Net设计,U-Net输出每个像素的真实度,这可以向生成器提供更详细的反馈信息 ![image-20230409001448122](imgs/image-20230409001448122.png) ### 模型训练 训练一个面向L1损失的PSNR的模型,所得到的模型命名为Real-ESRNet使用训练后的Real-ESRNet作为预训练模型,并结合L1损失、感知损失和GAN损失来训练Real-ESRGAN 为了提高训练效率,所有的退化过程都在PyTorch中实现,从而能够动态地合成训练对批处理限制了一批合成退化的多样性。 例如,一个Batch中的样本不能具有不同的调整大小缩放因子。因此,使用一个训练对池来增加一个Batch的退化多样性。在每次迭代中,从训练对池中随机选择训练样本形成Batch,池的大小设置为180 根据经验发现,在训练过程中锐化HR图像可以实现更好的锐度和超调伪影抑制的平衡将用锐化后的HR图像训练的模型表示为Real-ESRGAN + 虽然Real-ESRGAN能够恢复大多数现实世界的图像,但仍然有一些限制一些修复的图像 (特别是建筑和室内场景) 由于对产问题而扭曲 GAN训练还是在一些样本上引入了伪影它不能消除分布外的复杂退化,更糟糕的是它可能会放大这些伪影。这些缺点对Real-ESRGAN的实际应用有很大的影响,在未来的工作中急需解决。 ![image-20230409001710422](imgs/image-20230409001710422.png) ## 部署 - demo简单部署对吞吐和时延没有要求 - 要求吞吐和时延,在吞吐和时延满足要求的基础上,尽量减少功耗和成本NVIDIA嵌入式平台,注重时延其他嵌入式平台,注重时延 image-20230409104507624 ### 要素 - 部署环境 - 部署类型 - 实时预测,离线预测 - 模型存储 - 模型转换,模型加密 - 性能要求 稳定性,单次响应时间,吞吐量,可伸缩性 - 模型管理 - 自动更新 ### 深度学习推理框架 TensorRT - 在NIVDIA的GPU上使用 OpenNINO - 在Intel的CPU上使用 NCNN,TNN - 腾讯的移动端框架,代码直观 MNN - 阿里的移动端框架,性能略占优势 MindSpore、MegEngine、MACE image-20230409105849717 ### 模型转换 使部署环境可以脱离训练环境,可以针对当前格式实施特定的优化操作,但不是所有的模型操作符 (Operators) 能到转换成功 ONNX 主要由微软,亚马逊 ,Facebook 和 IBM 等公司共同开发,目前官方支持加载ONNXCaffe2,Pytorch,MXNet,ML.NET模型并进行推理的深度学习框架有:TensorRT 和 Microsoft CNTK,TensorFlow也有非官方的支持ONNX Pytorch - ONNX (- 对TensorRT更为友好的Caffe )- TensorRT/Openvino/Onnxruntime用CUDA自己定制算子 底层优化 ### 模型压缩 剪枝: 将模型中对精度影响非常小的参数裁剪掉 量化: 使用更低精度的数据类型进行推理量化的过程主要是将原始浮点 FP32 训练出来的模型压缩到定点 INT8(或者 INT4/INT1) 的模型,由于 INT8 只需要 8 比特来表示,因此相对于 32 比特的浮点,其模型规模理论上可以直接降为原来的 1/4,这种压缩率是非常直观的 蒸馏: 从一个复杂的模型中,提取出效果相近但更简单的模型 image-20230409111557058 image-20230409111611647 ### 内存分配 内存复用 对计算图进行拓扑排序,确定每一个节点的生命周期,在其生命周期结束后,将其内存分配给其它节点使用 内存交换 - 实现Host和Device间的内存搬运 计算换内存 - 删除一部分正向传播的结果,反向传播时,对这些值进行重新计算 最大化吞吐和时延 - 批处理 接收到请求时,不立即对请求进行处理而是在一个超时门限的时间内进行缓存将多个请求合并为一次请求进行处理 - 保存推断结果 模型更新 - 在线学习 ### 后端开发 PyTorch JIT Just In Time Compilation,即时编译 JIT 是 Python 和 C++ 的桥梁,可以使用 Python 训练模型,然后通过JIT 将模型转为语言无关的模块 可以使用 JIT 的 trace 功能来得到 PyTorch 模型针对某一输入的正向逻辑通过正向逻辑可以得到模型大致的结构 load时无需模型文件 通过Tracing、Scripting、或者混合两种方式进行创建 ![image-20230409112155042](imgs/image-20230409112155042.png) 服务搭建 - 模型加载 - 接受请求 - 输入前处理 - 模型推断 - 输出后处理 - 性能监控 - 日志管理 ![image-20230409112245341](imgs/image-20230409112245341.png) ### 前端开发 请求发送与接收 - 选择图片 - 上传图片 - 获取结果 - 展示图片 - 保存图片 控件使用 - image - button ## 改进方向 更精确的数据分类 更贴近实际处理图片的测试集 更多先进模型效果的比较 更深入的模型调参 稍降低图像锐度 人脸和文字的检测与处理 KernelGAN模糊核预测 + Real-ESRGAN