低照度图像增强网络——EnlightenGAN

系列文章目录

GAN生成对抗网络介绍icon-default.png?t=O83Ahttps://blog.csdn.net/m0_58941767/article/details/142704354?spm=1001.2014.3001.5501

循环生成对抗网络——CycleGANicon-default.png?t=O83Ahttps://blog.csdn.net/m0_58941767/article/details/142704671?spm=1001.2014.3001.5501


目录

系列文章目录

前言

一、EnlightenGAN的主要特点

二、EnlightenGAN网络结构

三、核心代码实现

1、train.py

2、predect.py

四、推理结果 

五、调试好的源码


前言

EnlightenGAN是一种用于低照度图像增强的无监督生成对抗网络。它能够在没有成对训练数据的情况下,通过利用输入图像本身的信息来进行自我正则化,从而实现图像的增强。这种方法特别适用于那些难以获取大量成对低照度和正常光照图像的场景。


一、EnlightenGAN的主要特点

  1. 无监督训练:EnlightenGAN不需要成对的低照度和正常光照图像来训练,这使得它能够更容易地适应真实世界的图像增强任务。

  2. 生成器结构:它采用了一个带有自注意力机制的U-Net生成器,这种结构有助于增强图像的局部细节,同时保持整体的光照平衡。

  3. 双判别器结构:EnlightenGAN使用了全局和局部判别器来平衡图像的全局和局部增强。全局判别器关注整体光照差异,而局部判别器则关注图像的细节特征。

  4. 自正则化感知损失:为了在没有成对数据的情况下保持图像内容的特征,EnlightenGAN引入了自特征保持损失,这有助于在增强过程中保持图像的纹理和结构。

  5. 自正则注意机制:通过利用低照度输入图像的光照信息作为自正则化注意力图,EnlightenGAN能够在不依赖外部监督的情况下,指导学习过程。

  6. 灵活性和适应性:由于其无监督设置,EnlightenGAN可以很容易地适应于增强来自不同领域的现实世界低照度图像。

  7. 实验结果:通过广泛的实验,EnlightenGAN在多种评价指标下的表现均优于现有的方法,包括视觉质量、无参考图像质量评估和人类主观研究。

二、EnlightenGAN网络结构

网络结构 = 生成器(带自注意力机制的U-Net)+ 判别器(全局-局部鉴别器)


三、核心代码实现

1、train.py

import timeimport torchfrom options.train_options import TrainOptions
from data.data_loader import CreateDataLoader
from models.models import create_model
from util.visualizer import Visualizer
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
def get_config(config):import yamlwith open(config, 'r') as stream:return yaml.safe_load(stream)def main():opt = TrainOptions().parse()opt.mode = 'train'config = get_config(opt.config)data_loader = CreateDataLoader(opt)dataset = data_loader.load_data()dataset_size = len(data_loader)print('#training images = %d' % dataset_size)model = create_model(opt)visualizer = Visualizer(opt)total_steps = 0for epoch in range(1, opt.niter + opt.niter_decay + 1):epoch_start_time = time.time()for i, data in enumerate(dataset):iter_start_time = time.time()total_steps += opt.batchSizeepoch_iter = total_steps - dataset_size * (epoch - 1)model.set_input(data)model.optimize_parameters(epoch)if total_steps % opt.display_freq == 0:visualizer.display_current_results(model.get_current_visuals(), epoch)if total_steps % opt.print_freq == 0:errors = model.get_current_errors(epoch)t = (time.time() - iter_start_time) / opt.batchSizevisualizer.print_current_errors(epoch, epoch_iter, errors, t)if opt.display_id > 0:visualizer.plot_current_errors(epoch, float(epoch_iter)/dataset_size, opt, errors)if total_steps % opt.save_latest_freq == 0:print('saving the latest model (epoch %d, total_steps %d)' %(epoch, total_steps))model.save('latest')if epoch % opt.save_epoch_freq == 0:print('saving the model at the end of epoch %d, iters %d' %(epoch, total_steps))model.save('latest')model.save(epoch)print('End of epoch %d / %d \t Time Taken: %d sec' %(epoch, opt.niter + opt.niter_decay, time.time() - epoch_start_time))if opt.new_lr:if epoch == opt.niter:model.update_learning_rate()elif epoch == (opt.niter + 20):model.update_learning_rate()elif epoch == (opt.niter + 70):model.update_learning_rate()elif epoch == (opt.niter + 90):model.update_learning_rate()model.update_learning_rate()model.update_learning_rate()model.update_learning_rate()else:if epoch > opt.niter:model.update_learning_rate()if __name__ == '__main__':main()

