基于GAN的图像水印去除器,效果堪比PS高手
作者 | 李翔
转载自视说AI(ID:techtalkai)
简介:李翔,国内某互联网大厂AI民工,前携程酒店图像技术负责人,计算机视觉和深度学习重度爱好者,在ICCV和CVPR等会议上发表论文十余篇。
写在前面
当前互联网飞速发展,越来越多的公司、组织和个人都选择在网上展示和分享图像。为了保护图像版权,大家都会选择在图像上打上透明或者半透明的水印。随着水印被广泛地使用,针对水印的各种处理技术也在不断发展,如何有效去除图像上的水印引发了越来越多人的研究兴趣。
今天的文章中,我们会介绍一种更为强大的水印去除器。这次我们借助生成对抗网络来实现,进一步提升水印去除器的性能,从而达到更为理想的去除效果。
生成对抗网络的前世今生
生成对抗网络(Generative Adversarial Networks,GAN),是由Ian Goodfellow等人在2014年首次提出。一般来说,生成对抗网络由两部分组成:生成器(Generator)和判别器(Discriminator)。生成器通过接收输入数据,学习训练数据的分布来生成目标数据。判别器通常是一个二分类模型,用来判别生成器生成数据的真假性。
我们可以将生成器和判别器看作互相对抗的双方,生成器的目的是令生成的数据尽可能的真实,让判别器无法区分真假;而判别器的目的是尽可能地识别出生成器生成的数据。在生成对抗网络的训练过程中,上面的对抗场景会持续进行,生成器和判别器的能力都得到了不断提升。训练的过程可以用如下公式表示:
其中G和D分别表示生成器和判别器,x为真实数据,z是生成器的输入数据。最后训练结束我们就可以使用生成器来生成以假乱真的数据。一个直观的生成对抗网络结构如下图所示。
生成对抗网络近些年被大量应用于计算机视觉领域,根据具体应用不同可以分为图像生成和图像转换两种类型的任务。图像生成可以看成是一种学后联想任务,其中的代表是图像自动生成模型(DCGAN),网络结构如下图所示。这类任务只给出我们希望生成的目标图像,此时生成器的输入是服从某一分布的噪声,通过和判别器的对抗训练,将其转换成目标图像的数据分布。
图像转换可以看成是一种目标引导任务,其中的代表是图像超分辨率模型(SRGAN),SRGAN的网络结构如下图所示。这类任务除了给出我们希望生成的目标图像外,还会给出转换前的原始图像,此时生成器的输入变为原始图像,生成器在和判别器的对抗训练过程中还要同时保证生成的图像和目标图像尽可能的相近。
生成对抗网络的发展非常迅速,近些年出现了各式各样GAN的变种,例如在训练上优化的WGAN和LSGAN,通过对输入添加条件限制来引导学习过程的Conditional GAN,图像生成任务中的BigGAN和StyleGAN,图像转换任务中的Pixel2Pixel和CycleGAN等等。期待未来生成对抗网络在计算机视觉领域给我们带来更多的惊喜。
生成对抗网络 vs 图像水印
上一节中我们介绍了生成对抗网络的核心思想和一些应用,现在我们尝试将生成对抗网络用于图像的水印去除。去水印的目的是将带水印的图像转变为无水印的图像,这本质上也是一种图像转换任务。
因此生成器的输入为带水印的图像,输出为无水印的图像;而判别器用于识别结果到底是原始真实的无水印图像,还是经过生成器生成的无水印图像。通过两者之间不断的对抗训练,生成器生成的无水印图像变得足够“以假乱真”,从而达到理想的去水印效果。
在实际的实践过程中,我们还做了一系列优化改进。下面我们分别介绍生成器和判别器的具体结构以及训练细节。在生成器的选择上,我们继续使用U-net网络结构,U-net通过在输入和输出之间添加跳跃连接,融合了低层级特征和高层级特征。与直接的编解码器结构相比,能够保留更多的图像背景信息,保证去除水印后的图像的真实性。
在判别器方面,我们使用了基于区域判别的全卷积网络。与传统的判别器直接输出整张图像的真假结果不同,我们通过对图像区域级别的判别,可以更好地对图像上的无水印和有水印部分进行区分。
此外,我们采用了Conditional GAN的思想,判别器在对原始真实的无水印图像和生成器生成的无水印图像进行区分的时候会加入带水印图像的条件信息,从而进一步提升生成器和判别器的学习性能。生成器和判别器的具体结构和细节如下图所示。
生成器生成的无水印图像除了要令判别器分辨不了真假之外,还需要保证和真实的无水印图像尽可能接近。为此我们组合一范数损失(L1 Loss)和感知损失(Perceptual Loss)作为内容损失,在生成器和判别器对抗的过程中加入训练。最终的损失函数为
其中的条件对抗损失为
最终我们使用生成器作为水印去除器实现图像上的水印去除。为了对比和单一全卷积网络实现的水印去除器的效果,我们可视化了一些去水印结果,左列是输入的水印区域,中间列是单一全卷积网络得到的无水印区域,右列是生成对抗网络得到的无水印区域。从可视化的结果可以看出,经过对抗训练后的生成器对水印的去除效果更优。
写在最后
图像水印去除问题吸引了越来越多人的研究兴趣,本篇文章介绍了如何利用生成对抗网络来实现水印自动去除。去水印研究的目的是为了验证水印的鲁棒性,更好地提升水印的反去除能力。如何设计一种AI去不掉的水印是一个极具挑战的问题,接下来我们会在这方面做一些尝试,希望能够为版权保护尽一份力。
参考资料:
[1] Towards photo-realistic visible watermark removal with conditional generative adversarial networks
[2] Image-to-image translation with conditional adversarial networks
[3] Photo-realistic single image super-resolution using a generative adversarial networ
(*本文为 AI科技大本营转载文章,转载请联系作者)
◆
精彩推荐
◆
参与投稿加入作者群,成为全宇宙最优秀的技术人~
大会开幕倒计时5天!
2019以太坊技术及应用大会特邀以太坊创始人V神与众多海内外知名技术专家齐聚北京,聚焦区块链技术,把握时代机遇,深耕行业应用,共话以太坊2.0新生态。即刻扫码,享优惠票价。
推荐阅读
6月技术福利限时免费领
2019年技术盘点容器篇(一):听UCloud谈风生水起的K8S | 程序员硬核评测
异类框架BigDL,TensorFlow的潜在杀器!
吐血总结!100个Python面试问题集锦(上)
5G 时代,微软又走对了一步棋!
LinkedIn最新报告: 区块链成职位需求增长最快领域, 这些地区对区块链人才渴求度最高……
写代码不严谨,我就不配当程序员?
碾压Bert?“屠榜”的XLnet对NLP任务意味着什么
如何向妹子解释:为啥 5G 来了需要换 SIM卡!

