基于深度学习的低光照图像增强方法总结(2017-2019)| CSDN博文精选
扫码参与CSDN“原力计划”
之前在做光照对于高层视觉任务的影响的相关工作,看了不少基于深度学习的低光照增强(low-light enhancement)的文章[3,4,5,7,8,9,10],于是决定简单梳理一下。
光照估计(illumination estimation)和低光照增强(low-light enhancement)的区别:光照估计是一个专门的底层视觉任务(例如[1,2,6]),它的输出结果可以被用到其它任务中,例如图像增强、图像恢复(处理色差,白平衡)。而低光照增强是针对照明不足的图像存在的低亮度、低对比度、噪声、伪影等问题进行处理,提升视觉质量。值得一提的是,低光照增强方法有两种常见的模式,一种是直接end-to-end训练,另一种则包含了光照估计。
这篇文章应该是比较早的用深度学习方法完成低光照增强任务的文章,它证明了基于合成数据训练的堆叠稀疏去噪自编码器能够对的低光照有噪声图像进行增强和去噪。模型训练基于图像块(patch),采用sparsity regularized reconstruction loss作为损失函数。
主要贡献如下:
(1)我们提出了一种训练数据生成方法(即伽马校正和添加高斯噪声)来模拟低光环境。
(2)探索了两种类型的网络结构:(a) LLNet,同时学习对比度增强和去噪;(b) S-LLNet,使用两个模块分阶段执行对比度增强和去噪。
(3)在真实拍摄到的低光照图像上进行了实验,证明了用合成数据训练的模型的有效性。
(4)可视化了网络权值,提供了关于学习到的特征的insights。
MSR-net:Low-light Image Enhancement Using Deep Convolutional Network(2017 arXiv)
这篇文章引入了CNN,它提了一个有趣的观点,传统的multi-scale Retinex(MSR)方法可以看作是有着不同高斯卷积核的前馈卷积神经网络,并进行了详细论证。
接着,仿照MSR的流程,他们提出了MSR-net,直接学习暗图像到亮图像的端到端映射。MSR-net包括三个模块:多尺度对数变换->卷积差分->颜色恢复,上面的结构图画得非常清楚了。
训练数据采用的是用PS调整过的高质量图像和对应的合成低光照图像(随机减少亮度、对比度,伽马校正)。损失函数为带正则项的误差矩阵的F-范数平方,即误差平方和。
Learning a Deep Single Image Contrast Enhancer from Multi-Exposure Images(2018 TIP)
这篇文章其实主要关注单图像对比度增强(SICE),针对的是欠曝光和过曝光情形下的低对比度问题。其主要贡献如下:
(1)构建了一个多曝光图像数据集,包括了不同曝光度的低对比度图像以及对应的高质量参考图像。
(2)提出了一个两阶段的增强模型,如上图所示。第一阶段先用加权最小二乘(WLE)滤波方法将原图像分解为低频成分和高频成分,然后对两种成分分别进行增强;第二阶段对增强后的低频和高频成分融合,然后再次增强,输出结果。
对于为什么要设计两阶段结构,文章中是这样解释的:单阶段CNN的增强结果并不令人满意,且存在色偏现象,这可能是因为单阶段CNN难以平衡图像的平滑成分与纹理成分的增强效果。
值得一提的是,模型第一阶段的Decomposition步骤采用的是传统方法,而后面介绍的Retinex-Net使用CNN实现了。
Deep Retinex Decomposition for Low-Light Enhancement(2018 BMVC)
这篇文章是我前后读过许多遍,比较值得介绍。受Retinex理论的启发,它采用了两阶段式的先分解后增强的步骤,完全采用CNN实现。对于Decom-Net的训练,引入了反射图一致性约束(consistency of reflectance)和光照图平滑性约束(smoothness of illumination),非常容易复现,实验效果也不错。
主要贡献如下:
(1)构建了paired的低光照/正常光照数据集LOL dataset,应该也是第一个在真实场景下采集的paired dataset.该数据集分为两部分:真实场景的图像数据是通过改变相机感光度和曝光时间得到的;合成的图像数据是用Adobe Lightroom接口调节得到的,并且调节后图像的Y通道直方图必须尽可能地接近真实低光照场景。
(2)提出了Retinex-Net,它分为两个子网络:Decom-Net能够对图像进行解耦,得到光照图和反射图;Enhance-Net对前面得到的光照图进行增强,增强后的光照图和原来的反射图相乘就得到了增强结果。另外,考虑到噪声问题,采用一种联合去噪和增强的策略,去噪方法采用BM3D。
(3)提出一个structure-aware total variation constraint,就是用反射图梯度作为权值对TV loss进行加权,从而在保证平滑约束的同时不破坏纹理细节和边界信息。
MBLLEN: Low-light Image/Video Enhancement Using CNNs(2018 BMVC)
这篇文章的核心思想是,网络中不同层次的特征的提取和融合。此外,该文的另一个亮点是针对视频的低光照增强网络,和一帧一帧处理的直接做法不同,它们使用3D卷积对网络进行了改进,有效提升了性能。
补充说明一下,视频的低光照增强会存在的一种负面情况,闪烁(flickering),即帧与帧之间可能存在不符合预期的亮度跳变。这一问题可以用AB(avr)指标(即平均亮度方差)来度量。
网络结构:包括特征提取模块FEM、增强模块EM和融合模块FM。FEM是有10层卷积的单流向网络,每层的输出都会被输入到各个EM子模块中分别提取层次特征。最终这些层次特征被拼接到一起并通过1x1卷积融合得到最终结果。为了用于视频增强,还需要对网络进行修改,具体可参考原文。
损失函数:本文不采用常规的MSE或者MAE损失,而是提了一个新的损失函数,包括三个部分,即结构损失、内容损失和区域损失。结构损失采用SSIM和MS-SSIM度量相结合的形式;内容损失,就是VGG提取的特征应该尽可能相似;区域损失令网络更关注于图像中低光照的区域。
Learning to See in the Dark(2018 CVPR)
传统成像系统的pipeline
提出的新成像系统
这篇文章主要关注于极端低光条件和短时间曝光条件下的图像成像系统,它用卷积神经网络去完成Raw图像到RGB图像的处理,实验效果非常惊艳。
网络结构基于全卷积网络FCN,直接通过端到端训练,损失函数采用L1 loss。此外,文章提出了See-in-the-Dark数据集,由短曝光图像及对应的长曝光参考图像组成。
Kindling the Darkness: A Practical Low-light Image Enhancer
(2019 arXiv)
这篇文章在今年5月份挂到了arXiv上,干货挺多,据称是state-of-the-art。它提出了低光照增强任务存在的三个难点:
(1) 如何有效的从单张图像中估计出光照图成分,并且可以灵活调整光照level?
(2) 在提升图像亮度后,如何移除诸如噪声和颜色失真之类的退化?
(3) 在没有ground-truth的情况下,样本数目有限的情况下,如何训练模型?
这篇文章的增强思路还是沿用了Retinex-Net的decomposition->enhance的两阶段方式,网络总共分为三个模块:Decomposition-Net、Restoration-Net和Adjustment-Net,分别执行图像分解、反射图恢复、光照图调整。一些创新点如下:
(a)对于Decomposition-Net,其损失函数除了沿用Retinex-Net的重构损失和反射图一致损失外,针对光照图的区域平滑性和相互一致性,还增加了两个新的损失函数。
(b)对于Restoration-Net,考虑到了低光照情况下反射图往往存在着退化效应,因此使用了良好光照情况下的反射图作为参考。反射图中的退化效应的分布很复杂,高度依赖于光照分布,因此引入光照图信息。
(c)对于Adjustment-Net,实现了一个能够连续调节光照强度的机制(将增强比率作为特征图和光照图合并后作为输入)。通过和伽马校正进行对比,证明它们的调节方法更符合实际情况。
参考文献
[1] Shi, W., Loy, C. C., & Tang, X. (2016). Deep Specialized Network for Illuminant Estimation. ECCV, 9908, 371–387. https://doi.org/10.1007/978-3-319-46493-0
[2] Guo, X., Li, Y., & Ling, H. (2017). LIME: Low-light image enhancement via illumination map estimation. IEEE Transactions on Image Processing, 26(2), 982–993. https://doi.org/10.1109/TIP.2016.2639450
[3] Lore, K. G., Akintayo, A., & Sarkar, S. (2017). LLNet: A deep autoencoder approach to natural low-light image enhancement. Pattern Recognition, 61, 650–662. https://doi.org/10.1016/j.patcog.2016.06.008
[4] Shen, L., Yue, Z., Feng, F., Chen, Q., Liu, S., & Ma, J. (2017). MSR-net:Low-light Image Enhancement Using Deep Convolutional Network. ArXiv. Retrieved from http://arxiv.org/abs/1711.02488
[5] Cai, J., Gu, S., & Zhang, L. (2018). Learning a Deep Single Image Contrast Enhancer from Multi-Exposure Images. IEEE Transactions on Image Processing, 1(c), 1–14. Retrieved from http://www4.comp.polyu.edu.hk/~cslzhang/paper/SICE.pdf
[6] Gao, Y., Hu, H. M., Li, B., & Guo, Q. (2018). Naturalness preserved nonuniform illumination estimation for image enhancement based on retinex. IEEE Transactions on Multimedia, 20(2), 335–344. https://doi.org/10.1109/TMM.2017.2740025
[7] Chen, C., Chen, Q., Xu, J., & Koltun, V. (2018). Learning to See in the Dark. CVPR, 3291–3300. https://doi.org/10.1109/CVPR.2018.00347
[8] Lv, F., Lu, F., Wu, J., & Lim, C. (2018). MBLLEN: Low-light Image/Video Enhancement Using CNNs. BMVC, 1–13.
[9] Wei, C., Wang, W., Yang, W., & Liu, J. (2018). Deep Retinex Decomposition for Low-Light Enhancement. BMVC, (61772043). Retrieved from http://arxiv.org/abs/1808.04560
[10] Zhang, Y., Zhang, J., & Guo, X. (2019). Kindling the Darkness: A Practical Low-light Image Enhancer. ArXiv, 1–13. Retrieved from http://arxiv.org/abs/1905.04161
扫码查看原文
▼▼▼
(*本文为AI科技大本营转载文章,转载请联系原作者)
◆
精彩推荐
◆
开幕倒计时10天|2019 中国大数据技术大会(BDTC)即将震撼来袭!豪华主席阵容及百位技术专家齐聚,十余场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读。6.6 折票限时特惠(立减1400元),学生票仅 599 元!
高三学生发表AI论文,提出针对网络暴力问题的新模型AdaGCN
15篇论文全面概览BERT压缩方法
敲代码月薪 4 万?真相使我差点丢了性命!
这段 Python 代码让程序员赚 300W,公司已确认!网友:神操作!
2097352GB地图数据,AI技术酷炫渲染,《微软飞行模拟器》游戏即将上线
用Go重构C语言系统,这个抗住春晚红包的百度转发引擎承接了万亿流量
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
看完这篇还不了解Nginx,那我就哭了!
网易患病员工被保安赶出公司,程序员该如何应对中年危机?
2019 年,C# 还值得学习吗?
区块链世界里不能信什么?
你点的每个“在看”,我都认真当成了AI
相关文章:

ios多线程和进程的区别(转载)
很想写点关于多进程和多线程的东西,我确实很爱他们。但是每每想动手写点关于他们的东西,却总是求全心理作祟,始终动不了手。 今天终于下了决心,写点东西,以后可以再修修补补也无妨。 一.为何需要多进程(或者…

OC封装的轮播图-只用调用即可
先来使用方法 1.//创建显示本地图片view UIView *imageScorll[WTImageScroll ShowLocationImageScrollWithFream:CGRectMake(0, 0, SCREENWIDTH, 200) andImageArray:array andBtnClick:^(NSInteger tagValue) { NSLog("点击的图片----%",(tagValue)); self.didSele…
多核时代,并行编程为何“臭名昭著”?
作者 | Yan Gu来源 | 转载自知乎用户Yan Gu【导读】随着计算机技术的发展,毫无疑问现代计算机的处理速度和计算能力也越来越强。然而细心的同学们可能早已注意到,从2005年起,单核的 CPU 性能就没有显著的提升了。究其原因,是人们发…

Linux下获取usb视频设备vendor id和product id的8种方法
在使用usb摄像头获取视频时,有时需要获取此摄像头供应商ID(vendor id, vid)和产品ID(product id, pid),这里在Linux下提供获取vid和pid的8种方法: 1. 通过v4l2中结构体v4l2_capability的成员变量card:此变量中会包含设备名、vid、…

JAVA 设计模式 模板方法模式
定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代…
这类程序员成华为宠儿,分分钟秒杀众应届毕业生
近日,华为20亿奖励员工的新闻频频刷屏。其中20亿奖金不是面向所有的华为员工,20亿奖金包涉及到的是研发体系、造AI芯片和建设生态的员工。从5G开始部署以来,华为获得了来自全球各地运营商的订单,签订了40多个5G商用合同。另外华为…

Swift 使用CoreLocation获取定位与位置信息
大多数情况下APP会在开启应用的时候获取当前的位置,所以我写在APPDelegate里第一步 import CoreLocationvar locationManager CLLocationManager() 第二步func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: …

FFmpeg在Windows上设置dshow mjpeg编码+libyuv解码显示测试代码
之前在https://blog.csdn.net/fengbingchun/article/details/103444891中介绍过在Windows上通过ffmpeg dshow设置为mjpeg编解码方式进行实时显示的测试代码。这里测试仅调用ffmpeg的mjpeg编码接口,获取到packet后,通过libyuvlibjpeg-turbo对mjpeg进行解码…

转:浅谈Linux的内存管理机制
一 物理内存和虚拟内存 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。 物理内存就是系统硬件提…

swift3.0阿里百川反馈
闲言少叙 直接上不熟 1.导入自己工程阿里百川demo中的Util文件,并引用其中的头文件 2.剩余就是swift3.0代码.在自己需要的地方书写 (前提是你已经申请了APPKey) 3.代码 //调用意见反馈 func actionOpenFeedback(){ //key self.appKey "此处填写自己申请的key" s…
通俗易懂:8大步骤图解注意力机制
作者 | Raimi Karim译者 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】这是一份用图片和代码详解自注意力机制的指南,请收好。BERT、RoBERTa、ALBERT、SpanBERT、DistilBERT、SesameBERT、SemBERT、MobileBERT、TinyBERT和CamemBERT的共同…

Windows上VS2017单步调试FFmpeg源码的方法
之前在https://blog.csdn.net/fengbingchun/article/details/90114411 介绍过如何在Windows7/10上通过MinGW方式编译FFmpeg 4.1.3源码生成库的步骤,那时只能生成最终的库,却不能产生vs工程,无法进行单步调试。GitHub上有个项目ShiftMediaProj…

ormlite 多表联合查询
ormlite 多表联合查询 QueryBuilder shopBrandQueryBuilder shopBrandDao.queryBuilder(); QueryBuilder shopQueryBuilder shopDao.queryBuilder();Where shopBrandWhere shopBrandQueryBuilder.where(); shopBrandWhere .eq(ShopBrand.SHOP_NO, shopNo);Where shopWhere …

C++中关键字volatile和mutable用法
C/C中的volatile关键字和const对应,用来修饰变量,用于告诉编译器该变量值是不稳定的,可能被更改。使用volatile注意事项: (1). 编译器会对带有volatile关键字的变量禁用优化(A volatile specifier is a hint to a compiler that …
基于生成对抗网络(GAN)的人脸变形(附链接) | CSDN博文精选
扫码参与CSDN“原力计划”翻译 | 张一豪校对 | 吴金笛来源 | 数据派THU*点击阅读原文,查看「CSDN原力计划」详细说明。本文详细介绍了生成对抗网络(GAN)的知识,并用其变换人脸,并探寻如何利用StyleGAN生成不同属性&…

Jmeter连接Oracle数据库
一、Jmeter要连接oracle数据库,就必须复制JDBC驱动jar包文件ojdbc14.jar到Jmeter的lib目录下二、进入Jmeter的bin目录运行Jmeter.bat,启动Jmeter三、Jmeter软件配置如下:1、添加线程组右击线程组,选择“添加--配置元件--JDBC Conn…

swift3.0友盟分享
经过(一)的讲解,大家应该可以按照友盟提供的测试账号可以集成友盟分享了,友盟目前集合了18个APP共27种分享,可以授权的有10个App:微信、QQ、新浪微博、腾讯微博、人人网、豆瓣、Facebook、Twitter、Linkedi…

C++11中std::future的使用
C11中的std::future是一个模板类。std::future提供了一种用于访问异步操作结果的机制。std::future所引用的共享状态不能与任何其它异步返回的对象共享(与std::shared_future相反)( std::future references shared state that is not shared with any other asynchronous retur…
给算法工程师和研究员的「霸王餐」| 附招聘信息
现在的算法工程师真的是太难了!要让AI会看人眼都分辨不清的医疗影像!数据又不够,还得用前沿技术!好不容易学会看片,还要让AI会分析病理!然后模型搞出来了,还要把几十种模型,做N次计算…

swift3.0三种反向传值
一 :通知 1.通知传值所用方法 // MARK: - private methods(内部接口) let NotifMycation NSNotification.Name(rawValue:"MyNSNotification") func tempbuttonAction() { //这个方法可以传一个值 NotificationCenter.default.post(name: NotifMycation, object: &q…

C++11中std::shared_future的使用
C11中的std::shared_future是个模板类。与std::future类似,std::shared_future提供了一种访问异步操作结果的机制;不同于std::future,std::shared_future允许多个线程等待同一个共享状态;不同于std::future仅支持移动操作…
聊聊抖音、奈飞、Twitch、大疆、快手、B站的多媒体关键技术
随着5G牌照发放,5G终端正在迎来集中上市潮,对于5G带来的变革一触即发。目前互联网上超过七成的流量来自多媒体,未来这个比例将超过八成。音视频就像空气和水一样普及,深度到每个人的生活和工作中。同时,深度学习技术则…

Linux安全事件应急响应排查方法总结
Linux安全事件应急响应排查方法总结 Linux是服务器操作系统中最常用的操作系统,因为其拥有高性能、高扩展性、高安全性,受到了越来越多的运维人员追捧。但是针对Linux服务器操作系统的安全事件也非常多的。攻击方式主要是弱口令攻击、远程溢出攻击及其他…

C++11中std::packaged_task的使用
C11中的std::packaged_task是个模板类。std::packaged_task包装任何可调用目标(函数、lambda表达式、bind表达式、函数对象)以便它可以被异步调用。它的返回值或抛出的异常被存储于能通过std::future对象访问的共享状态中。 std::packaged_task类似于std::function,…

Swift3.0和OC桥接方法
1.直接在工程中commandn,出现如图,点击Header File创建桥接文件Bridging-Header.h,如图: 2.点击next,出现如图画面,一定要记得勾选第一项,再点击create创建完成。 3.配置桥接文件,点击target - …

量子算命,在线掷筊:一个IBM量子云计算机的应用实践,代码都有了
整理 | Jane 出品| AI科技大本营(ID:rgznai100) “算命”,古今中外,亘古不衰的一门学问,哪怕到了今天,大家对算命占卜都抱着一些”敬畏“的信任心理,西方流行塔罗牌,国…

rails应用ajax之二:使用rails自身支持
考虑另一种情况: 1. 页面上半部分显示当前的所有用户,页面下半部分是输入新用户的界面; 2. 每当输入新用户时,页面上半部分会动态更新新加用户的内容; 我们还是用ajax实现,不过这次用rails内部对ajax的支持…

C++11中std::async的使用
C11中的std::async是个模板函数。std::async异步调用函数,在某个时候以Args作为参数(可变长参数)调用Fn,无需等待Fn执行完成就可返回,返回结果是个std::future对象。Fn返回的值可通过std::future对象的get成员函数获取。一旦完成Fn的执行&…
BAT数据披露:缺人!110万AI人才缺口,两者矛盾,凉凉了!
人工智能到底有多火?近日国内首份《BAT人工智能领域人才发展报告》新鲜出炉,此次报告是针对国内人工智能领域的人才争夺情况进行了梳理。并把研究对象锁定在BAT三大巨头的身上。来源:《BAT人工智能领域人才发展报告》其中得出最为核心的结论&…

swift3.0最新拨打电话方法
let alertVC : UIAlertController UIAlertController.init(title: "是否拨打报警电话:10086", message: "", preferredStyle: .alert) let falseAA : UIAlertAction UIAlertAction.init(title: "取消", style: .cancel, handler: nil) let tr…