2、predect.py

import time
import osimport torchfrom options.test_options import TestOptions
from data.data_loader import CreateDataLoader
from models.models import create_model
from util.visualizer import Visualizer
from pdb import set_trace as st
from util import htmldef main():opt = TestOptions().parse()opt.nThreads = 1   # test code only supports nThreads = 1opt.batchSize = 1  # test code only supports batchSize = 1opt.serial_batches = True  # no shuffleopt.no_flip = True  # no flipdata_loader = CreateDataLoader(opt)dataset = data_loader.load_data()if(len(dataset)==0):raise ValueError("Dataset is empty. Please check your data path and data loader configuration.")model = create_model(opt)visualizer = Visualizer(opt)# create websiteweb_dir = os.path.join("./ablation/", opt.name, '%s_%s' % (opt.phase, opt.which_epoch))webpage = html.HTML(web_dir, 'Experiment = %s, Phase = %s, Epoch = %s' % (opt.name, opt.phase, opt.which_epoch))# testprint(len(dataset))with torch.no_grad():for i, data in enumerate(dataset):model.set_input(data)visuals = model.predict()img_path = model.get_image_paths()print('process image... %s' % img_path)visualizer.save_images(webpage, visuals, img_path)webpage.save()if __name__ == '__main__':main()

四、推理结果 

可见效果还是不错的。

五、调试好的源码

由于直接下载GitHub上的源码需要进行调试才可以运行,调试过程比较麻烦,我这边提供给大家一个我调试好的源码,方便新手进行训练、测试。

大家扫码关注公众号,回复关键字EnlightenGAN源码即可获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1556893.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SSM社区慢性病管理系统—计算机毕业设计源码37572

摘 要 社区慢性病管理是社区卫生服务的主要内容,发展社区卫生服务是提供基本卫生服务、满足人民群众日益增长的卫生服务需求,也是提高人民健康水平的重要保障。为迎接慢性病防治的挑战我国进行了社区卫生服务改革,但由于社区卫生存在的诸多问…

OJ在线评测系统 微服务 OpenFeign调整后端下 nacos注册中心配置 不给前端调用的代码 全局引入负载均衡器

OpenFeign内部调用二 4.修改各业务服务的调用代码为feignClient 开启nacos注册 把Client变成bean 该服务仅内部调用,不是给前端的 将某个服务标记为“内部调用”的目的主要有以下几个方面: 安全性: 内部API通常不对外部用户公开,这样可以防止…

【CF2021E】Digital Village(All Version)

题目 给你一张 n n n 个点 m m m 条边的无向图,有 p p p 个关键点。你需要选择 k k k 个点染黑,使得这 p p p 个关键点到这 k k k 个黑点的代价和最小。定义代价为两点之间边权最大的边的最小值。 你需要求出 k 1,2,…,n 的所有答案 E1 n,m,p&l…

fiddler抓包20_弱网模拟

课程大纲 ① 打开CustomRules.js文件:Fiddler快捷键“CtrlR”(或鼠标点击,菜单栏 - Rules - Customize Rules)。 ② 设置速率:“CtrlF”,搜索 “m_SimulateModem”,定位至函数。在函数里设置上传、下载速率&#xff0c…

乔斯编程——P3283 通信救援

说明 众所周知,在同一平面内到定点的距离等于定长的点的集合叫做圆。这个定点叫做圆的圆心,定长即圆的半径。 同时用圆心的坐标和圆的半径,就可以确定圆在平面内的位置, 在本题当中,我们根据圆在平面覆盖的区域来描述…

全面解析大型模型Agent智能体原理及实践案例

1 什么是大模型 Agent ? 大模型 Agent,作为一种人工智能体,是具备环境感知能力、自主理解、决策制定及执行行动能力的智能实体。简而言之,它是构建于大模型之上的计算机程序,能够模拟独立思考过程,灵活调…

动态规划10:174. 地下城游戏

动态规划解题步骤: 1.确定状态表示:dp[i]是什么 2.确定状态转移方程:dp[i]等于什么 3.初始化:确保状态转移方程不越界 4.确定填表顺序:根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接:174.…