相关文章:

Flink最锋利的武器:Flink SQL入门和实战 | 附完整实现代码
作者 | 机智的王知无转载自大数据技术与架构(ID: import_bigdata)一、Flink SQL 背景Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。自 2015 年开始,阿里巴巴开始…

SQL SERVER中ROLLUP的用法
cube操作符 要使用cube,首先要了解group by 其实cube和rollup区别不太大,只是在基于group by 子句创建和汇总分组的可能的组合上有一定差别, cube将返回的更多的可能组合。如果在 group by 子句中有n个列或者是有n个表达式的话, s…

Mybait缓存机制
MyBatis同大多数ORM框架一样,提供了一级缓存和二级缓存的支持。 一级缓存:其作用域为session范围内,当session执行flush或close方法后,一级缓存会被清空。 二级缓存:二级缓存和一级缓存机制相同,但是可以自…

vs2008常用操作汇总
1、OpenCV2.1环境配置: (1)、Tools-->Options-->Projects and Solutions-->VCDrectories: Show directories for选择include files,加入目录 D:/Program Files/OpenCV2.1/include/opencv ;Show directories for选择libra…

深度学习已至“瓶颈”?英特尔:数据处理是一剂良药
【导读】霍金弟子Alan Yuille在前不久发表言论称,至少在计算机视觉领域,深度学习的瓶颈已至。然而,人工智能与大数据的发展相辅相成,数据将会推动人工智能的发展,促进更多技术应用落地,将人工智能带入一个新…

