dnf90审判流圣骑士骑士大家看看可以C么

这样的装备可以玩审判主C么,值得抚摸打孔么【dnf圣骑士吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:902,242贴子:
这样的装备可以玩审判主C么,值
这样的装备可以玩审判主C么,值得抚摸打孔么
听说改版手镯加的是技能攻击力
然后有冰雪套
好好当吉祥物光环,不要胡思乱想
贴吧热议榜
使用签名档&&
保存至快速回贴【图片】有没有审判奶打卢克C了,进来看看我奶爸行不行【dnf圣骑士吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:902,242贴子:
有没有审判奶打卢克C了,进来看看我奶爸行不行
1号店网上商城,优选全球千万品质商品,网购当然选1号店!网上超市1号店,省钱省力省时间!
RP太差,全身4=1,只能玩强散了,大神看看我能不能打打C?(实在想装逼啊),100级弗曼18秒还过得去?
妈的智障,我凌晨1点多发帖,有没夜猫子进来顶贴啊
魔战四等一
求加点 老哥
如克国服单人首杀是广东三的天域审判,比那些大红狗还要早首杀
加点在这,不过建议你别学我,可以把二觉舍出来点其他的,比如45和双墙
伤害比我天御套还高
散搭伤害基本够了,cd有点难受
居然比我的天御伤害还高,害怕
cd会比较难受,还有伤害可能不足最后我说一句罩子在卢克稳
哇,好东西
我也觉得二觉没有卵用
90板甲腰带简直逆天 赤裸裸的400多体力
这伤害略吃力
伤害不行。真的。
魔能咋开的,今天出个荒古
问一下,你们为啥不加武器祝福?我命中不够
改版了 真不知道是好还是不好
buff装备弄的很好了却不能用了
单刷真不知咋样
安图恩吧,说卢克还是差太多了
怎么没有鲅鱼
不能,伤害太低了
哪来的坟帖,赶快埋了
贴吧热议榜
使用签名档&&
保存至快速回贴b站萌新,打卢克么我打c投稿:6粉丝:111分享--dynmicweibozoneqqbaidu将视频贴到博客或论坛视频地址复制Flash代码复制Html代码复制微信扫一扫分享收藏0硬币--稍后看马克一下~用手机看转移阵地~用或其他应用扫描二维码手机下视频请使用扫码若未安装客户端,可直接扫此码下载应用看过该视频的还喜欢miniOFF&p&&b&全自动区分计算机和人类的公开图灵测试&/b&(&b&C&/b&ompletely &b&A&/b&utomated &b&P&/b&ublic &b&T&/b&uring test to tell &b&C&/b&omputers and &b&H&/b&umans &b&A&/b&part,简称&b&CAPTCHA&/b&)&/p&&p&&br&&/p&&p&说白了就是个验证码&/p&
全自动区分计算机和人类的公开图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA) 说白了就是个验证码
&figure&&img src=&https://pic2.zhimg.com/v2-edda3bd6aa_b.jpg& data-rawwidth=&690& data-rawheight=&462& class=&origin_image zh-lightbox-thumb& width=&690& data-original=&https://pic2.zhimg.com/v2-edda3bd6aa_r.jpg&&&/figure&&h2&&b&NULL&/b&&/h2&&p&在理论上,理论和实践是一致的。在实践中,呵呵。&/p&&p&——(应该是)爱因斯坦(说的)&/p&&blockquote&INFO:本文中不会出现公式,请放心阅读&/blockquote&&h2&&b&AES 256被破解了?&/b&&/h2&&p&对于TLNR(Too Long, Not Read)的读者来说,先把答案放在这:是的,但也不尽然。&/p&&p&事件回顾如下:前几日在互联网上转发的一条题为“AES 256加密被破 一套1500元设备5分钟内搞定”的新闻引起了各界的关注。新闻在国内各大媒体转载,热门评论里不乏各种被高赞但实际上并不正确的说法:有说是字典攻击无线信号,和破解AES是两回事的,也有所是根据无线电特性来攻击的,和AES没关系的。还有想搞个大新闻的媒体直接说是路由器被破解,甚至还说成了5分钟破解任何WiFi密码的,唯恐天下不乱。&/p&&p&实际上这次的破解来自Fox-IT [1],确实攻击了AES算法本身,利用了电磁辐射泄露的信息,可以实现无线攻击(隔墙有耳)。&b&这样的攻击形式称为旁路攻击(Side Channel Attack)&/b&,在学术界和工业界已经研究了20多年,是一种较为系统完善的攻击方法,此次攻破AES256的方法是利用电磁旁路信号来完成差分功耗分析(DPA),获取了密钥。从介绍本身来看,是一个很不错的工作,但不是AES首次被破解,AES 128早就可以用类似的方式破解,AES 256在DPA看来,和前者没有本质差异,在实验室中早已破解。当然也做不到5分钟破解任何WiFi密码。原因是SCA需要一定的物理条件,目前AES算法本身还是安全的,不必惊慌过度。&/p&&h2&&b&背景知识&/b&&/h2&&p&以AES为例,AES是高级加密标准Advanced Encryption Standard的缩写,是美国联邦政府采用的一种分组加密标准,也是目前分组密码实际上的工业标准。AES广泛使用在各个领域(当然包括WiFi的加密过程),实际上目前主流的处理器中广泛包含了AES的硬件加速器(低至售价几美元的STM32中有CRYP [2],高至售价上千美元的Intel CPU中有AES-NI [3])。对于这样一个成熟的密码学标准,密码算法本身设计的十分完善,传统的差分分析,线性分析等方法基本上不能在有限复杂度内完成,AES在理论上是安全的。但是正如本文标题描述的那样,&b&即便有绝对安全的算法,也做不到绝对安全的系统。&/b&唯物辩证法中有联系的普遍性和多样性原理,现代密码系统在设计上理论安全,并不能替代密码系统的实现安全性。攻击者可以在不干扰密码芯片运行的前提下,观测时间,功耗,电磁辐射等旁路泄露,然后结合算法的实现进行密钥还原,实现所谓的旁路攻击。对于旁路攻击的防御,涉及到密码算法实现安全性这一范畴,很显然,这次攻击成功的AES 256,表明实现安全性的研究还有很长的路要走。&/p&&p&这里简要介绍一下AES算法。AES算法包含了多个轮,每一轮(除了最后一轮)中,都有4个步骤[4][5]:&/p&&p&(1)AddRoundKey—矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。&/p&&p&(2)SubBytes—通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。&/p&&p&(3)ShiftRows—将矩阵中的每个横列进行循环式移位。&/p&&p&(4)MixColumns—为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-465b74b2cd9304ba9cbd9a_b.jpg& data-rawwidth=&258& data-rawheight=&579& class=&content_image& width=&258&&&/figure&&blockquote&AES流程图&/blockquote&&p&接下来留意2个数字,2^256(2的256次方)和是整个密钥空间,这是一个相当大的数字,表明如果要一个一个猜密钥,需要这么多次才能确保猜对,这个数太大了,所以没法猜,暴力破解不可取。&/p&&p&但如果是猜8192次呢,这个数字对于计算机来说就完全可以接受了。怎么猜才能在8192次中猜对呢。信息论告诉我们,必须有额外的信息输入。简言之就是分治的思想:一个一个猜。256 bits的密钥,也就是32个Bytes,如果逐字节猜,每个字节有256种可能,32个字节需要256*32 = 8192次猜测就可以了。&/p&&p&而芯片工作受限于位宽和算法实现,是不会一次完成整个256bits密钥的处理的,正如饭要一口一口吃,数据也是逐字节处理的,这就给我们我们逐字节猜提供了实现依据。&/p&&p&本次旁路分析依然按惯例关注其中的非线性环节SubBytes。所谓的非线性替换函数,在实现中就是一个查表操作。查表操作的输出(S-box output)是攻击点。当然算法的优化会合并一些操作以提高运算速度,这里攻击者可以偷着乐。原因是虽然优化需要做大量的工作,但实际上,最终结果还是查表,查较大的表和较小的表,在旁路攻击中没有实质的区别。AES 128和256的区别也是轮数,密钥长度的区别,查表操作本身是没有本质变化的(划重点)。&/p&&p&接下来用一张关系图来说明各要素的关联。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-8dcbb84a61cb0476d11c_b.jpg& data-rawwidth=&554& data-rawheight=&91& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic1.zhimg.com/v2-8dcbb84a61cb0476d11c_r.jpg&&&/figure&&p&AES的输入是密钥和明文,对于攻击者来说,明文已知,密钥未知,也是分析目标。&/p&&p&接下来初始密钥和明文会进行一个异或操作(首次AddRoundKey),得到的值,作为查表索引输入,进行查表操作,注意到查表的数据是和密钥和明文的异或有关的。而明文已知,查找表本身固定已知,异或运算又是简单的可逆运算,所以可以认为查表的输出和密钥有关。查表操作在现代计算机体系结构中是一次访存操作,那么,地址和数据都会出现在总线上。如果能知道总线上是什么数据,就可以简单的反推出密钥。接下来考虑总线是什么?低频上看是导线,射频上看是天线,对于安全分析人员来说,天线都是个好东西。高速数字电路的信号翻转,包含了丰富的频谱分量,会辐射到芯片外部。理论上能准确探测到这样的辐射,就能完成攻击了,so easy。&/p&&p&当然,在实践中,呵呵。&/p&&p&&b&问题一方面出在测量精度上。&/b&实际上我们并不能如此高精度地测量电磁辐射。我们可以测量的是电磁辐射的相对高低。例如1根导线上信号翻转和8根导线上信号一起翻转,就有明显的信号强度差异。这里涉及到一个术语称为泄露模型(model of leakage),描述泄露的情况。这次攻击使用了Hamming distance模型,也就是说信号跳变程度是可以观测的,这在电磁旁路分析中也是较为常见的建模方式。&/p&&p&&b&问题另一方面出在信噪比。&/b&(即便用上雅鲁藏布江的水电),环境中始终有大量的干扰,提高信号质量的方式是多次测量,然后通过相关性分析的方法提取统计上的最大相关性。&/p&&p&还有一些问题限于篇幅这里不展开,反正DPA都很巧妙地解决了:&/p&&p&(1)首先输入一个明文,在加密过程中,明文会和密钥的第i个字节异或,输入到查找表中查表,查表结果会出现在总线上,然后产生电磁辐射。这个过程是真实物理发生的,在此期间使用硬件记录这个电磁辐射。&/p&&p&(2)分析软件模拟计算过程(1),当然因为不知道密钥的第i个字节具体数值,每一种可能都要算,利用泄露模型计算256个模拟的电磁辐射相对值。&/p&&p&(3)变换不同的明文重复(1)和(2)的过程,得到N次结果。一共有N个实际测量值和N*256个计算值。&/p&&p&(4)使用相关性分析的方法,比对这256种猜测中,和实际测量值相关性最大的猜测值,就是实际上密钥的第i个字节真实值。&/p&&p&(5)重复(1)到(4),分别猜测32个密钥字节,得到完整密钥。&/p&&p&以上就是电磁/功耗差分分析的主要流程(通俗版)。由于密码芯片在加密过程中,是逐字节处理的,而处理每个字节的时候,都会有电磁信息的泄露,给了攻击者逐字节猜测的机会,从而可以在前文提到的8192次猜测中完成破解。实际分析中,还会遇到很多的困难,接下来看看Fox-IT的专家是怎么完成这次攻击的。&/p&&h2&&b&实战&/b&&/h2&&p&以下是Fox-IT的专家给出的攻击流程。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-ee584a93fa8f_b.jpg& data-rawwidth=&554& data-rawheight=&297& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic3.zhimg.com/v2-ee584a93fa8f_r.jpg&&&/figure&&p&首先使用射频采集设备采集目标芯片的电磁辐射,混频量化后存储到分析计算机中。分析计算机首先对采集的信号进行预处理后,使用上述DPA的方式得出密钥。&/p&&p&攻击的目标硬件为来自Microsemi的SmartFusion2,这是一个混合了ARM和FPGA的SoC。攻击针对的是ARM部分,一个Cortex-M3的内核。目标软件是来自OpenSSL [6]的AES 256实现。虽然SoC是一个混合芯片,但是只是用了ARM部分,Cortex-M3是很经典的ARM core,软件上也是OpenSSL的标准实现,可以认为这样的攻击很具有代表性。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-4acae65fadae48d80aee99c_b.png& data-rawwidth=&522& data-rawheight=&282& class=&origin_image zh-lightbox-thumb& width=&522& data-original=&https://pic1.zhimg.com/v2-4acae65fadae48d80aee99c_r.jpg&&&/figure&&blockquote&SmartFusion2 SoC FPGA 结构[7] &/blockquote&&p&接下来看看信号链部分。&/p&&p&首先是天线。理论上,设计天线是一个非常严谨且套路很深的活,比如下图只是冰山一角(图片来自网络)。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-3beb33a0f1_b.jpg& data-rawwidth=&499& data-rawheight=&374& class=&origin_image zh-lightbox-thumb& width=&499& data-original=&https://pic2.zhimg.com/v2-3beb33a0f1_r.jpg&&&/figure&&p&回到实践中,下图是本次攻击中使用的天线。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c0b621ca5af5ceb06288_b.jpg& data-rawwidth=&478& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&478& data-original=&https://pic1.zhimg.com/v2-c0b621ca5af5ceb06288_r.jpg&&&/figure&&p&就是一根电缆外加胶带“随意”制作的环状天线。&/p&&p&攻击场景如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-6d8c6d8c9b_b.jpg& data-rawwidth=&443& data-rawheight=&333& class=&origin_image zh-lightbox-thumb& width=&443& data-original=&https://pic1.zhimg.com/v2-6d8c6d8c9b_r.jpg&&&/figure&&p&绿色的PCB是目标板,环状天线悬空固定在芯片上方,信号通过了外部的放大器和带通滤波器,这些都是标准的工业器件,价格也不贵。&/p&&p&比较有意思的是采集设备,通常时域采集可以使用示波器,或者专用的数据记录仪,再不济也得用个USRP之类的软件无线电设备。Fox-IT的专家一开始自然也是这么考虑的。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e5f4bd1a4a0ce_b.jpg& data-rawwidth=&553& data-rawheight=&232& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic3.zhimg.com/v2-e5f4bd1a4a0ce_r.jpg&&&/figure&&p&图中左边是专用的数据记录仪,傻大粗,价格倒是很美丽。中间是USRP板子,这个板子的性能够用,价格也是一般的研究机构或者个(tu)人(hao)可以承受了。有趣的部分在图中右边,这个标识为RTLSDR的USB小玩意玩无线电的小伙伴一定不陌生。实际上国内也有卖,价格只需要几十到上百人民币。本次研究表明,这么一个入门级的小东西已经完全可以用来完成攻击。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-905f518b8f7cc992af68c_b.jpg& data-rawwidth=&554& data-rawheight=&234& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic1.zhimg.com/v2-905f518b8f7cc992af68c_r.jpg&&&/figure&&p&上图就是用上述硬件观测到的AES模式,可以清晰地看到I/O操作之间的AES加密流程,包括Key Schedule过程和14轮的操作,都是清晰可见。&/p&&p&接下来是分析过程,这方面,文献[1]中并没有详细介绍。但是DPA是一个比较标准的套路,他们也使用了业界标杆级的软件Riscure's Inspector,因为可以结合笔者的经验来谈一谈。&/p&&p&首先是信号预处理,这部分主要包括数字滤波,复信号转为实信号,当然也包括重采样,截取等步骤。还有一个比较重要的过程是不同traces之间的对齐,比较简单的方法是使用滑动窗和相关性分析的方法,使得所有traces能够精确对准。&/p&&p&接下来就是真正的DPA了,这在Inspector软件中有标准的模块,反而不需要自己实现。不过也有一些技巧,文献[1]中就提到了一个。为了快速验证采集到的电磁信号和设备功耗有直接关联,以及采集的位置是否正确。使用输入的明文(或输出的密文)和采集的trace做一次相关性分析,并验证泄露模型是否有效。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-d8dd1dc647ac8_b.jpg& data-rawwidth=&554& data-rawheight=&119& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic1.zhimg.com/v2-d8dd1dc647ac8_r.jpg&&&/figure&&p&这条相关性曲线说明了数据和信号之间确实有相关性的点,即确实可以从采集的信号中检测到数据。&/p&&p&接下来就是猜测密钥了,下图中相关性最高的猜测就是正确的密钥。实验表明SmartFusion2中,泄露来自AHB,这是符合预期的。因为AHB连接了Cortex-M3和片上RAM,查表操作就是M3内核访问RAM的一个操作。相比于简单的MCU,这里还要考虑cache的影响,对于指令cache,使用Hamming distance模型即可,而SmartFusion2为了和FPGA模块连接,考虑到数据一致性而没有设置数据cache,这也算是简化了攻击者的工作。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e88d2e31cc2fa5c42de13fa_b.jpg& data-rawwidth=&554& data-rawheight=&214& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic4.zhimg.com/v2-e88d2e31cc2fa5c42de13fa_r.jpg&&&/figure&&p&以上操作在几厘米之内探测电磁信号就完成了整个攻击过程,硬件成本小于200欧元(约1500人民币)。实际上这些硬件在国内购买的话,完全可能低于1000元。&/p&&p&在软件方面,Inspector是商业软件,需要支付授权费用。好在核心算法早已是公开的,可以自己编写,也可以使用便宜的解决方案,所以这方面的费用不计在总价内也是可以理解的。&/p&&h2&&b&局限性&/b&&/h2&&p&通过梳理整个攻击流程,我们可以总结出这类旁路攻击的先决条件,也是它的局限性所在。&/p&&p&(1)必须完全可以控制目标设备,给它输入不同的明文,控制其完成加密操作。&/p&&p&(2)必须可以接近到目标设备,因为要测量设备的物理属性(电磁特征),究竟距离多近需要看现场的电磁环境。&/p&&p&(3)必须熟悉目标设备使用的算法和实现细节。算法本身比较容易确认,实现细节很多设备不会公开源代码,但是密码学算法通常有若干标准实现,不难猜测确定。&/p&&p&要完成攻击攻击,条件(1)是基础,所以不用担心邻居家可以只通过旁路攻击来破解你家的路由器了。&/p&&p&条件(2)主要看距离要多近,这里有一些深入的研究。&/p&&p&前文使用的手工制作的环状天线,工作距离只有若干厘米,稍远一点就淹没在噪声里了。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-f98ef66d802b2afd7bbb34b_b.jpg& data-rawwidth=&285& data-rawheight=&217& class=&content_image& width=&285&&&/figure&&p&于是(早已坐不住的)天线工程师制造了下图的PCB天线,它的性能好很多,可惜为了降低尺(jia)寸(ge),它的工作频率是400MHz。而SmarFusion2只能最高工作到142MHz。既然是研究,不如换个目标设备(就是这么任性),比如Xilinx的Pynq board就可以稳稳地跑在400MHz。实践表明,依然可以用RTL-SDR完成攻击。这次攻击可以在30厘米内完成,但是不要忘了需要采集400k条traces,而且是在一定电磁屏蔽的环境下完成的。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-7f923560bfca_b.jpg& data-rawwidth=&553& data-rawheight=&219& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic3.zhimg.com/v2-7f923560bfca_r.jpg&&&/figure&&blockquote&PCB天线&/blockquote&&figure&&img src=&https://pic1.zhimg.com/v2-ab93c0e5daec0_b.jpg& data-rawwidth=&554& data-rawheight=&163& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic1.zhimg.com/v2-ab93c0e5daec0_r.jpg&&&/figure&&blockquote&使用急救毯包裹的攻击环境&/blockquote&&p&最后再冲击一下1米的距离,这需要在理想条件下完成。&/p&&p&首先,测试在微波暗室中进行,尽可能地排除了干扰信号。天线方面使用了盘锥天线,并保证了测量子系统和加密子系统之间的电气隔离。1米的距离很艰难的达到了,使用了240万条traces。这个理想实验证明了,在足够好的条件下,1米的攻击距离是完全可行的。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-33ee118b622a5c9e770ab7c27e16fd4b_b.jpg& data-rawwidth=&553& data-rawheight=&414& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic4.zhimg.com/v2-33ee118b622a5c9e770ab7c27e16fd4b_r.jpg&&&/figure&&h2&&b&防御&/b&&/h2&&p&旁路攻击之所以可以生效,主要在于密码设备泄露的旁路信息和操作的数据有关联性。在算法实现上,可以通过掩码(masking)或者隐藏(hiding)的方式来消除这种关联性。这方面的具体细节本文不再展开。在密码学算法这一领域,对于一般的应用或者系统开发者,是不推荐自己造轮子的。特别是不可以认为自己略懂密码学的算法,就去修改它们,一个简单的小修改,可能会破坏理论安全性和实现安全性,这些都不是普通的开发者可以做好的事情,还是用成熟的轮子最为靠谱。&/p&&p&以SmartFusion 2为例,完全可以不使用OpenSSL的算法实现,而使用带有保护的实现,例如Microsemi官方提供的FPGA实现。在电路级别上,功耗平衡等技术也可以从一定程度上解决这类泄露,使用专有的硬件来完成密码学操作,就可以很好地防御这类攻击了。&/p&&h2&&b&参考文献&/b&&/h2&&p&[1] &a href=&http://link.zhihu.com/?target=https%3A//www.fox-it.com/en/insights/blogs/blog/tempest-attacks-aes/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&fox-it.com/en/insights/&/span&&span class=&invisible&&blogs/blog/tempest-attacks-aes/&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&[2] &a href=&http://link.zhihu.com/?target=http%3A//www.st.com/zh/embedded-software/stm32-cryp-lib.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&st.com/zh/embedded-soft&/span&&span class=&invisible&&ware/stm32-cryp-lib.html&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&[3] &a href=&http://link.zhihu.com/?target=https%3A//www.intel.com/content/www/us/en/architecture-and-technology/advanced-encryption-standard--aes-/data-protection-aes-general-technology.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&intel.com/content/www/u&/span&&span class=&invisible&&s/en/architecture-and-technology/advanced-encryption-standard--aes-/data-protection-aes-general-technology.html&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&[4] &a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Advanced_Encryption_Standard& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&en.wikipedia.org/wiki/A&/span&&span class=&invisible&&dvanced_Encryption_Standard&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&[5] Pub N F. 197: Advanced encryption standard (AES)[J]. Federal information processing standards publication, 1): 0311.&/p&&p&[6] &a href=&http://link.zhihu.com/?target=https%3A//www.openssl.org/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&openssl.org/&/span&&span class=&invisible&&&/span&&/a&&/p&&p&[7] &a href=&http://link.zhihu.com/?target=https%3A//www.microsemi.com/products/fpga-soc/soc-fpga/smartfusion2& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&microsemi.com/products/&/span&&span class=&invisible&&fpga-soc/soc-fpga/smartfusion2&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&[8] Mangard S, Oswald E, Popp T. Power analysis attacks: Revealing the secrets of smart cards[M]. Springer Science & Business Media, 2008.&/p&&p&------------------------------------&/p&&p&* 作者:cyxu,更多阿里安全的知识分享及热点资讯,请关注阿里聚安全的安全专栏和&a href=&http://link.zhihu.com/?target=http%3A//jaq.alibaba.com/community/index.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&官方博客&/a&&/p&
NULL在理论上,理论和实践是一致的。在实践中,呵呵。——(应该是)爱因斯坦(说的)INFO:本文中不会出现公式,请放心阅读AES 256被破解了?对于TLNR(Too Long, Not Read)的读者来说,先把答案放在这:是的,但也不尽然。事件回顾如下:前几日在互联网…
。&/p&&p&正巧昨天看了一篇漫画是讲比特币的,我贴过来和大家分享一下。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ec310b7d874def471c64cf5fc87f1faf_b.png& data-rawwidth=&600& data-rawheight=&1426& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-ec310b7d874def471c64cf5fc87f1faf_r.png&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b54ecbec6eb6e48cbf60_b.png& data-rawwidth=&600& data-rawheight=&1209& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-b54ecbec6eb6e48cbf60_r.png&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-af6ce555aa1ccd3b29381ffba3ce9a03_b.png& data-rawwidth=&600& data-rawheight=&1480& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-af6ce555aa1ccd3b29381ffba3ce9a03_r.png&&&/figure&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-c4aa5cc4ad6fdf_b.png& data-rawwidth=&600& data-rawheight=&1487& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-c4aa5cc4ad6fdf_r.png&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-137afbc2d6_b.png& data-rawwidth=&600& data-rawheight=&990& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/v2-137afbc2d6_r.png&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-392e273f08e3e19a27cbccf190c0cfac_b.png& data-rawwidth=&600& data-rawheight=&1118& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-392e273f08e3e19a27cbccf190c0cfac_r.png&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e7e04cccbe95accd0e564bb_b.png& data-rawwidth=&600& data-rawheight=&1318& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-e7e04cccbe95accd0e564bb_r.png&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-3cfe31a2f3c588fb3e7db5_b.png& data-rawwidth=&600& data-rawheight=&1134& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic2.zhimg.com/v2-3cfe31a2f3c588fb3e7db5_r.png&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-1ff5aa456ea268abb9194_b.png& data-rawwidth=&600& data-rawheight=&1192& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-1ff5aa456ea268abb9194_r.png&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-f43bea211e00d2a77ecfa7d9e5b81442_b.png& data-rawwidth=&600& data-rawheight=&1225& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/v2-f43bea211e00d2a77ecfa7d9e5b81442_r.png&&&/figure&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-f1ce3a2dd19036daea056a2_b.png& data-rawwidth=&600& data-rawheight=&1218& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/v2-f1ce3a2dd19036daea056a2_r.png&&&/figure&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-2ecc6f6e3a557a87fac94b_b.png& data-rawwidth=&600& data-rawheight=&1124& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-2ecc6f6e3a557a87fac94b_r.png&&&/figure&
。谢邀 。正巧昨天看了一篇漫画是讲比特币的,我贴过来和大家分享一下。
&figure&&img src=&https://pic3.zhimg.com/v2-da6e908fbff06e8e14c60d86d776d225_b.jpg& data-rawwidth=&768& data-rawheight=&576& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&https://pic3.zhimg.com/v2-da6e908fbff06e8e14c60d86d776d225_r.jpg&&&/figure&&p&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-abd42bbb61ee_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&558& data-rawheight=&315& class=&origin_image zh-lightbox-thumb& width=&558& data-original=&https://pic1.zhimg.com/v2-abd42bbb61ee_r.jpg&&&/figure&&p&作为一名久经片场的老司机,早就想写一些探讨驾驶技术的文章。这篇就介绍利用生成式对抗网络(GAN)的两个基本驾驶技能:&br&&/p&&p&1) 去除(爱情)动作片中的马赛克&/p&&p&2) 给(爱情)动作片中的女孩穿(tuo)衣服&/p&&p&&br&&/p&&h2&生成式模型&/h2&&p&上一篇《&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&用GAN生成二维样本的小例子&/a&》中已经简单介绍了GAN,这篇再简要回顾一下生成式模型,算是补全一个来龙去脉。&/p&&p&生成模型就是能够产生指定分布数据的模型,常见的生成式模型一般都会有一个用于产生样本的简单分布。例如一个均匀分布,根据要生成分布的概率密度函数,进行建模,让均匀分布中的样本经过变换得到指定分布的样本,这就可以算是最简单的生成式模型。比如下面例子:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-d11b5fb26d3cc8e942f841bafe010cd8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1021& data-rawheight=&443& class=&origin_image zh-lightbox-thumb& width=&1021& data-original=&https://pic1.zhimg.com/v2-d11b5fb26d3cc8e942f841bafe010cd8_r.jpg&&&/figure&&p&图中左边是一个自定义的概率密度函数,右边是相应的1w个样本的直方图,自定义分布和生成这些样本的代码如下:&br&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&from&/span& &span class=&nn&&functools&/span& &span class=&kn&&import&/span& &span class=&n&&partial&/span&
&span class=&kn&&import&/span& &span class=&nn&&numpy&/span&
&span class=&kn&&from&/span& &span class=&nn&&matplotlib&/span& &span class=&kn&&import&/span& &span class=&n&&pyplot&/span&
&span class=&c1&&# Define a PDF&/span&
&span class=&n&&x_samples&/span& &span class=&o&&=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&arange&/span&&span class=&p&&(&/span&&span class=&o&&-&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mf&&3.01&/span&&span class=&p&&,&/span& &span class=&mf&&0.01&/span&&span class=&p&&)&/span&
&span class=&n&&PDF&/span& &span class=&o&&=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&empty&/span&&span class=&p&&(&/span&&span class=&n&&x_samples&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&span class=&n&&PDF&/span&&span class=&p&&[&/span&&span class=&n&&x_samples&/span& &span class=&o&&&&/span& &span class=&mi&&0&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&round&/span&&span class=&p&&(&/span&&span class=&n&&x_samples&/span&&span class=&p&&[&/span&&span class=&n&&x_samples&/span& &span class=&o&&&&/span& &span class=&mi&&0&/span&&span class=&p&&]&/span& &span class=&o&&+&/span& &span class=&mf&&3.5&/span&&span class=&p&&)&/span& &span class=&o&&/&/span& &span class=&mi&&3&/span&
&span class=&n&&PDF&/span&&span class=&p&&[&/span&&span class=&n&&x_samples&/span& &span class=&o&&&=&/span& &span class=&mi&&0&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&mf&&0.5&/span& &span class=&o&&*&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&cos&/span&&span class=&p&&(&/span&&span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&pi&/span& &span class=&o&&*&/span& &span class=&n&&x_samples&/span&&span class=&p&&[&/span&&span class=&n&&x_samples&/span& &span class=&o&&&=&/span& &span class=&mi&&0&/span&&span class=&p&&])&/span& &span class=&o&&+&/span& &span class=&mf&&0.5&/span&
&span class=&n&&PDF&/span& &span class=&o&&/=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&sum&/span&&span class=&p&&(&/span&&span class=&n&&PDF&/span&&span class=&p&&)&/span&
&span class=&c1&&# Calculate approximated CDF&/span&
&span class=&n&&CDF&/span& &span class=&o&&=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&empty&/span&&span class=&p&&(&/span&&span class=&n&&PDF&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&span class=&n&&cumulated&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&
&span class=&k&&for&/span& &span class=&n&&i&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&n&&CDF&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]):&/span&
&span class=&n&&cumulated&/span& &span class=&o&&+=&/span& &span class=&n&&PDF&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]&/span&
&span class=&n&&CDF&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&cumulated&/span&
&span class=&c1&&# Generate samples&/span&
&span class=&n&&generate&/span& &span class=&o&&=&/span& &span class=&n&&partial&/span&&span class=&p&&(&/span&&span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&interp&/span&&span class=&p&&,&/span& &span class=&n&&xp&/span&&span class=&o&&=&/span&&span class=&n&&CDF&/span&&span class=&p&&,&/span& &span class=&n&&fp&/span&&span class=&o&&=&/span&&span class=&n&&x_samples&/span&&span class=&p&&)&/span&
&span class=&n&&u_rv&/span& &span class=&o&&=&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&random&/span&&span class=&o&&.&/span&&span class=&n&&random&/span&&span class=&p&&(&/span&&span class=&mi&&10000&/span&&span class=&p&&)&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&generate&/span&&span class=&p&&(&/span&&span class=&n&&u_rv&/span&&span class=&p&&)&/span&
&span class=&c1&&# Visualization&/span&
&span class=&n&&fig&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&n&&ax0&/span&&span class=&p&&,&/span& &span class=&n&&ax1&/span&&span class=&p&&)&/span& &span class=&o&&=&/span& &span class=&n&&pyplot&/span&&span class=&o&&.&/span&&span class=&n&&subplots&/span&&span class=&p&&(&/span&&span class=&n&&ncols&/span&&span class=&o&&=&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&n&&figsize&/span&&span class=&o&&=&/span&&span class=&p&&(&/span&&span class=&mi&&9&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&))&/span&
&span class=&n&&ax0&/span&&span class=&o&&.&/span&&span class=&n&&plot&/span&&span class=&p&&(&/span&&span class=&n&&x_samples&/span&&span class=&p&&,&/span& &span class=&n&&PDF&/span&&span class=&p&&)&/span&
&span class=&n&&ax0&/span&&span class=&o&&.&/span&&span class=&n&&axis&/span&&span class=&p&&([&/span&&span class=&o&&-&/span&&span class=&mf&&3.5&/span&&span class=&p&&,&/span& &span class=&mf&&3.5&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&n&&numpy&/span&&span class=&o&&.&/span&&span class=&n&&max&/span&&span class=&p&&(&/span&&span class=&n&&PDF&/span&&span class=&p&&)&/span&&span class=&o&&*&/span&&span class=&mf&&1.1&/span&&span class=&p&&])&/span&
&span class=&n&&ax1&/span&&span class=&o&&.&/span&&span class=&n&&hist&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&mi&&100&/span&&span class=&p&&)&/span&
&span class=&n&&pyplot&/span&&span class=&o&&.&/span&&span class=&n&&show&/span&&span class=&p&&()&/span&
&/code&&/pre&&/div&&p&对于一些简单的情况,我们会假设已知有模型可以很好的对分布进行建模,缺少的只是合适的参数。这时候很自然只要根据观测到的样本,学习参数让当前观测到的样本下的似然函数最大,这就是最大似然估计(&b&M&/b&aximum &b&L&/b&ikelihood &b&E&/b&stimation):&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Chat%7B%5Ctheta%7D%3D%5Coperatorname%2A%7Bargmax%7D_%7B%5Ctheta%7D+P%28%5Cbm%7Bx%7D%7C%5Ctheta%29+%3D+%5Coperatorname%2A%7Bargmax%7D_%7B%5Ctheta%7D+%5Cprod_%7Bi%3D1%7D%5E%7Bn%7DP%28x_i%7C%5Ctheta%29+& alt=&\hat{\theta}=\operatorname*{argmax}_{\theta} P(\bm{x}|\theta) = \operatorname*{argmax}_{\theta} \prod_{i=1}^{n}P(x_i|\theta) & eeimg=&1&&&/p&&p&MLE是一个最基本的思路,实践中用得很多的还有KL散度(Kullback–Leibler divergence),假设真实分布是P,采样分布是Q,则KL散度为:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=D_%7BKL%7D%28P%7C%7CQ%29%3D%5Csum_%7Bx+%5Cin+%5COmega%7DP%28%7Bx%7D%29%5Clog%5Cfrac%7BP%28x%29%7D%7BQ%28x%29%7D+& alt=&D_{KL}(P||Q)=\sum_{x \in \Omega}P({x})\log\frac{P(x)}{Q(x)} & eeimg=&1&&&/p&&p&从公式也能看出来,KL散度描述的是两个分布的差异程度。换个角度来看,让产生的样本和原始分布接近,也就是要让这俩的差异减小,所以最小化KL散度就等同于MLE。从公式上来看的话,我们考虑把公式具体展开一下:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+D_%7BKL%7D%28P%7C%7CQ%29+%26%3D%5Csum_%7Bx+%5Cin+%5COmega%7DP%28%7Bx%7D%29%5Clog%5Cfrac%7BP%28x%29%7D%7BQ%28x%29%7D+%5C%5C+%26+%3D-%5Csum_%7Bx%5Cin%5COmega%7DP%28%7Bx%7D%29%5Clog%7BQ%28x%29%7D+%2B%5Csum_%7Bx%5Cin%5COmega%7DP%28%7Bx%7D%29%5Clog%7BP%28x%29%7D+%5C%5C+%26+%3D-%5Csum_%7Bx%5Cin%5COmega%7DP%28%7Bx%7D%29%5Clog%7BQ%28x%29%7D+%2BH%28P%29+%5Cend%7Balign%7D& alt=&\begin{align} D_{KL}(P||Q) &=\sum_{x \in \Omega}P({x})\log\frac{P(x)}{Q(x)} \\ & =-\sum_{x\in\Omega}P({x})\log{Q(x)} +\sum_{x\in\Omega}P({x})\log{P(x)} \\ & =-\sum_{x\in\Omega}P({x})\log{Q(x)} +H(P) \end{align}& eeimg=&1&&&/p&&p&公式的第二项就是熵,先不管这项,用H(P)表示。接下来考虑一个小trick:从Q中抽样n个样本&img src=&https://www.zhihu.com/equation?tex=%7Bx_1%2Cx_2%2C...%2Cx_n%7D& alt=&{x_1,x_2,...,x_n}& eeimg=&1&&,来估算P(x)的经验值(empirical density function):&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Chat%7BP%7D%28x%29%3D%5Cfrac+1+n+%5Csum_%7Bi%3D1%7D%5En+%5Cdelta%28x_i-x%29& alt=&\hat{P}(x)=\frac 1 n \sum_{i=1}^n \delta(x_i-x)& eeimg=&1&&&/p&&p&其中&img src=&https://www.zhihu.com/equation?tex=%5Cdelta%28%5Ccdot%29& alt=&\delta(\cdot)& eeimg=&1&&是狄拉克&img src=&https://www.zhihu.com/equation?tex=%5Cdelta& alt=&\delta& eeimg=&1&&函数,把这项替换到上面公式的P(x):&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+D_%7BKL%7D%28P%7C%7CQ%29+%26%3D-%5Csum_%7Bx%5Cin%5COmega%7D%5Cfrac+1+n+%5Csum_%7Bi%3D1%7D%5En+%5Cdelta%28x_i-x%29%5Clog%7BQ%28x%29%7D+%2BH%28P%29+%5C%5C+%26+%3D-%5Cfrac+1+n+%5Csum_%7Bi%3D1%7D%5En+%5Csum_%7Bx%5Cin%5COmega%7D+%5Cdelta%28x_i-x%29%5Clog%7BQ%28x%29%7D+%2BH%28P%29+%5Cend%7Balign%7D& alt=&\begin{align} D_{KL}(P||Q) &=-\sum_{x\in\Omega}\frac 1 n \sum_{i=1}^n \delta(x_i-x)\log{Q(x)} +H(P) \\ & =-\frac 1 n \sum_{i=1}^n \sum_{x\in\Omega} \delta(x_i-x)\log{Q(x)} +H(P) \end{align}& eeimg=&1&&&/p&&p&因为是离散的采样值,所以&img src=&https://www.zhihu.com/equation?tex=%5Csum_%7Bx%5Cin%5COmega%7D+%5Cdelta%28x_i-x%29& alt=&\sum_{x\in\Omega} \delta(x_i-x)& eeimg=&1&&中只有&img src=&https://www.zhihu.com/equation?tex=x%3Dx_i& alt=&x=x_i& eeimg=&1&&的时候狄拉克&img src=&https://www.zhihu.com/equation?tex=%5Cdelta& alt=&\delta& eeimg=&1&&函数才为1,所以考虑&img src=&https://www.zhihu.com/equation?tex=x%3Dx_i& alt=&x=x_i& eeimg=&1&&时这项直接化为1:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=D_%7BKL%7D%28P%7C%7CQ%29+%3D-%5Cfrac+1+n%5Csum_%7Bi%3D1%7D%5En+%5Clog%7BQ%28x_i%29%7D+%2BH%28P%29& alt=&D_{KL}(P||Q) =-\frac 1 n\sum_{i=1}^n \log{Q(x_i)} +H(P)& eeimg=&1&&&/p&&p&第一项正是似然的负对数形式。&/p&&p&说了些公式似乎跑得有点远了,其实要表达还是那个简单的意思:通过减小两个分布的差异可以让一个分布逼近另一个分布。仔细想想,这正是GAN里面adversarial loss的做法。&/p&&p&很多情况下我们面临的是更为复杂的分布,比如&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&上篇文章&/a&中的例子,又或是实际场景中更复杂的情况,比如生成不同人脸的图像。这时候,作为具有universal approximation性质的神经网络是一个看上去不错的选择[1]:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6fee20494f50baae2c1dc5fc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1561& data-rawheight=&549& class=&origin_image zh-lightbox-thumb& width=&1561& data-original=&https://pic4.zhimg.com/v2-6fee20494f50baae2c1dc5fc_r.jpg&&&/figure&&p&所以虽然GAN里面同时包含了生成网络和判别网络,但本质来说GAN的目的还是生成模型。从生成式模型的角度,Ian Goodfellow总结过一个和神经网络相关生成式方法的“家谱”[1]:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-8c6f1d8ee39dfbb4fcfb2_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&771& data-rawheight=&498& class=&origin_image zh-lightbox-thumb& width=&771& data-original=&https://pic1.zhimg.com/v2-8c6f1d8ee39dfbb4fcfb2_r.jpg&&&/figure&&p&在这其中,当下最流行的就是GAN和&b&V&/b&ariational &b&A&/b&uto&b&E&/b&ncoder(VAE),两种方法的一个简明示意如下[3]:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-380cde71a2f6ece28b4a97_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&568& data-rawheight=&274& class=&origin_image zh-lightbox-thumb& width=&568& data-original=&https://pic1.zhimg.com/v2-380cde71a2f6ece28b4a97_r.jpg&&&/figure&&p&本篇不打算展开讲什么是VAE,不过通过这个图,和名字中的autoencoder也大概能知道,VAE中生成的loss是基于重建误差的。而只基于重建误差的图像生成,都或多或少会有图像模糊的缺点,因为误差通常都是针对全局。比如基于MSE(Mean Squared Error)的方法用来生成超分辨率图像,容易出现下面的情况[4]:&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-78f53b142fab51b0c09a1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&892& data-rawheight=&598& class=&origin_image zh-lightbox-thumb& width=&892& data-original=&https://pic1.zhimg.com/v2-78f53b142fab51b0c09a1_r.jpg&&&/figure&&p&在这个二维示意中,真实数据分布在一个U形的流形上,而MSE系的方法因为loss的形式往往会得到一个接近平均值所在的位置(蓝色框)。&/p&&p&GAN在这方面则完爆其他方法,因为目标分布在流形上。所以只要大概收敛了,就算生成的图像都看不出是个啥,清晰度常常是有保证的,而这正是去除女优身上马赛克的理想特性!&/p&&p&&br&&/p&&h2&马赛克-&清晰画面:超分辨率(Super Resolution)问题&/h2&&p&说了好些铺垫,终于要进入正题了。首先明确,去马赛克其实是个图像超分辨率问题,也就是如何在低分辨率图像基础上得到更高分辨率的图像:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-31c84b42ad_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&784& data-rawheight=&324& class=&origin_image zh-lightbox-thumb& width=&784& data-original=&https://pic2.zhimg.com/v2-31c84b42ad_r.jpg&&&/figure&&p&视频中超分辨率实现的一个套路是通过不同帧的低分辨率画面猜测超分辨率的画面,有兴趣了解这个思想的朋友可以参考我之前的一个答案:&a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何通过多帧影像进行超分辨率重构? &/a& &/p&&p&不过基于多帧影像的方法对于女优身上的马赛克并不是很适用,所以这篇要讲的是基于单帧图像的超分辨率方法。&/p&&h2&SRGAN&/h2&&p&说到基于GAN的超分辨率的方法,就不能不提到SRGAN[4]:《Photo-Realistic Single Image &b&S&/b&uper-&b&R&/b&esolution Using a &b&G&/b&enerative &b&A&/b&dversarial&br&&b&N&/b&etwork》。这个工作的思路是:基于像素的MSE loss往往会得到大体正确,但是高频成分模糊的结果。所以只要重建低频成分的图像内容,然后靠GAN来补全高频的细节内容,就可以了:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-128029dfc7c470b07a4a1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&446& data-rawheight=&131& class=&origin_image zh-lightbox-thumb& width=&446& data-original=&https://pic3.zhimg.com/v2-128029dfc7c470b07a4a1_r.jpg&&&/figure&&p&这个思路其实和最早基于深度网络的风格迁移的思路很像(有兴趣的读者可以参考我之前文章&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&瞎谈CNN:通过优化求解输入图像&/a&的最后一部分),其中重建内容的content loss是原始图像和低分辨率图像在VGG网络中的各个ReLU层的激活值的差异:&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-331e02e394cfd04e7114a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&529& data-rawheight=&150& class=&origin_image zh-lightbox-thumb& width=&529& data-original=&https://pic3.zhimg.com/v2-331e02e394cfd04e7114a_r.jpg&&&/figure&&p&生成细节adversarial loss就是GAN用来判别是原始图还是生成图的loss:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fa5af2a10fe9a4dadfb04_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&394& data-rawheight=&89& class=&content_image& width=&394&&&/figure&&p&把这两种loss放一起,取个名叫perceptual loss。训练的网络结构如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-17861edeb4bcfae4e9f369_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&780& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&780& data-original=&https://pic1.zhimg.com/v2-17861edeb4bcfae4e9f369_r.jpg&&&/figure&&p&正是上篇文章中讲过的C-GAN,条件C就是低分辨率的图片。SRGAN生成的超分辨率图像虽然PSNR等和原图直接比较的传统量化指标并不是最好,但就视觉效果,尤其是细节上,胜过其他方法很多。比如下面是作者对比bicubic插值和基于ResNet特征重建的超分辨率的结果:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-f3b4376938ffcbd23c42d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&981& data-rawheight=&392& class=&origin_image zh-lightbox-thumb& width=&981& data-original=&https://pic4.zhimg.com/v2-f3b4376938ffcbd23c42d_r.jpg&&&/figure&&p&可以看到虽然很多细节都和原始图片不一样,不过看上去很和谐,并且细节的丰富程度远胜于SRResNet。这些栩栩如生的细节,可以看作是GAN根据学习到的分布信息“联想”出来的。&/p&&p&对于更看重“看上去好看”的超分辨率应用,SRGAN显然是很合适的。当然对于一些更看重重建指标的应用,比如超分辨率恢复嫌疑犯面部细节,SRGAN就不可以了。&/p&&h2&pix2pix&/h2&&p&虽然专门用了一节讲SRGAN,但本文用的方法其实是pix2pix[5]。这项工作刚在arxiv上发布就引起了不小的关注,它巧妙的利用GAN的框架解决了通用的Image-to-Image translation的问题。举例来说,在不改变分辨率的情况下:把照片变成油画风格;把白天的照片变成晚上;用色块对图片进行分割或者倒过来;为黑白照片上色;…每个任务都有专门针对性的方法和相关研究,但其实总体来看,都是像素到像素的一种映射啊,其实可以看作是一个问题。这篇文章的巧妙,就在于提出了pix2pix的方法,一个框架,解决所有这些问题。方法的示意图如下:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-e2ea753b7b0d7f18abee3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&485& data-rawheight=&437& class=&origin_image zh-lightbox-thumb& width=&485& data-original=&https://pic1.zhimg.com/v2-e2ea753b7b0d7f18abee3_r.jpg&&&/figure&&p&就是一个Conditional GAN,条件C是输入的图片。除了直接用C-GAN,这项工作还有两个改进:&/p&&p&1)&b&利用U-Net结构生成细节更好的图片&/b&[6]&/p&&figure&&img src=&https://pic4.zhimg.com/v2-beb074bebbfa0db_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&907& data-rawheight=&612& class=&origin_image zh-lightbox-thumb& width=&907& data-original=&https://pic4.zhimg.com/v2-beb074bebbfa0db_r.jpg&&&/figure&&p&U-Net是德国Freiburg大学模式识别和图像处理组提出的一种全卷积结构。和常见的先降采样到低维度,再升采样到原始分辨率的编解码(Encoder-Decoder)结构的网络相比,U-Net的区别是加入skip-connection,对应的feature maps和decode之后的同样大小的feature maps按通道拼(concatenate)一起,用来保留不同分辨率下像素级的细节信息。U-Net对提升细节的效果非常明显,下面是pix2pix文中给出的一个效果对比:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-2fb4ddb2fdc24eea31eea_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&563& data-rawheight=&307& class=&origin_image zh-lightbox-thumb& width=&563& data-original=&https://pic4.zhimg.com/v2-2fb4ddb2fdc24eea31eea_r.jpg&&&/figure&&p&可以看到,各种不同尺度的信息都得到了很大程度的保留。&/p&&p&2)&b&利用马尔科夫性的判别器(PatchGAN)&br&&/b&&/p&&p&pix2pix和SRGAN的一个异曲同工的地方是都有用重建解决低频成分,用GAN解决高频成分的想法。在pix2pix中,这个思想主要体现在两个地方。一个是loss函数,加入了L1 loss用来让生成的图片和训练的目标图片尽量相似,而图像中高频的细节部分则交由GAN来处理:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-cb180ad03d8a72e7883285b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&447& data-rawheight=&51& class=&origin_image zh-lightbox-thumb& width=&447& data-original=&https://pic4.zhimg.com/v2-cb180ad03d8a72e7883285b_r.jpg&&&/figure&&p&还有一个就是&b&PatchGAN&/b&,也就是具体的GAN中用来判别是否生成图的方法。PatchGAN的思想是,既然GAN只负责处理低频成分,那么判别器就没必要以一整张图作为输入,只需要对NxN的一个图像patch去进行判别就可以了。这也是为什么叫Markovian discriminator,因为在patch以外的部分认为和本patch互相独立。&/p&&p&具体实现的时候,作者使用的是一个NxN输入的全卷积小网络,最后一层每个像素过sigmoid输出为真的概率,然后用BCEloss计算得到最终loss。这样做的好处是因为输入的维度大大降低,所以参数量少,运算速度也比直接输入一张快,并且可以计算任意大小的图。作者对比了不同大小patch的结果,对于256x256的输入,patch大小在70x70的时候,从视觉上看结果就和直接把整张图片作为判别器输入没什么区别了:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-5172ca51efb4ee3e453b15_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&842& data-rawheight=&107& class=&origin_image zh-lightbox-thumb& width=&842& data-original=&https://pic1.zhimg.com/v2-5172ca51efb4ee3e453b15_r.jpg&&&/figure&&h2&生成带局部马赛克的训练数据&/h2&&p&利用pix2pix,只要准备好无码和相应的有码图片就可以训练去马赛克的模型了,就是这么简单。那么问题是,如何生成有马赛克的图片?&/p&&p&有毅力的话,可以手动加马赛克,这样最为精准。这节介绍一个不那么准,但是比随机强的方法:利用分类模型的激活区域进行自动马赛克标注。&/p&&p&基本思想是利用一个可以识别需要打码图像的分类模型,提取出这个模型中对应类的CAM(&b&C&/b&lass &b&A&/b&ctivation &b&M&/b&ap)[7],然后用马赛克遮住响应最高的区域即可。这里简单说一下什么是CAM,对于最后一层是全局池化(平均或最大都可以)的CNN结构,池化后的feature map相当于是做了个加权相加来计算最终的每个类别进入softmax之前的激活值。CAM的思路是,把这个权重在池化前的feature map上按像素加权相加,最后得到的单张的激活图就可以携带激活当前类别的一些位置信息,这相当于一种弱监督(classification--&localization):&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-fd28f0b871bd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&660& data-rawheight=&314& class=&origin_image zh-lightbox-thumb& width=&660& data-original=&https://pic4.zhimg.com/v2-fd28f0b871bd_r.jpg&&&/figure&&p&上图是一个CAM的示意,用澳洲梗类别的CAM,放大到原图大小,可以看到小狗所在的区域大致是激活响应最高的区域。&/p&&p&那么就缺一个可以识别XXX图片的模型了,网上还恰好就有个现成的,yahoo于2016年发布的开源色情图片识别模型Open NSFW(&b&N&/b&ot &b&S&/b&afe &b&F&/b&or &b&W&/b&ork):&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//github.com/yahoo/open_nsfw& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&yahoo/open_nsfw&/a&&/p&&p&CAM的实现并不难,结合Open NSFW自动打码的代码和使用放在了这里:&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//github.com/frombeijingwithlove/dlcv_for_beginners/tree/master/random_bonus/generate_mosaic_for_porno_images& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&给XX图片生成马赛克&/a&&/p&&p&&br&&/p&&p&(成功打码的)效果差不多是下面这样子:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-cbefa39dc983f2645dd8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&768& data-rawheight=&256& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&https://pic4.zhimg.com/v2-cbefa39dc983f2645dd8_r.jpg&&&/figure&&h2&去除(爱情)动作片中的马赛克&/h2&&p&这没什么好说的了,一行代码都不用改,只需要按照前面的步骤把数据准备好,然后按照pix2pix官方的使用方法训练就可以了:&/p&&p&Torch版pix2pix:&a href=&https://link.zhihu.com/?target=https%3A//github.com/phillipi/pix2pix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&phillipi/pix2pix&/a&&/p&&p&pyTorch版pix2pix(Cycle-GAN二合一版):&a href=&https://link.zhihu.com/?target=https%3A//github.com/junyanz/pytorch-CycleGAN-and-pix2pix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&junyanz/pytorch-CycleGAN-and-pix2pix&/a&&/p&&p&从D盘里随随便便找了几千张图片,用来执行了一下自动打码和pix2pix训练(默认参数),效果是下面这样:&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-9f52b17c0e1296767cbfbfafc290a5bd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&814& data-rawheight=&691& class=&origin_image zh-lightbox-thumb& width=&814& data-original=&https://pic2.zhimg.com/v2-9f52b17c0e1296767cbfbfafc290a5bd_r.jpg&&&/figure&&p&什么?你问说好给女优去马赛克呢?女优照片呢?&/p&&figure&&img src=&https://pic4.zhimg.com/v2-480fb8a4dcfc7a4f92ec_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&75& data-rawheight=&60& class=&content_image& width=&75&&&/figure&&p&还是要说一下,在真人照片上的效果比蘑菇和花强。&/p&&h2&对偶学习(Dual Learning)&/h2&&p&去马赛克已经讲完了,接下来就是给女孩穿(tuo)衣服了,动手之前,还是先讲一下铺垫:&b&对偶学习&/b&和&b&Cycle-GAN&/b&。&/p&&p&对偶学习是MSRA于2016年提出的一种用于机器翻译的增强学习方法[8],目的是解决海量数据配对标注的难题,个人觉得算是一种弱监督方法(不过看到大多数文献算作无监督)。以机器翻译为例,对偶学习基本思想如下图[9]:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-c4b1eeda364fb6c9bada02f3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&866& data-rawheight=&399& class=&origin_image zh-lightbox-thumb& width=&866& data-original=&https://pic3.zhimg.com/v2-c4b1eeda364fb6c9bada02f3_r.jpg&&&/figure&&p&左边的灰衣男只懂英语,右边的黑衣女只懂中文,现在的任务就是,要学习如何翻译英语到中文。对偶学习解决这个问题的思路是:给定一个模型&img src=&https://www.zhihu.com/equation?tex=f%3Ax%5Crightarrow+y& alt=&f:x\rightarrow y& eeimg=&1&&一上来无法知道f翻译得是否正确,但是如果考虑上&img src=&https://www.zhihu.com/equation?tex=f& alt=&f& eeimg=&1&&的对偶问题&img src=&https://www.zhihu.com/equation?tex=g%3Ay%5Crightarrow+x& alt=&g:y\rightarrow x& eeimg=&1&&,那么我可以尝试翻译一个英文句子到中文,再翻译回来。这种转了一圈的结果&img src=&https://www.zhihu.com/equation?tex=x%27%3Dg%28f%28x%29%29& alt=&x'=g(f(x))& eeimg=&1&&,灰衣男是可以用一个标准(BLEU)判断x'和x是否一个意思,并且把结果的一致性反馈给这两个模型进行改进。同样的,从中文取个句子,这样循环翻译一遍,两个模型又能从黑衣女那里获取反馈并改进模型。其实这就是强化学习的过程,每次翻译就是一个action,每个action会从环境(灰衣男或黑衣女)中获取reward,对模型进行改进,直至收敛。&/p&&p&也许有的人看到这里会觉得和上世纪提出的Co-training很像,这个在知乎上也有讨论:&/p&&p&&a href=&https://www.zhihu.com/question/& class=&internal&&如何理解刘铁岩老师团队在NIPS 2016上提出的对偶学习(Dual Learning)?&/a&&/p&&p&个人觉得还是不一样的,Co-Training是一种multi-view方法,比如一个输入x,如果看作是两个拼一起的特征&img src=&https://www.zhihu.com/equation?tex=x%3D%28x_1%2Cx_2%29& alt=&x=(x_1,x_2)& eeimg=&1&&,并且假设&img src=&https://www.zhihu.com/equation?tex=x_1& alt=&x_1& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=x_2& alt=&x_2& eeimg=&1&&互相独立,那么这时候训练两个分类器&img src=&https://www.zhihu.com/equation?tex=f_1%28%5Ccdot%29& alt=&f_1(\cdot)& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=f_2%28%5Ccdot%29& alt=&f_2(\cdot)& eeimg=&1&&对于任意样本x应该有&img src=&https://www.zhihu.com/equation?tex=f_1%28x_1%29%3Df_2%28x_2%29& alt=&f_1(x_1)=f_2(x_2)& eeimg=&1&&。这对没有标注的样本是很有用的,相当于利用了同一个样本分类结果就应该一样的隐含约束。所以Co-Training的典型场景是少量标注+大量未标注的半监督场景。并且&img src=&https://www.zhihu.com/equation?tex=f_1& alt=&f_1& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=f_2& alt=&f_2& eeimg=&1&&其实是两个不同,但是domain指向相同的任务。而Dual Learning中&img src=&https://www.zhihu.com/equation?tex=f& alt=&f& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=g& alt=&g& eeimg=&1&&是对偶任务,利用的隐含约束是&img src=&https://www.zhihu.com/equation?tex=x%5Crightarrow+y%5Crightarrow+x& alt=&x\rightarrow y\rightarrow x& eeimg=&1&&的cycle consistency。对输入的特征也没有像Co-Training有那么明确的假设,学习方法上也不一样,Dual Learning算是强化学习。&/p&&h2&CycleGAN和未配对图像翻译(Unpaired Image-to-Image Translation)&/h2&&p&CycleGAN,翻译过来就是:轮着干,是结合了对偶学习和GAN一个很直接而巧妙的想法[10],示意图如下:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-9e7396ebccb7c42302fc97_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&838& data-rawheight=&216& class=&origin_image zh-lightbox-thumb& width=&838& data-original=&https://pic4.zhimg.com/v2-9e7396ebccb7c42302fc97_r.jpg&&&/figure&&p&X和Y分别是两种不同类型图的集合,比如穿衣服的女优和没穿衣服的女优。所以给定一张穿了衣服的女优,要变成没穿衣服的样子,就是个图片翻译问题。CycleGAN示意图中(b)和(c)就是Dual Learning:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-de51cac58b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&347& data-rawheight=&62& class=&content_image& width=&347&&&/figure&&p&在Dual Learning基础上,又加入了两个判别器&img src=&https://www.zhihu.com/equation?tex=D_X& alt=&D_X& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=D_Y& alt=&D_Y& eeimg=&1&&用来进行对抗训练,让翻译过来的图片尽量逼近当前集合中的图片:&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e0ea7a6b38bf2a20cea4ea6f741a4c67_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&442& data-rawheight=&59& class=&origin_image zh-lightbox-thumb& width=&442& data-original=&https://pic3.zhimg.com/v2-e0ea7a6b38bf2a20cea4ea6f741a4c67_r.jpg&&&/figure&&p&全考虑一起,最终的loss是:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e6d99e7edea969da3dad_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&357& data-rawheight=&87& class=&content_image& width=&357&&&/figure&&p&也许有人会问,那不加cycle-consistency,直接用GAN学习一个&img src=&https://www.zhihu.com/equation?tex=X%5Crightarrow+Y& alt=&X\rightarrow Y& eeimg=&1&&的映射,让生成的Y的样本尽量毕竟Y里本身的样本可不可以呢?这个作者在文中也讨论了,会产生GAN训练中容易发生的mode collapse问题。mode collapse问题的一个简单示意如下[1]:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-309fce6329592babb784ed_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&842& data-rawheight=&262& class=&origin_image zh-lightbox-thumb& width=&842& data-original=&https://pic1.zhimg.com/v2-309fce6329592babb784ed_r.jpg&&&/figure&&p&上边的是真实分布,下边的是学习到的分布,可以看到学习到的分布只是完整分布的一部分,这个叫做partial mode collapse,是训练不收敛情况中常见的一种。如果是完全的mode collapse,就是说生成模型得到的都是几乎一样的输出。而加入Cycle-consistency会让一个domain里不同的样本都尽量映射到另一个domain里不同的地方,理想情况就是双射(bijection)。直观来理解,如果通过&img src=&https://www.zhihu.com/equation?tex=X%5Crightarrow+Y& alt=&X\rightarrow Y& eeimg=&1&&都映射在Y中同一个点,那么这个点y通过&img src=&https://www.zhihu.com/equation?tex=Y%5Crightarrow+X& alt=&Y\rightarrow X& eeimg=&1&&映射回来显然不可能是多个不同的x,所以加入cycle-consistency就帮助避免了mode collapse。这个问题在另一篇和CycleGAN其实本质上没什么不同的方法DiscoGAN中有更详细的讨论[11],有兴趣的话可以参考。&/p&&p&&br&&/p&&p&有一点值得注意的是,虽然名字叫CycleGAN,并且套路也和C-GAN很像,但是其实只有adversarial,并没有generative。因为严格来说只是学习了&img src=&https://www.zhihu.com/equation?tex=X%5Crightarrow+Y& alt=&X\rightarrow Y& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=Y%5Crightarrow+X& alt=&Y\rightarrow X& eeimg=&1&&的mapping,所谓的generative network里并没有随机性。有一个和CycleGAN以及DiscoGAN其实本质上也没什么不同的方法叫DualGAN[12],倒是通过dropout把随机性加上了。不过所有加了随机性产生的样本和原始样本间的cycle-consistency用的还是l1 loss,总觉得这样不是很对劲。当然现在GAN这么热门,其实只要是用了adversarial loss的基本都会取个名字叫XXGAN,也许是可以增加投稿命中率。&/p&&p&另外上节中提到了Co-Training,感觉这里也应该提一下CoGAN[13],因为名字有些相似,并且也可以用于未配对的图像翻译。CoGAN的大体思想是:如果两个Domain之间可以互相映射,那么一定有一些特征是共有的。比如男人和女人,虽然普遍可以从长相区分,但不变的是都有两个眼睛一个鼻子一张嘴等等。所以可以在生成的时候,把生成共有特征和各自特征的部分分开,示意图如下:&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-57eaadc8cec5190bfd30_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&758& data-rawheight=&207& class=&origin_image zh-lightbox-thumb& width=&758& data-original=&https://pic4.zhimg.com/v2-57eaadc8cec5190bfd30_r.jpg&&&/figure&&p&其实就是两个GAN结构,其中生成网络和判别网络中比较高层的部分都采用了权值共享(虚线相连的部分),没有全职共享的部分分别处理不同的domain。这样每次就可以根据训练的domain生成一个样本在两个domain中不同的对应,比如戴眼镜和没戴眼镜:&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-356a6118ccf3e8e3bf1c7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&791& data-rawheight=&267& class=&origin_image zh-lightbox-thumb& width=&791& data-original=&https://pic2.zhimg.com/v2-356a6118ccf3e8e3bf1c7_r.jpg&&&/figure&&p&分别有了共有特征和各自domain特征,那么做mapping的思路也就很直接了[14]:&/p&&p&&br&&/p&&figure&&img src=&https://pic7.zhimg.com/v2-8ac50600e40feaac345e09bd7e05a83d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&771& data-rawheight=&210& class=&origin_image zh-lightbox-thumb& width=&771& data-original=&https://pic7.zhimg.com/v2-8ac50600e40feaac345e09bd7e05a83d_r.jpg&&&/figure&&p&在GAN前边加了个domain encoder,然后对每个domain能得到三种样本给判别器区分:直接采样,重建采样,从另一个domain中transfer后的重建采样。训练好之后,用一个domain的encoder+另一个domain的generator就很自然的实现了不同domain的转换。用在图像翻译上的效果如下:&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-612e9cf5e125fd626be7db_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&444& data-rawheight=&544& class=&origin_image zh-lightbox-thumb& width=&444& data-original=&https://pic2.zhimg.com/v2-612e9cf5e125fd626be7db_r.jpg&&&/figure&&p&还有个巧妙的思路,是把CoGAN拆开,不同domain作为C-GAN条件的更加显式的做法[15]:&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ddec16d502c94f91ea35_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&883& data-rawheight=&398& class=&origin_image zh-lightbox-thumb& width=&883& data-original=&https://pic1.zhimg.com/v2-ddec16d502c94f91ea35_r.jpg&&&/figure&&p&第一步用噪声Z作为和domain无关的共享表征对应的latent noise,domain信息作为条件C训练一个C-GAN。第二步,训练一个encoder,利用和常见的encode-decode结构相反的decode(generate)-encode结构。学习好的encoder可以结合domain信息,把输入图像中和domain无关的共享特征提取出来。第三步,把前两步训练好的encoder和decoder(generator)连一起,就可以根据domain进行图像翻译了。&/p&&p&CoGAN一系的方法虽然结构看起来更复杂,但个人感觉理解起来要比dual系的方法更直接,并且有latent space,可解释性和属性对应也好一些。&/p&&p&又扯远了,还是回到正题:&/p&&p&&br&&/p&&h2&给女优穿上衣服&/h2&&p&其实同样没什么好说的,Cycle-GAN和pix2pix的作者是一拨人,文档都写得非常棒,准备好数据,分成穿衣服的和没穿衣服的两组,按照文档的步骤训练就可以:&/p&&p&Torch版Cycle-GAN:&a href=&https://link.zhihu.com/?target=https%3A//github.com/junyanz/CycleGAN& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&junyanz/CycleGAN&/a&&/p&&p&pyTorch版Cycle-GAN(pix2pix二合一版):&a href=&https://link.zhihu.com/?target=https%3A//github.com/junyanz/pytorch-CycleGAN-and-pix2pix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&junyanz/pytorch-CycleGAN-and-pix2pix&/a&&/p&&p&Cycle-GAN收敛不易,我用了128x128分辨率训练了穿衣服和没穿衣服的女优各一千多张,同样是默认参数训练了120个epoch,最后小部分成功“穿衣服”的结果如下:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-fee34d66c386e0e01e5804_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1117& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&1117& data-original=&https://pic4.zhimg.com/v2-fee34d66c386e0e01e5804_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-de57c5ebefa4251ee3caa1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1117& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&1117& data-original=&https://pic4.zhimg.com/v2-de57c5ebefa4251ee3caa1_r.jpg&&&/figure&&p&虽然都有些突兀,但好歹是穿上衣服了。注意马赛克不是图片里就有的,是我后来加上去的。&/p&&p&那么,脱衣服的例子在哪里?&/p&&figure&&img src=&https://pic4.zhimg.com/v2-480fb8a4dcfc7a4f92ec_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&75& data-rawheight=&60& class=&content_image& width=&75&&&/figure&&h2&参考文献&/h2&&p&[1] I. Goodfellow. Nips 2016 tutorial: Generative adversarial networks. arXiv preprint arXiv:, 2016.&/p&&p&[2] A. B. L. Larsen, S. K. S?nderby, Generating Faces with Torch. &a href=&https://link.zhihu.com/?target=http%3A//torch.ch/blog//gan.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Torch | Generating Faces with Torch&/a&&/p&&p&[3] A. B. L. Larsen, S. K. S?nderby, H. Larochelle, and O. Winther. Autoencoding beyond pixels using a&br&learned similarity metric. In ICML, pages , 2016.&br&&/p&&p&[4] C. Ledig, L. Theis, F. Huszar, J. Caballero, A. Aitken, A. Tejani, J. Totz, Z. Wang, and W. Shi. Photo-realistic single image super-resolution using a generative adversarial network. arXiv:, 2016.&/p&&p&[5] P. Isola, J.-Y. Zhu, T. Zhou, and A. A. Efros. Image-to-image translation with conditional adversarial networks. arxiv, 2016. &/p&&p&[6] O. Ronneberger, P. Fischer, and T. Brox. U-net: Convolutional networks for biomedical image segmentation. In MICCAI, pages 234–241. Springer, 2015.&/p&&p&[7] B. Zhou, A. Khosla, A. Lapedriza, A. Oliva, and A. Torralba. Learning deep features for discriminative localization. arXiv preprint arXiv:, 2015.&/p&&p&[8] He, D., Xia, Y., Qin, T., Wang, L., Yu, N., Liu, T.-Y., and Ma, W.-Y. (2016a). Dual learning for machine translation. In the Annual Conference on Neural Information Processing Systems (NIPS), 2016.&/p&&p&&br&&/p&&p&[9] &a href=&https://link.zhihu.com/?target=http%3A//www.dsrg.stuorg.iastate.edu/wp-content/uploads/2017/02/dual-learning_-pushing-the-new-frontier-of-artificial-intelligence-tieyan-liu.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&& Tie-Yan Liu, Dual Learning: Pushing the New Frontier of Artificial Intelligence, MIFS 2016&/a& &/p&&p&[10] J.-Y. Zhu, T. Park, P. Isola, and A. A. Efros. Unpaired image-to-image translation using cycle-consistent adversarial networkss. arXiv preprint arXiv:, 2017.&/p&&p&[11] T. Kim, M. Cha, H. Kim, J. Lee, and J. Kim. Learning to Discover Cross-Domain Relations with Generative Adversarial Networks. ArXiv e-prints, Mar. 2017.&/p&&p&&br&&/p&&p&[12] Z. Yi, H. Zhang, P. T. Gong, et al. DualGAN: Unsupervised dual learning for image-to-image translation. arXiv preprint arXiv:, 2017.&/p&&p&&br&&/p&&p&[13] M.-Y. Liu and O. Tuzel. Coupled generative adversarial networks. In Advances in Neural Information Processing Systems (NIPS), 2016.&/p&&p&[14] M.-Y. Liu, T. Breuel, and J. Kautz. Unsupervised image-to-image translation networks. arXiv preprint arXiv:, 2017.&/p&&p&[15] Dong, H., Neekhara, P., Wu, C., Guo, Y.: Unsupervised image-to-image translation with generative adversarial networks. arXiv preprint arXiv:, 2017.&/p&&p&=========== 分割线: ===========&/p&&p&上周日发的时候也想到了可能会有许多人对这个话题感兴趣,但没想到超过了1.5W赞这么多,大概看了看评论,做一些补充:&/p&&p&&b&1) &/b&马赛克训练数据:对于一般的机器学习问题,都是分布越简单越容易,遵循这个原则,我用的约束是单人照片,具体方法是:先找一个Pascal VOC训练好的SSD代码,然后SSD筛选了一批每张图里只能检测到一个人的。&/p&&p&最后在真人照片上的效果看上去还是不错的,我没有做过量化评估,大体来说看上去挺像的要超过一半,非常逼真的可能有5%~10%。两人以上战斗的动作画面我没有评估过。&/p&&p&&b&2)&/b&穿(tuo)衣训练数据:因为收敛很难,所以数据的加了更多约束:只用女性单人正面照片。同样通过SSD检测出单人照片,同时考虑person框的宽高比小于1的且框内能检测到人脸的(OpenCV的人脸检测)。这样尽量筛选出一批面向镜头,身体占画面比接近的照片。&/p&&p&最后的效果我在原文中也提到过,只有小部分能成功穿上(tuo)衣服,具体我也没有量化统计过,大概100张里两三张吧,大部分都是身上出现了看上去有点像衣服的线条或是另一个人的胸部。考虑到我最后筛选出的图片人物占画面比仍然有很大的变化,很可能我的模型就是遇到了文中提到的partial mode collapse的问题。&/p&&p&如果有更好的办法筛选出人物大小差不多的照片,效果应该能提升不少。比如我在用SSD筛选的时候如果考虑宽高比更小一些,筛选出的照片看上去会更加一致,不过我资源不太够,这样做后训练集就只有不到300张,资源够的老司机们有兴趣可以试试。&/p&&p&&br&&/p&&p&&b&3)&/b&预训练模型有没有?有,但是我研读了中华人民共和国刑法第三百六十三、三百六十四和三百六十六条,完全读不懂,所以还是不提供。再说就算我提供了,根据1)和2),看到你想看的内容也是需要运气的。&/p&&p&另外特别感谢赞赏的知友们,这篇文章是想说&b&书中自有颜如玉&/b&,而知友们的赞赏让我知道&b&书中真有黄金屋&/b&,古人诚不我欺…&/p&
作为一名久经片场的老司机,早就想写一些探讨驾驶技术的文章。这篇就介绍利用生成式对抗网络(GAN)的两个基本驾驶技能: 1) 去除(爱情)动作片中的马赛克2) 给(爱情)动作片中的女孩穿(tuo)衣服 生成式模型上一篇《》中已经简单介…
&figure&&img src=&https://pic4.zhimg.com/9ed5c00e41c854d2741382_b.jpg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&https://pic4.zhimg.com/9ed5c00e41c854d2741382_r.jpg&&&/figure&原文发布在微信公众账号:城市数据研究院(微信号:SHDATA),欢迎关注。以下为原文:&p&最近让我院的攻城狮订阅了上海交通卡一个月的刷卡数据到我们的服务器上,然后用算法从这4.1亿条刷卡数据中归纳出了每个上班族的早高峰乘坐地铁的习惯,从中筛选出每个人上班的常规线路。废话不多说,直接上我们的干货结论:&br&&/p&&figure&&img src=&https://pic3.zhimg.com/695b3cc77a8fa17a60845b3_b.jpg& data-rawwidth=&640& data-rawheight=&469& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic3.zhimg.com/695b3cc77a8fa17a60845b3_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/d37c550eac783e124deb2818b2dbfcd1_b.jpg& data-rawwidth=&640& data-rawheight=&469& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/d37c550eac783e124deb2818b2dbfcd1_r.jpg&&&/figure&&p&&strong&2号线是魔都的经济命脉,1号线、3号线、7号线、8号线是居住圣地&/strong&&/p&&p&先按照每条线路统计了早高峰期间进站和出站的上班族人数,用线路的粗细程度代表这条线进站或出站的总人数。发现1号线、3号线、7号线、8号线是进站最多的线路,说明魔都人民都住在这些线路沿线。而2号线是出站人数最多的线路,就是说上班的地点都分布在2号线沿线,2号线是魔都的经济命脉啊!&/p&&figure&&img src=&https://pic3.zhimg.com/e0761bacff0d39d8ee7a3af_b.jpg& data-rawwid

我要回帖

更多关于 dnf90审判流圣骑士 的文章

 

随机推荐