【FPGA】面试八股

1.FPGA的底层资源有哪些 (1)可编程的逻辑资源 可编程的逻辑单元由查找表(LUT),数据选择器(MUX),进位链(Carry Chain)和触发器(Flip-Flop) (2&…

毕业设计——物联网设备管理系统后台原型设计

作品详情 主要功能: 通过构建数字化综合体,利用物联网技术、设备监控技术采集生产线设备等物对象的实时数据,加强信息汇聚管理和服务,多系统维度、多层次的清楚地掌握设施各系统的状态,提高厂房服务的可控性、安全性&…

算法剖析:双指针

文章目录 双指针算法一、 移动零1. 题目2. 算法思想3. 代码实现 二、 复写零1. 题目2. 算法思想3. 代码实现 三、 快乐数1. 题目2. 算法思想3. 代码实现 四、 盛水最多的容器1. 题目2. 算法思想3. 代码实现 五、有效三角形的个数1. 题目2. 算法思想3. 代码实现 六、 和为 s 的两…

出国必备神器!这5款中英翻译工具让你秒变外语达人

在这个全球化的时代,中英互译已然成为我们日常生活和工作中不可或缺的一环。面对众多的翻译工具,如何选择一款既高效又人性化的翻译助手呢?今天,就让我为大家揭秘几款热门的中英互译工具,并分享我的使用感受。 一、福昕…

中广核CGN25届校招网申SHL测评题库、面试流程、招聘对象,内附人才测评认知能力真题

​中国广核集团校园招聘在线测评攻略🚀 🎓 校园招聘对象 2024届、2025届海内外全日制应届毕业生,大专、本科、硕士、博士,广核集团等你来! 📈 招聘流程 投递简历 简历筛选 在线测评(重点来啦…

用java编写飞机大战

游戏界面使用JFrame和JPanel构建。背景图通过BG类绘制。英雄机和敌机在界面上显示并移动。子弹从英雄机发射并在屏幕上移动。游戏有四种状态:READY、RUNNING、PAUSE、GAMEOVER。状态通过鼠标点击进行切换:点击开始游戏(从READY变为RUNNING&am…

详解Redis分布式锁在SpringBoot的@Async方法中没锁住的坑

背景 Redis分布式锁很有用处,在秒杀、抢购、订单、限流特别是一些用到异步分布式并行处理任务时频繁的用到,可以说它是一个BS架构的应用中最高频使用的技术之一。 但是我们经常会碰到这样的一个问题,那就是我们都按照标准做了但有时运行着、…

JavaEE之多线程进阶-面试问题

一.常见的锁策略 锁策略不是指某一个具体的锁,所有的锁都可以往这些锁策略中套 1.悲观锁与乐观锁 预测所冲突的概率是否高,悲观锁为预测锁冲突的概率较高,乐观锁为预测锁冲突的概率更低。 2.重量级锁和轻量级锁 从加锁的开销角度判断&am…

【Docker】03-自制镜像

1. 自制镜像 2. Dockerfile # 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["ja…

【强训笔记】day26

NO.1 思路&#xff1a;只需判断长度为2和3的回文子串。 代码实现&#xff1a; #include<iostream> #include<string>using namespace std;string s;int main() {cin>>s;int ns.size(),ret-1;for(int i0;i<n;i){if(i1<n&&s[i]s[i1]){ret2;}i…

笔试题总结

1.对于线性表的描述&#xff1a;存储空间不一定是连续&#xff0c;且各元素的存储顺序是任意的 2.虚函数的定义&#xff1a;函数的返回值参数不定&#xff0c; 声明&#xff1a; 类型&#xff0c;返回这类型 名字&#xff08;&#xff09;&#xff1b; 例如声明一个虚函数&a…

57.对称二叉树

迭代 class Solution {public boolean isSymmetric(TreeNode root) {if(rootnull){return true;}Deque<TreeNode> denew LinkedList<>();TreeNode l,r;int le;de.offer(root.left);de.offer(root.right);while(!de.isEmpty()){lde.pollFirst();rde.pollLast();if(…

二、图解C#教程

一、方法 {}块&#xff0c;里面的是方法体 二、Var关键字 推断出等号右边的实际类型 三、局部常量 1、声明时必须初始化 2、声明后不能改变