WIN32 C++ 遍历文件夹
转自:http://blog.csdn.net/lizhigang770/archive/2010/11/30/6045242.aspx 一、先介绍一个结构 WIN32_FIND_DATA typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; // 文件属性 FILETIME ftCreationTime; // 文件创建时间 FILETIME ft…

UIView淡入淡出动画
小小原创,转载请注明出处:http://iphone.xiaoxiaostudio.net 如果你觉得为某个UIView 加载一个全新的View在这个UIView上面时,想要隐藏时setHidden显得太突兀了,我们可以给它增加一些动画,iOS上默认提供了一些动画&…

sass的继承,混合宏,占位符的用法总结
SCSS中混合宏使用 mixin mt($var){ margin-top: $var; }.block { include mt(5px);span { display:block; include mt(5px); } }extend如何工作 .icon {transition: background-color ease .2s;margin: 0 .5em;}.error-icon {extend .icon;/*错误图标指定的样式... */}.info-i…

js中cookie的使用详细分析
2019独角兽企业重金招聘Python工程师标准>>> JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求。 cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript。可以由JavaScript对其进行控制&a…

从事JAVA 20年最终却败给了Python,哭了!
之前遇到一个老师,他从事Java行业20年了,在Python兴起的时候,他周围的其他同行们都在纷纷学习Python方面的知识,连他的学生也问他“老师,你为什么不学Python呢?”。当这位听到学生这个问题的时候࿰…

c++删除文件夹
转自:http://blog.csdn.net/sshhbb/archive/2010/12/07/6061029.aspx c语言本身是不能删除文件或文件夹的,他们是windows操作系统里的东西,所以得借助其api函数。 其一:使用shell 接口: void FileDelete(CString di…

解决bootstrap下的图片自适应问题
.img-responsive {display: block; height: auto; max-width: 100%; }转载于:https://www.cnblogs.com/qjuly/p/9809910.html

边缘检测、Hough变换、轮廓提取、种子填充、轮廓跟踪
转自:http://blog.sina.com.cn/s/blog_6c083cdd0100nm4s.html 7.1 边沿检测 我们给出一个模板 和一幅图象 。不难发现原图中左边暗,右边亮,中间存在着一条明显的边界。进行模板操作后的结果如下: 。 可以看出,第3…

JS Array 中 shift 和 pop 的妙用
在 JS Array 中支持两个方法,shift() 和 pop(),分别是指从一个数据中的最前面和最后面删除一个值,并返删除值。看一个示例就明白了: var arr [s,o,f,i,s,h]; arr.shift(); // 返回 s arr; // 目前是 [o,f,i,s,h…

当今主流分割网络有哪些?12篇文章一次带你看完
作者 | 孙叔桥来源 | 转载自有三AI(ID: yanyousan_ai)本文的12篇文章总结了当前主流的分割网络及其结构,涵盖从编解码结构到解码器设计;从感受野到多尺度融合;从CNN到RNN与CRF;从2D分割到3D分割;…

正确生成浮点型的方法,解决sqlachemy Float浮点型的坑,生成float类型时,长度和精度均为0,导致查询不到结果!...
问题描述 在使用flask_sqlachemy时,给price字段选择了Float类型,数据库用的mysql,生成数据库表后,发现 from sqlalchemy import Float,Column price Column(Float,default0.00) 虽然能存储float类型,结果如下 但是查询…

图像轮廓的提取和绘制
转自:http://blog.csdn.net/gnuhpc/archive/2009/06/18/4278105.aspx <>var ultimaFecha ; <>document.write(ultimaFecha); #include "highgui.h" #include "cv.h" #include <iostream> #include <iomanip> using …

上海交大张拳石:神经网络的可解释性,从经验主义到数学建模
作者 | 张拳石来源 | 转载自知乎Qs.Zhang张拳石本来想把题目取为“从炼丹到化学”,但是这样的题目太言过其实,远不是近期可以做到的,学术研究需要严谨。但是,寻找适当的数学工具去建模深度神经网络表达能力和训练能力,…
计算机网络模型到底是七层?五层?四层?
1.Introduction 本篇文章的初衷是在做Android网络开发时经常接触各种协议,比如HTTP、XMPP、HLS、RTSP、TCP等协议,对网络的模型和层次有个直观的了解可以做到心中有数。OSI参考模型是七层,TCP/IP模型是四层,计算机网络(…

【推荐】使用Ultrapico Expresso学习正则表达式
推荐理由Ultrapico Expresso是我工作中经常使用的一个非常强大的正则表达式构建、测试以及代码生成工具。它能够对你构建的正则表达式进行解析、验证,并输出解析结果,提供性能测试工具,支持C#、VB等代码生成,最重要的是࿰…

OpenCV中常用到的轮廓处理函数汇总
转自:http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm ApproxChains 用多边形曲线逼近 Freeman 链 CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage,int methodCV_CHAIN_APPROX_SIMPLE,double parameter0, int mi…

《Linux内核原理与分析》第二周作业
反汇编一个简单的C程序 1、实验要求 使用: gcc –S –o test.s test.c -m32 命令编译成汇编代码,对汇编代码进行分析总结。其中test.c的具体内容如下: int g(int x) {return x 3; }int f(int x) {return g(x); }int main(void) {return f(8)…

首次!腾讯全面公开整体开源路线图
6月25日,由Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会在上海举办,腾讯开源联盟主席、腾讯开源管理办公室委员、Apache Member堵俊平首次公开了腾讯整体的开源战略路线图。 堵俊平表示:“腾讯开源提倡‘开放、共享、合力…

201771010111李瑞红《面向对象的程序设计》第八周实验总结
实验八接口的定义与使用 实验时间 2018-10 理论部分 6.1 接口:用interface声明,是抽象方法和常量值定义的集 合。从本质上讲,接口是一种特殊的抽象类。 在Java程序设计语言中,接口不是类,而是对类 的一组需求描述,由常…

崛起的Python,真的影响了76万人?
随着AI的兴起,Python彻底火了。据Stack Overflow调研报告:Python的月活用户已超越了Java、成为第一,全民Python已为“大势所趋”。那么,程序员有必要学Python吗?如何高效掌握Python?程序员为啥要学Python&a…

OpenCV查找轮廓
转自:http://westice.javaeye.com/blog/721225 主要函数是 cvFindContours(tour_buf,storage,&contour,sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); tour_buf 是需要查找轮廓…

非阻塞socket的连接
引用自:http://blog.csdn.net/cccallen/article/details/6619994 连接套接字,阻塞的套接字超时时间很长无法接受,而是用非阻塞套接字时使用的方案也有多种。后者是个比较好的方法 方案1:不断重试,直到连接上或者超时&a…

OpenCV下车牌定位算法实现代码
转自:http://blog.csdn.net/heihei723/archive/2006/05/14/728046.aspx#FeedBack 车牌定位算法在车牌识别技术中占有很重要地位,一个车牌识别系统的识别率往往取决于车牌定位的成功率及准确度。 车牌定位有很多种算法,从最简单的来࿰…

2018-2019-1 20165310 20165315 20165226 实验一 开发环境的熟悉
2018-2019-1 20165226 20165310 20165315 实验一 开发环境的熟悉 目录 一、实验目的 二、实验步骤 三、实验过程中遇到的问题及解决 四、实验感想 一、实验目的 熟悉Linux开发环境并学会Linux开发环境的配置和使用,熟悉arm箱的使用,熟悉以下知识点&#…

上海居民被垃圾分类逼疯!这款垃圾自动分类器也许能帮上忙
作者 | 视说君来源 | 授权转载自视说AI(ID:techtalkai)让垃圾自动分类近期垃圾分类成为了一个热门话题,原来直接一次性扔掉的垃圾,现在都需要分门别类进行投放。从今年7月1日起,新的《上海市生活垃圾管理条例》正式开始…