超级马里奥游戏下载单人模式 衣服是什么颜色

《超级马里奥:奥德赛》合作模式演示 帽子简直无敌
日 来源:游迅网 编辑:圣卡西
& &在E3展期间任天堂也给大家带来了《马里奥》新作《》合作模式的演示。两名玩家可以合作游戏,一个人操纵马里奥,另一个操纵马里奥的帽子,一起来看下!
& &《超级马里奥:奥德赛》合作模式演示:
& &首先要说《超级马里奥:奥德赛》的细节做得很有意思,演示开始是在一个比较冷的世界中,可以看到马里奥只要停下来就会在那瑟瑟发抖,感觉牙齿都在打颤。
& &从后面的演示中我们看到,马里奥的帽子可以当作板或者武器,进行大范围的攻击。除此之外,如果给敌人戴上帽子的话,还能把他变成自己人,比如下面这只被&降服&的乌龟。
& &《超级马里奥:奥德赛》将于0月27日发售,登陆平台,支持中文。
& &视频截图:
1 友情提示:支持键盘左右键← →翻页
超级马里奥:奥德赛你感兴趣吗?
看完这篇文章有何感觉?
48小时热门评论
一周热点资讯
小姑娘,你这样真的能出来么!
CopyRight&2004年-年 < 游迅网 All Rights Reserved
备案编号:沪ICP备号-6超级马里奥,252892小游戏大全 -
相关搜索:
3199推荐:
相关游戏 18 个
显示方式:
3199小游戏为您搜索匹配了一些“超级马里奥”的小游戏,谢谢大家支持3199小游戏。
介绍:马里奥大叔要带我们一起跟他去冒险,你准备好了吗?让我们一起跟他开始摩托之旅吧!类别:&&一款很好玩的冒险游戏。在游戏中,你要帮助主人公打败敌人,成为超级学校霸王,快来帮帮他吧!类别:&一款好玩的坦克大战游戏推荐给大家,你需要驾驶着你的坦克击败敌人,夺取战斗的胜利。在游戏汇总会有很多的道具,要注意拾取。敌人会越来越强大,你要小心咯。这是超级火力升级的第二部,游戏加入了战场模式可供选择。操作方法:方向键控制坦克移动,空格键射击。类别:&&&在这个黑暗的世界里,超级小猪的女朋友跟其他女生一样,过着没有光的生活,超级小猪决定将女朋友从黑暗中拯救出来,而它要做的,就是不断尝试,寻找路到达女朋友那边,快来帮帮它吧。类别:&
马里奥要过圣诞节了,现在正在收集礼物,让我们一起来帮助大叔吧!类别:&&&在超级玛丽的海边出现了一个工厂在向海洋中投放石油,那些石油杀死了很多的鱼,幸好超级玛丽是个水管工人,他知道该怎么样去修好水管,在那之前先把死亡的小鱼清理一下吧!操作方法:方向键控制移动,A键向上游,S键扔出鱼,把死的小鱼放到漏油口堵住,把所有的漏油口全堵住后过关。类别:&&&马里奥极限单车2来咯~~超级玛丽又开始玩极限单车,在各种崎岖的山路上飞奔着吃着他的金币,乐此不疲呀~你也来试试吧!看看你的技术如何吧!操作方法:方向键↑↓控制前进后退,方向键←→控制重心,空格键跳跃。类别:&&&&
超级恐龙战队完整无敌版来了!无敌版中冒险模式的人物血量无限,生命无限,让你轻松挑战所有邪恶boss!还等什么,赶紧来玩玩看吧!类别:&&&&&&&
全是马里奥2,吓死咯,怎么会有这么多马里奥到处乱蹦乱跳呢?难道是全世界各个版本的马里奥游戏的主角全部集结在一起了?不管如何,让我们拿起枪,尽可能多地打......&&类别:&&这是一款好玩的弹球小游戏,在游戏中有好玩的道具帮助你过关!操作方法:鼠标单击小球弹起,鼠标控制拖板的移动。类别:&&外婆的淘气小猫丢了,外婆发挥超级本领让我们到公园中帮她找回小猫。遇到捣乱的可疑人物,挖个地洞把他埋掉吧!操作方法:键盘操作,方向键移动,空格键挖洞。游戏加载完后点击游戏左侧红色键头进入游戏,再点击游戏右下侧Play level按钮开始游戏,如果无法直接到达下方可以在灰色的土地上按空格键挖洞就可以下去了。如果没有梯子连接的土层就给绿色的植物浇水它就会长成长青藤,这长青藤可作梯子。类别:&&&介绍:超级机器人杀手这次也遭到了敌人的围剿,面对大波敌人强力的机器人杀手毫不畏惧,这次能否逃生只能一拼了!类别:&介绍:马里奥大叔为了村庄不被邪恶的蘑菇怪们侵袭,独自一人在森林里抵挡他们,可是他们数量众多,恐怕依靠马里奥大叔一个人的力量难以阻止它们的侵袭,现在让我们拿起武器跟马里奥大叔一起守卫村庄吧!类别:&一只长相可爱的小虾米,现在需要你来帮助它去跳到尽可能高的地方,快来体验一下吧!操作方法:方向键←→键控制小虾左右活动。类别:&死神题材的超级无敌连连看,画面唯美,玩法简单,娱乐性强,挑战性强,操作流畅,关卡合理,给您一种耳目一新的感觉!喜欢死神的不能错过了,喜欢连连看的也不能错过哦,两个都喜欢的~~自觉多玩几次!操作方法:鼠标操作,左键点击两个相同图案,如果图案间的连线转折不超过两次并且不经过其他图案,即可消除。还可以点击“提示”“洗牌”按钮进行帮助哦。类别:&&杰基的男朋友每天离家前都会跟他的爱人说晚上他就回来了,可是这天他不幸出了车祸,杰基一直不愿意相信这个事实,她觉得只要自己能完成冒险,她的爱人就会回到自己身边,我们的历险由此开始。类别:&
海绵宝宝超级冒险2,海绵宝宝开始了他的冒险旅途,大家快来帮助他收集道上的汉堡,消灭怪物,越过重重障碍,顺利到达目的地,完成冒险旅途吧!类别:&&&善良的小蜜蜂正在遭受着一个怪物的袭击,你现在需要控制小蜜蜂去杀掉怪兽,快来体验一下吧!操作方法:游戏中使用鼠标操作控制小蜜蜂活动,点击鼠标左键射击,空格键升级技能。类别:&&&
网站为您提供在线小游戏、双人小游戏、小游戏大全等深受广大网友喜爱的小游戏
作品版权归作者所有 &合作:、、&p&这20本书足够刷一遍世界观了。&/p&&br&&br&&p&它们是自洽的,但并非所有值得深挖的领域只选取一本,因为还考虑了一个循序渐进的过程。相信它们能够构建一个新的世界观,或者说构建新世界观的主要框架。正如知道所有省份之间的高速公路以后,本质上已经了解中国的框架,接下来遍可以再任性地随意深度漫游国道、省道甚至于乡间小路。所以无论如何最广泛的梗概漫游应该是值得先做的,没错大概就是这20本组成的书单。书单其实覆盖了少数骨干节点的深度教材,建议阅读方式是读到腻了就爽快地换另一本看,然后到合适的时候兴趣来了再继续接着读完上次中断的书。&/p&&p&Have fun~&/p&&br&&br&&br&&p&1,&b&《自由选择》&/b&by 米尔顿 弗里德曼&/p&&br&&p&了解亚当斯密以来社会运作的经济逻辑&/p&&br&&p&2,&b&《金融的逻辑》&/b&by 陈志武&/p&&br&&p&金融对现代社会无论如何太重要无法绕开。一个基本的对金融对国家和社会意义的普及。&/p&&br&&p&3,&b&《CFA注册金融分析师考试中文手册》&/b&by 金程教育&/p&&br&&p&有了上述两本做基础可以开始深挖了。CFA几乎是最好的经济金融定量入门读物,因为它是教材所以一次性把学界公认最重要的成熟理论总结并强化。&/p&&br&&p&4,&b&《知识分子与社会》&/b&by 托马斯 索维尔&/p&&br&&p&美国著名高级知识分子(黑人),但是种族观非常正确。有助于梳理一个精英对社会的认知和定位。&/p&&br&&p&5,&b&《想象的共同体》&/b&by 本尼迪克特 安德森&/p&&br&&p&知道现在文化概念的分布以及对社会的意义&/p&&br&&p&6,&b&《越轨—— 人为什么干坏事》&/b&by 亚历克斯 梯尔&/p&&br&&p&了解人性&/p&&br&&p&7,&b&《沐猿而冠》&/b&辉格&/p&&br&&p&社会现象的人性理解&/p&&br&&p&8,&b&《美德的起源》&/b&by 马特 里德利&/p&&br&&p&追加一本人性&/p&&br&&p&9,&b&《进化心理学》&/b&by 大卫 巴斯&/p&&br&&p&从基因角度理解人性&/p&&br&&p&10,&b&《失落的一代》&/b&by 潘鸣啸&/p&&br&&p&了解我们父母的年代,进而了解社会当下&/p&&br&&p&11,&b&《改革的逻辑》&/b&by 周其仁&/p&&br&&p&知道中国正在转型的哪个阶段&/p&&br&&p&12,&b&《公司法》&/b&by 全国人大&/p&&br&&p&读一读会发现1,不难理解 2,权力制衡 &/p&&br&&p&13,&b&《悖论研究》&/b&by 陈波&/p&&br&&p&理清逻辑悖论,强化理解社会的逻辑工具&/p&&br&&p&14,&b&《理性乐观派》&/b&by 马特 里德利&/p&&br&&p&非常好的击破阴谋论的书&/p&&br&&p&15,&b&《合作的进化》&/b&by 罗伯特 阿克塞尔罗德&/p&&br&&p&社会本质上注定在发展&/p&&br&&p&16,&b&《大而不倒》&/b&by 加里 斯特恩&/p&&br&&p&但是系统性的风险依旧需要克服&/p&&br&&p&17,&b&《历史的终结与最后的人》&/b&by 弗朗西斯 福山&/p&&br&&p&最终社会会趋于动态平衡,同质性的循环,但不断丰富&/p&&br&&p&18,&b&《贫穷的本质》&/b&by 阿比吉特 班纳吉&/p&&br&&p&必须绕开贫穷陷阱,我们有办法去设定好的制度&/p&&br&&p&19,&b&《数学桥》&/b&by 史蒂芬 休森&/p&&br&&p&掌握一点有益的数学工具方便学习任何定量的学科&/p&&br&&p&20,&b&《最小派》&/b& (未完成)&/p&&br&&p&为年轻人准备的世界观察整体解决方案&/p&&br&&br&&br&&p&★★★★★
知识创造乐趣,你是你的大学。
&a href=&///?target=http%3A//www.wanmen.org& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&wanmen.org&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&
★★★★★&/p&
这20本书足够刷一遍世界观了。 它们是自洽的,但并非所有值得深挖的领域只选取一本,因为还考虑了一个循序渐进的过程。相信它们能够构建一个新的世界观,或者说构建新世界观的主要框架。正如知道所有省份之间的高速公路以后,本质上已经了解中国的框架,接…
&img src=&/v2-da6e908fbff06e8e14c60d86d776d225_b.jpg& data-rawwidth=&768& data-rawheight=&576& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-da6e908fbff06e8e14c60d86d776d225_r.jpg&&&img src=&/v2-abd42bbb61ee_b.jpg& data-rawwidth=&558& data-rawheight=&315& class=&origin_image zh-lightbox-thumb& width=&558& data-original=&/v2-abd42bbb61ee_r.jpg&&&p&作为一名久经片场的老司机,早就想写一些探讨驾驶技术的文章。这篇就介绍利用生成式对抗网络(GAN)的两个基本驾驶技能:&br&&/p&&p&1) 去除(爱情)动作片中的马赛克&/p&&p&2) 给(爱情)动作片中的女孩穿(tuo)衣服&/p&&br&&h2&生成式模型&/h2&&p&上一篇《&a href=&/p/& class=&internal&&用GAN生成二维样本的小例子&/a&》中已经简单介绍了GAN,这篇再简要回顾一下生成式模型,算是补全一个来龙去脉。&/p&&p&生成模型就是能够产生指定分布数据的模型,常见的生成式模型一般都会有一个用于产生样本的简单分布。例如一个均匀分布,根据要生成分布的概率密度函数,进行建模,让均匀分布中的样本经过变换得到指定分布的样本,这就可以算是最简单的生成式模型。比如下面例子:&/p&&img src=&/v2-d11b5fb26d3cc8e942f841bafe010cd8_b.png& data-rawwidth=&1021& data-rawheight=&443& class=&origin_image zh-lightbox-thumb& width=&1021& data-original=&/v2-d11b5fb26d3cc8e942f841bafe010cd8_r.png&&&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&&img src=&/equation?tex=%5Chat%7B%5Ctheta%7D%3D%5Coperatorname%2A%7Bargmax%7D_%7B%5Ctheta%7D+P%28%5Cbm%7Bx%7D%7C%5Ctheta%29%0A+%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&&&br&&p&MLE是一个最基本的思路,实践中用得很多的还有KL散度(Kullback–Leibler divergence),假设真实分布是P,采样分布是Q,则KL散度为:&/p&&img src=&/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&&&br&&p&从公式也能看出来,KL散度描述的是两个分布的差异程度。换个角度来看,让产生的样本和原始分布接近,也就是要让这俩的差异减小,所以最小化KL散度就等同于MLE。从公式上来看的话,我们考虑把公式具体展开一下:&/p&&br&&img src=&/equation?tex=%5Cbegin%7Balign%7D%0AD_%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%0A%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%0A%26+%3D-%5Csum_%7Bx%5Cin%5COmega%7DP%28%7Bx%7D%29%5Clog%7BQ%28x%29%7D+%2BH%28P%29%0A%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&&&br&&p&公式的第二项就是熵,先不管这项,用H(P)表示。接下来考虑一个小trick:从Q中抽样n个样本&img src=&/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&&img src=&/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&&&br&&p&其中&img src=&/equation?tex=%5Cdelta%28%5Ccdot%29& alt=&\delta(\cdot)& eeimg=&1&&是狄拉克&img src=&/equation?tex=%5Cdelta& alt=&\delta& eeimg=&1&&函数,把这项替换到上面公式的P(x):&/p&&br&&img src=&/equation?tex=%5Cbegin%7Balign%7D%0AD_%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%0A%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%0A%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&&&br&&p&因为是离散的采样值,所以&img src=&/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=&/equation?tex=x%3Dx_i& alt=&x=x_i& eeimg=&1&&的时候狄拉克&img src=&/equation?tex=%5Cdelta& alt=&\delta& eeimg=&1&&函数才为1,所以考虑&img src=&/equation?tex=x%3Dx_i& alt=&x=x_i& eeimg=&1&&时这项直接化为1:&/p&&br&&img src=&/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&&&br&&p&第一项正是似然的负对数形式。&/p&&p&说了些公式似乎跑得有点远了,其实要表达还是那个简单的意思:通过减小两个分布的差异可以让一个分布逼近另一个分布。仔细想想,这正是GAN里面adversarial loss的做法。&/p&&p&很多情况下我们面临的是更为复杂的分布,比如&a href=&/p/& class=&internal&&上篇文章&/a&中的例子,又或是实际场景中更复杂的情况,比如生成不同人脸的图像。这时候,作为具有universal approximation性质的神经网络是一个看上去不错的选择[1]:&br&&/p&&img src=&/v2-6fee20494f50baae2c1dc5fc_b.jpg& data-rawwidth=&1561& data-rawheight=&549& class=&origin_image zh-lightbox-thumb& width=&1561& data-original=&/v2-6fee20494f50baae2c1dc5fc_r.jpg&&&p&所以虽然GAN里面同时包含了生成网络和判别网络,但本质来说GAN的目的还是生成模型。从生成式模型的角度,Ian Goodfellow总结过一个和神经网络相关生成式方法的“家谱”[1]:&/p&&img src=&/v2-8c6f1d8ee39dfbb4fcfb2_b.png& data-rawwidth=&771& data-rawheight=&498& class=&origin_image zh-lightbox-thumb& width=&771& data-original=&/v2-8c6f1d8ee39dfbb4fcfb2_r.png&&&p&在这其中,当下最流行的就是GAN和&b&V&/b&ariational &b&A&/b&uto&b&E&/b&ncoder(VAE),两种方法的一个简明示意如下[3]:&/p&&img src=&/v2-380cde71a2f6ece28b4a97_b.png& data-rawwidth=&568& data-rawheight=&274& class=&origin_image zh-lightbox-thumb& width=&568& data-original=&/v2-380cde71a2f6ece28b4a97_r.png&&&p&本篇不打算展开讲什么是VAE,不过通过这个图,和名字中的autoencoder也大概能知道,VAE中生成的loss是基于重建误差的。而只基于重建误差的图像生成,都或多或少会有图像模糊的缺点,因为误差通常都是针对全局。比如基于MSE(Mean Squared Error)的方法用来生成超分辨率图像,容易出现下面的情况[4]:&/p&&br&&p&&img src=&/v2-78f53b142fab51b0c09a1_b.png& data-rawwidth=&892& data-rawheight=&598& class=&origin_image zh-lightbox-thumb& width=&892& data-original=&/v2-78f53b142fab51b0c09a1_r.png&&在这个二维示意中,真实数据分布在一个U形的流形上,而MSE系的方法因为loss的形式往往会得到一个接近平均值所在的位置(蓝色框)。&/p&&p&GAN在这方面则完爆其他方法,因为目标分布在流形上。所以只要大概收敛了,就算生成的图像都看不出是个啥,清晰度常常是有保证的,而这正是去除女优身上马赛克的理想特性!&/p&&br&&h2&马赛克-&清晰画面:超分辨率(Super Resolution)问题&/h2&&p&说了好些铺垫,终于要进入正题了。首先明确,去马赛克其实是个图像超分辨率问题,也就是如何在低分辨率图像基础上得到更高分辨率的图像:&/p&&img src=&/v2-31c84b42ad_b.png& data-rawwidth=&784& data-rawheight=&324& class=&origin_image zh-lightbox-thumb& width=&784& data-original=&/v2-31c84b42ad_r.png&&&p&视频中超分辨率实现的一个套路是通过不同帧的低分辨率画面猜测超分辨率的画面,有兴趣了解这个思想的朋友可以参考我之前的一个答案:&a href=&/question//answer/& class=&internal&&如何通过多帧影像进行超分辨率重构? &/a&&br&&/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
&b&N&/b&etwork》。这个工作的思路是:基于像素的MSE loss往往会得到大体正确,但是高频成分模糊的结果。所以只要重建低频成分的图像内容,然后靠GAN来补全高频的细节内容,就可以了:&/p&&img src=&/v2-128029dfc7c470b07a4a1_b.png& data-rawwidth=&446& data-rawheight=&131& class=&origin_image zh-lightbox-thumb& width=&446& data-original=&/v2-128029dfc7c470b07a4a1_r.png&&这个思路其实和最早基于深度网络的风格迁移的思路很像(有兴趣的读者可以参考我之前文章&a href=&/p/& class=&internal&&瞎谈CNN:通过优化求解输入图像&/a&的最后一部分),其中重建内容的content loss是原始图像和低分辨率图像在VGG网络中的各个ReLU层的激活值的差异:&p&&img src=&/v2-331e02e394cfd04e7114a_b.png& data-rawwidth=&529& data-rawheight=&150& class=&origin_image zh-lightbox-thumb& width=&529& data-original=&/v2-331e02e394cfd04e7114a_r.png&&生成细节adversarial loss就是GAN用来判别是原始图还是生成图的loss:&/p&&img src=&/v2-fa5af2a10fe9a4dadfb04_b.png& data-rawwidth=&394& data-rawheight=&89& class=&content_image& width=&394&&&p&把这两种loss放一起,取个名叫perceptual loss。训练的网络结构如下:&/p&&img src=&/v2-17861edeb4bcfae4e9f369_b.png& data-rawwidth=&780& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&780& data-original=&/v2-17861edeb4bcfae4e9f369_r.png&&&p&正是上篇文章中讲过的C-GAN,条件C就是低分辨率的图片。SRGAN生成的超分辨率图像虽然PSNR等和原图直接比较的传统量化指标并不是最好,但就视觉效果,尤其是细节上,胜过其他方法很多。比如下面是作者对比bicubic插值和基于ResNet特征重建的超分辨率的结果:&/p&&img src=&/v2-f3b4376938ffcbd23c42d_b.png& data-rawwidth=&981& data-rawheight=&392& class=&origin_image zh-lightbox-thumb& width=&981& data-original=&/v2-f3b4376938ffcbd23c42d_r.png&&&p&可以看到虽然很多细节都和原始图片不一样,不过看上去很和谐,并且细节的丰富程度远胜于SRResNet。这些栩栩如生的细节,可以看作是GAN根据学习到的分布信息“联想”出来的。&/p&&p&对于更看重“看上去好看”的超分辨率应用,SRGAN显然是很合适的。当然对于一些更看重重建指标的应用,比如超分辨率恢复嫌疑犯面部细节,SRGAN就不可以了。&/p&&h2&pix2pix&/h2&&p&虽然专门用了一节讲SRGAN,但本文用的方法其实是pix2pix[5]。这项工作刚在arxiv上发布就引起了不小的关注,它巧妙的利用GAN的框架解决了通用的Image-to-Image translation的问题。举例来说,在不改变分辨率的情况下:把照片变成油画风格;把白天的照片变成晚上;用色块对图片进行分割或者倒过来;为黑白照片上色;…每个任务都有专门针对性的方法和相关研究,但其实总体来看,都是像素到像素的一种映射啊,其实可以看作是一个问题。这篇文章的巧妙,就在于提出了pix2pix的方法,一个框架,解决所有这些问题。方法的示意图如下:&/p&&p&&img src=&/v2-e2ea753b7b0d7f18abee3_b.png& data-rawwidth=&485& data-rawheight=&437& class=&origin_image zh-lightbox-thumb& width=&485& data-original=&/v2-e2ea753b7b0d7f18abee3_r.png&&就是一个Conditional GAN,条件C是输入的图片。除了直接用C-GAN,这项工作还有两个改进:&/p&&p&1)&b&利用U-Net结构生成细节更好的图片&/b&[6]&/p&&img src=&/v2-beb074bebbfa0db_b.png& data-rawwidth=&907& data-rawheight=&612& class=&origin_image zh-lightbox-thumb& width=&907& data-original=&/v2-beb074bebbfa0db_r.png&&&p&U-Net是德国Freiburg大学模式识别和图像处理组提出的一种全卷积结构。和常见的先降采样到低维度,再升采样到原始分辨率的编解码(Encoder-Decoder)结构的网络相比,U-Net的区别是加入skip-connection,对应的feature maps和decode之后的同样大小的feature maps按通道拼(concatenate)一起,用来保留不同分辨率下像素级的细节信息。U-Net对提升细节的效果非常明显,下面是pix2pix文中给出的一个效果对比:&/p&&p&&img src=&/v2-2fb4ddb2fdc24eea31eea_b.png& data-rawwidth=&563& data-rawheight=&307& class=&origin_image zh-lightbox-thumb& width=&563& data-original=&/v2-2fb4ddb2fdc24eea31eea_r.png&&可以看到,各种不同尺度的信息都得到了很大程度的保留。&/p&&p&2)&b&利用马尔科夫性的判别器(PatchGAN)&br&&/b&&/p&&p&pix2pix和SRGAN的一个异曲同工的地方是都有用重建解决低频成分,用GAN解决高频成分的想法。在pix2pix中,这个思想主要体现在两个地方。一个是loss函数,加入了L1 loss用来让生成的图片和训练的目标图片尽量相似,而图像中高频的细节部分则交由GAN来处理:&/p&&img src=&/v2-cb180ad03d8a72e7883285b_b.png& data-rawwidth=&447& data-rawheight=&51& class=&origin_image zh-lightbox-thumb& width=&447& data-original=&/v2-cb180ad03d8a72e7883285b_r.png&&&p&还有一个就是&b&PatchGAN&/b&,也就是具体的GAN中用来判别是否生成图的方法。PatchGAN的思想是,既然GAN只负责处理低频成分,那么判别器就没必要以一整张图作为输入,只需要对NxN的一个图像patch去进行判别就可以了。这也是为什么叫Markovian discriminator,因为在patch以外的部分认为和本patch互相独立。&/p&&p&具体实现的时候,作者使用的是一个NxN输入的全卷积小网络,最后一层每个像素过sigmoid输出为真的概率,然后用BCEloss计算得到最终loss。这样做的好处是因为输入的维度大大降低,所以参数量少,运算速度也比直接输入一张快,并且可以计算任意大小的图。作者对比了不同大小patch的结果,对于256x256的输入,patch大小在70x70的时候,从视觉上看结果就和直接把整张图片作为判别器输入没什么区别了:&/p&&img src=&/v2-5172ca51efb4ee3e453b15_b.png& data-rawwidth=&842& data-rawheight=&107& class=&origin_image zh-lightbox-thumb& width=&842& data-original=&/v2-5172ca51efb4ee3e453b15_r.png&&&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&&img src=&/v2-fd28f0b871bd_b.png& data-rawwidth=&660& data-rawheight=&314& class=&origin_image zh-lightbox-thumb& width=&660& data-original=&/v2-fd28f0b871bd_r.png&&上图是一个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&&a href=&/?target=https%3A///yahoo/open_nsfw& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&yahoo/open_nsfw&i class=&icon-external&&&/i&&/a&&p&CAM的实现并不难,结合Open NSFW自动打码的代码和使用放在了这里:&/p&&a href=&/?target=https%3A///frombeijingwithlove/dlcv_for_beginners/tree/master/random_bonus/generate_mosaic_for_porno_images& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&给XX图片生成马赛克&i class=&icon-external&&&/i&&/a&&br&&br&(成功打码的)效果差不多是下面这样子:&img src=&/v2-cbefa39dc983f2645dd8_b.png& data-rawwidth=&768& data-rawheight=&256& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-cbefa39dc983f2645dd8_r.png&&&h2&去除(爱情)动作片中的马赛克&/h2&&p&这没什么好说的了,一行代码都不用改,只需要按照前面的步骤把数据准备好,然后按照pix2pix官方的使用方法训练就可以了:&/p&&p&Torch版pix2pix:&a href=&/?target=https%3A///phillipi/pix2pix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&phillipi/pix2pix&i class=&icon-external&&&/i&&/a&&/p&&p&pyTorch版pix2pix(Cycle-GAN二合一版):&a href=&/?target=https%3A///junyanz/pytorch-CycleGAN-and-pix2pix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&junyanz/pytorch-CycleGAN-and-pix2pix&i class=&icon-external&&&/i&&/a&&/p&&p&从D盘里随随便便找了几千张图片,用来执行了一下自动打码和pix2pix训练(默认参数),效果是下面这样:&/p&&br&&img src=&/v2-9f52b17c0e1296767cbfbfafc290a5bd_b.png& data-rawwidth=&814& data-rawheight=&691& class=&origin_image zh-lightbox-thumb& width=&814& data-original=&/v2-9f52b17c0e1296767cbfbfafc290a5bd_r.png&&&p&什么?你问说好给女优去马赛克呢?女优照片呢?&/p&&img src=&/v2-480fb8a4dcfc7a4f92ec_b.png& data-rawwidth=&75& data-rawheight=&60& class=&content_image& width=&75&&&p&还是要说一下,在真人照片上的效果比蘑菇和花强。&/p&&h2&对偶学习(Dual Learning)&/h2&&p&去马赛克已经讲完了,接下来就是给女孩穿(tuo)衣服了,动手之前,还是先讲一下铺垫:&b&对偶学习&/b&和&b&Cycle-GAN&/b&。&/p&&p&对偶学习是MSRA于2016年提出的一种用于机器翻译的增强学习方法[8],目的是解决海量数据配对标注的难题,个人觉得算是一种弱监督方法(不过看到大多数文献算作无监督)。以机器翻译为例,对偶学习基本思想如下图[9]:&/p&&img src=&/v2-c4b1eeda364fb6c9bada02f3_b.png& data-rawwidth=&866& data-rawheight=&399& class=&origin_image zh-lightbox-thumb& width=&866& data-original=&/v2-c4b1eeda364fb6c9bada02f3_r.png&&左边的灰衣男只懂英语,右边的黑衣女只懂中文,现在的任务就是,要学习如何翻译英语到中文。对偶学习解决这个问题的思路是:给定一个模型&img src=&/equation?tex=f%3Ax%5Crightarrow+y& alt=&f:x\rightarrow y& eeimg=&1&&一上来无法知道f翻译得是否正确,但是如果考虑上&img src=&/equation?tex=f& alt=&f& eeimg=&1&&的对偶问题&img src=&/equation?tex=g%3Ay%5Crightarrow+x& alt=&g:y\rightarrow x& eeimg=&1&&,那么我可以尝试翻译一个英文句子到中文,再翻译回来。这种转了一圈的结果&img src=&/equation?tex=x%27%3Dg%28f%28x%29%29& alt=&x'=g(f(x))& eeimg=&1&&,灰衣男是可以用一个标准(BLEU)判断x'和x是否一个意思,并且把结果的一致性反馈给这两个模型进行改进。同样的,从中文取个句子,这样循环翻译一遍,两个模型又能从黑衣女那里获取反馈并改进模型。其实这就是强化学习的过程,每次翻译就是一个action,每个action会从环境(灰衣男或黑衣女)中获取reward,对模型进行改进,直至收敛。&p&也许有的人看到这里会觉得和上世纪提出的Co-training很像,这个在知乎上也有讨论:&/p&&a href=&/question/& class=&internal&&如何理解刘铁岩老师团队在NIPS 2016上提出的对偶学习(Dual Learning)?&/a&&p&个人觉得还是不一样的,Co-Training是一种multi-view方法,比如一个输入x,如果看作是两个拼一起的特征&img src=&/equation?tex=x%3D%28x_1%2Cx_2%29& alt=&x=(x_1,x_2)& eeimg=&1&&,并且假设&img src=&/equation?tex=x_1& alt=&x_1& eeimg=&1&&和&img src=&/equation?tex=x_2& alt=&x_2& eeimg=&1&&互相独立,那么这时候训练两个分类器&img src=&/equation?tex=f_1%28%5Ccdot%29& alt=&f_1(\cdot)& eeimg=&1&&和&img src=&/equation?tex=f_2%28%5Ccdot%29& alt=&f_2(\cdot)& eeimg=&1&&对于任意样本x应该有&img src=&/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=&/equation?tex=f_1& alt=&f_1& eeimg=&1&&和&img src=&/equation?tex=f_2& alt=&f_2& eeimg=&1&&其实是两个不同,但是domain指向相同的任务。而Dual Learning中&img src=&/equation?tex=f& alt=&f& eeimg=&1&&和&img src=&/equation?tex=g& alt=&g& eeimg=&1&&是对偶任务,利用的隐含约束是&img src=&/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&&img src=&/v2-9e7396ebccb7c42302fc97_b.png& data-rawwidth=&838& data-rawheight=&216& class=&origin_image zh-lightbox-thumb& width=&838& data-original=&/v2-9e7396ebccb7c42302fc97_r.png&&&p&X和Y分别是两种不同类型图的集合,比如穿衣服的女优和没穿衣服的女优。所以给定一张穿了衣服的女优,要变成没穿衣服的样子,就是个图片翻译问题。CycleGAN示意图中(b)和(c)就是Dual Learning:&/p&&img src=&/v2-de51cac58b_b.png& data-rawwidth=&347& data-rawheight=&62& class=&content_image& width=&347&&&p&在Dual Learning基础上,又加入了两个判别器&img src=&/equation?tex=D_X& alt=&D_X& eeimg=&1&&和&img src=&/equation?tex=D_Y& alt=&D_Y& eeimg=&1&&用来进行对抗训练,让翻译过来的图片尽量逼近当前集合中的图片:&/p&&p&&img src=&/v2-e0ea7a6b38bf2a20cea4ea6f741a4c67_b.png& data-rawwidth=&442& data-rawheight=&59& class=&origin_image zh-lightbox-thumb& width=&442& data-original=&/v2-e0ea7a6b38bf2a20cea4ea6f741a4c67_r.png&&全考虑一起,最终的loss是:&/p&&p&&img src=&/v2-e6d99e7edea969da3dad_b.png& data-rawwidth=&357& data-rawheight=&87& class=&content_image& width=&357&&也许有人会问,那不加cycle-consistency,直接用GAN学习一个&img src=&/equation?tex=X%5Crightarrow+Y& alt=&X\rightarrow Y& eeimg=&1&&的映射,让生成的Y的样本尽量毕竟Y里本身的样本可不可以呢?这个作者在文中也讨论了,会产生GAN训练中容易发生的mode collapse问题。mode collapse问题的一个简单示意如下[1]:&/p&&p&&img src=&/v2-309fce6329592babb784ed_b.png& data-rawwidth=&842& data-rawheight=&262& class=&origin_image zh-lightbox-thumb& width=&842& data-original=&/v2-309fce6329592babb784ed_r.png&&上边的是真实分布,下边的是学习到的分布,可以看到学习到的分布只是完整分布的一部分,这个叫做partial mode collapse,是训练不收敛情况中常见的一种。如果是完全的mode collapse,就是说生成模型得到的都是几乎一样的输出。而加入Cycle-consistency会让一个domain里不同的样本都尽量映射到另一个domain里不同的地方,理想情况就是双射(bijection)。直观来理解,如果通过&img src=&/equation?tex=X%5Crightarrow+Y& alt=&X\rightarrow Y& eeimg=&1&&都映射在Y中同一个点,那么这个点y通过&img src=&/equation?tex=Y%5Crightarrow+X& alt=&Y\rightarrow X& eeimg=&1&&映射回来显然不可能是多个不同的x,所以加入cycle-consistency就帮助避免了mode collapse。这个问题在另一篇和CycleGAN其实本质上没什么不同的方法DiscoGAN中有更详细的讨论[11],有兴趣的话可以参考。&/p&&br&&p&有一点值得注意的是,虽然名字叫CycleGAN,并且套路也和C-GAN很像,但是其实只有adversarial,并没有generative。因为严格来说只是学习了&img src=&/equation?tex=X%5Crightarrow+Y& alt=&X\rightarrow Y& eeimg=&1&&和&img src=&/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&&img src=&/v2-57eaadc8cec5190bfd30_b.png& data-rawwidth=&758& data-rawheight=&207& class=&origin_image zh-lightbox-thumb& width=&758& data-original=&/v2-57eaadc8cec5190bfd30_r.png&&其实就是两个GAN结构,其中生成网络和判别网络中比较高层的部分都采用了权值共享(虚线相连的部分),没有全职共享的部分分别处理不同的domain。这样每次就可以根据训练的domain生成一个样本在两个domain中不同的对应,比如戴眼镜和没戴眼镜:&/p&&p&&img src=&/v2-356a6118ccf3e8e3bf1c7_b.png& data-rawwidth=&791& data-rawheight=&267& class=&origin_image zh-lightbox-thumb& width=&791& data-original=&/v2-356a6118ccf3e8e3bf1c7_r.png&&分别有了共有特征和各自domain特征,那么做mapping的思路也就很直接了[14]:&/p&&p&&img src=&/v2-8ac50600e40feaac345e09bd7e05a83d_b.png& data-rawwidth=&771& data-rawheight=&210& class=&origin_image zh-lightbox-thumb& width=&771& data-original=&/v2-8ac50600e40feaac345e09bd7e05a83d_r.png&&在GAN前边加了个domain encoder,然后对每个domain能得到三种样本给判别器区分:直接采样,重建采样,从另一个domain中transfer后的重建采样。训练好之后,用一个domain的encoder+另一个domain的generator就很自然的实现了不同domain的转换。用在图像翻译上的效果如下:&/p&&p&&img src=&/v2-612e9cf5e125fd626be7db_b.png& data-rawwidth=&444& data-rawheight=&544& class=&origin_image zh-lightbox-thumb& width=&444& data-original=&/v2-612e9cf5e125fd626be7db_r.png&&还有个巧妙的思路,是把CoGAN拆开,不同domain作为C-GAN条件的更加显式的做法[15]:&/p&&br&&p&&img src=&/v2-ddec16d502c94f91ea35_b.png& data-rawwidth=&883& data-rawheight=&398& class=&origin_image zh-lightbox-thumb& width=&883& data-original=&/v2-ddec16d502c94f91ea35_r.png&&第一步用噪声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&&br&&h2&给女优穿上衣服&/h2&&p&其实同样没什么好说的,Cycle-GAN和pix2pix的作者是一拨人,文档都写得非常棒,准备好数据,分成穿衣服的和没穿衣服的两组,按照文档的步骤训练就可以:&/p&&p&Torch版Cycle-GAN:&a href=&/?target=https%3A///junyanz/CycleGAN& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&junyanz/CycleGAN&i class=&icon-external&&&/i&&/a&&/p&&p&pyTorch版Cycle-GAN(pix2pix二合一版):&a href=&/?target=https%3A///junyanz/pytorch-CycleGAN-and-pix2pix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&junyanz/pytorch-CycleGAN-and-pix2pix&i class=&icon-external&&&/i&&/a&&/p&&p&Cycle-GAN收敛不易,我用了128x128分辨率训练了穿衣服和没穿衣服的女优各一千多张,同样是默认参数训练了120个epoch,最后小部分成功“穿衣服”的结果如下:&/p&&img src=&/v2-fee34d66c386e0e01e5804_b.jpg& data-rawwidth=&1117& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&1117& data-original=&/v2-fee34d66c386e0e01e5804_r.jpg&&&img src=&/v2-de57c5ebefa4251ee3caa1_b.jpg& data-rawwidth=&1117& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&1117& data-original=&/v2-de57c5ebefa4251ee3caa1_r.jpg&&&p&虽然都有些突兀,但好歹是穿上衣服了。注意马赛克不是图片里就有的,是我后来加上去的。&/p&&p&那么,脱衣服的例子在哪里?&/p&&img src=&/v2-480fb8a4dcfc7a4f92ec_b.png& data-rawwidth=&75& data-rawheight=&60& class=&content_image& width=&75&&&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=&/?target=http%3A//torch.ch/blog//gan.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Torch | Generating Faces with Torch&i class=&icon-external&&&/i&&/a&&/p&&p&[3] A. B. L. Larsen, S. K. S?nderby, H. Larochelle, and O. Winther. Autoencoding beyond pixels using a
learned similarity metric. In ICML, pages , 2016.
&/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&&br&&p&[9] &a href=&/?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&i class=&icon-external&&&/i&&/a&&br&&/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&&br&&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&&br&&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&&br&&p&&b&3)&/b&预训练模型有没有?有,但是我研读了中华人民共和国刑法第三百六十三、三百六十四和三百六十六条,完全读不懂,所以还是不提供。再说就算我提供了,根据1)和2),看到你想看的内容也是需要运气的。&/p&&p&另外特别感谢赞赏的知友们,这篇文章是想说&b&书中自有颜如玉&/b&,而知友们的赞赏让我知道&b&书中真有黄金屋&/b&,古人诚不我欺…&/p&
作为一名久经片场的老司机,早就想写一些探讨驾驶技术的文章。这篇就介绍利用生成式对抗网络(GAN)的两个基本驾驶技能: 1) 去除(爱情)动作片中的马赛克2) 给(爱情)动作片中的女孩穿(tuo)衣服 生成式模型上一篇《》中已经简单介…
谢邀。&br&&br&《洗龙》&br&&br&1、&br&“三爷,您这身鳞,可真是世间罕见啊!”&br&&br&我揉搓着澡巾,站在洗龙池里啧啧称赞。&br&&br&三爷缓缓挪动硕大的龙头,半睡半醒的眯起眼看我,老神在在的打趣说:“嗨,我也就是沾了出生在东海的光,不像那些北岛上的,打小就从泥浆里泡着。”&br&&br&我点头称是,顺带拍了拍他的龙脊,说:“转个身儿,给您搓搓肚子。”&br&&br&三爷慢悠悠的翻身,青亮的龙鳞摩擦起一阵水雾,朦胧中,露出白花花的柔嫩龙肚。&br&&br&“小泥鳅啊,使点劲儿。”&br&&br&他又懒洋洋的闭上双眼,四爪朝天,龙角触地,咧开一张密布獠牙的大嘴,模样别提有多舒坦。&br&&br&“请好吧您嘞~!”&br&&br&我吆喝着,弯起胳膊肘蹭去额头的汗,再将双掌叠放在他的龙肚上,开始卖力搓动。&br&&br&片刻后。&br&&br&“三爷,行了。”&br&&br&我抖落掉澡巾上的污垢,拍了拍三爷的肚皮。&br&&br&他打了个哈欠,足有数丈之长的龙身轻灵一跃,便顺势落入沸腾翻滚的浣龙泉之中。&br&&br&下一刻。&br&&br&龙头率先出水,再是龙身,龙尾。&br&&br&通体青绿如玉,净无瑕疵。&br&&br&三爷悬于空中,转头对我呲牙一笑:“走了,小泥鳅啊,下回爷来了,还找你搓背。”&br&&br&我挥手与他告别,陪着笑脸儿说:“我随时恭候大驾,三爷,慢走啊!”&br&&br&下一刻。&br&&br&一条青龙,扶摇直入九霄。&br&&br&漫天挥洒纤毫细雨,云海之中,雷霆滚滚。&br&&br&隐有龙鸣不止。&br&&br&2、&br&我叫年余,小名泥鳅,做的是堂倌营生。&br&&br&且不要小瞧了这“堂倌”二字,虽然民间俗称“搓澡”,但我这一行截然不同。&br&&br&因为我只给龙搓背。&br&&br&整间澡堂不大,只有洗龙池与浣龙泉两座池子,可洗龙手法却甚是考究。&br&&br&首先,要顺着龙角下三寸,搓洗掉角根污垢,再用刀具将龙角刮擦雪亮,力求焕然一新。&br&&br&其次,龙鳞间隙易进灰尘,尤其是三爷这种东海青龙,整日翱翔于云空,沾染的风尘多,更是容易显脏,需要我用手指伸进每片龙鳞下,细心揉搓,才能将顽固泥垢尽数清除。&br&&br&最后,劲儿不能差。&br&&br&一身龙鳞坚硬犹如金甲,非自小练就的特殊掌力,常人只怕用手指轻轻一触,便会被锋利如刀的龙鳞划出一道血口子。&br&&br&总而言之,洗龙这份差事不易做。&br&&br&但我坚信,三百六十行,行行出状元。&br&&br&只要用心,哪怕是条北岛上的脏龙。&br&&br&我也能给他洗的干干净净,保管他龙颜大悦。&br&&br&下回还来。&br&&br&3、&br&于我而言,经手洗过的龙不少。&br&&br&也曾有地蛟来此找我搓澡,想成龙前洗去一身疲惫,好精神抖擞的去赴那九雷天劫。&br&&br&但平心而论,一身龙鳞不论质地优劣,个中出类拔萃者,又当属三爷最佳。&br&&br&三爷化龙前,曾是东海的一只蛟。&br&&br&古语有云:&br&&br&蛟,龙之属也。&br&&br&池鱼,满三千六百,蛟来为之长,能率鱼飞置笱水中,即蛟去。&br&&br&大意是说,嗯。&br&&br&三爷很厉害的意思。。。&br&&br&他成龙前,便常在我这洗澡,一来二去相谈甚欢,言语间就与我少了许多生分。&br&&br&不像那些腥气熏天的北岛地龙,个个遍体泥泞不说,就连脾气都和圈养的母猪一般臭。。。&br&&br&由此说来,顾客里,我最亲近的还是三爷。&br&&br&可等修够了年岁,化作青龙后,三爷却很少来了。&br&&br&原因我从来不问,只是在他的龙角之下,曾发现过缕缕血迹。&br&&br&龙的厮杀,不像凡人所想那般神通广大,更多拼的是一种蛮力。&br&&br&像山羊,以角相怼。&br&&br&为的自然是赢取母龙芳心,胜者可与母龙耳鬓厮磨,共谱一段佳话。&br&&br&而败者,必要自断龙角,千年内不能腾空,哪怕驾一朵云,也要遭众龙耻笑,不复昔日威严。&br&&br&但我想,如三爷这般清心寡欲的龙,应该不会为了母龙而奋力厮杀吧?&br&&br&因为他曾跟我说:&br&&br&“小泥鳅啊,你可知成龙后,哪怕天天有母龙围着你转,但最闹心的事情是什么吗?”&br&&br&我当时懵懵懂懂的摇头反问:“是什么。。?”&br&&br&三爷叹了口气,像兽吼却又尖锐刺耳,从斗大的鼻孔里喷出两条白烟。&br&&br&他仰天望日,只说了三个字:&br&&br&“寂寞啊。。”&br&&br&4、&br&这天,三爷突然造访。&br&&br&他化作人形,扶着门框颤巍巍的进来,像喝多了酒。&br&&br&我赶忙上前扶住他,关切的问:“三爷,您这是怎么了?”&br&&br&“泥鳅,先别问,给爷去泡壶茶。”他摆摆手,一屁股墩坐在地板上,震的房梁落灰不止。&br&&br&我刚要欠身去找茶壶,突然惊觉三爷身后,拖拽着一条触目惊心的猩红血迹。&br&&br&“三爷,这血,血,是您的?”我的嗓子发抖,别过头问他。&br&&br&谁知三爷喘起粗气,面色骤然苍白如纸,他咬着牙说:“泥鳅,爷的话你信不信?”&br&&br&我毋庸置疑的点头:“信。”&br&&br&他俊朗的脸颊抽搐着,好似痛苦万分,“若信,你就别问!”&br&&br&我怔怔看着三爷颓然的背影,他的脊梁中正不断涌出股股血液,顷刻间染红了翠绿长衫。&br&&br&情况似乎比我预想的还要复杂万分。&br&&br&我从胡思乱想中回过神来,忙不迭的去寻茶壶,却在转身的刹那间,听到一声闷响。&br&&br&再回首,三爷倒在血泊之中。&br&&br&我迈步冲过去,一把将他抱起,厉声呼喊:“三爷,三爷,您醒醒?!”&br&&br&三爷睁开混沌的双眼,再无往日调侃时的神采奕奕,嗫喏着说:“泥,泥鳅,再给我搓一次澡吧。。”&br&&br&我分不清是突发眼疾,还是心思所致,凝望着三爷竟让我泪如泉涌,刹那间模糊了视线。&br&&br&“三爷,您到底是怎么了?”&br&&br&三爷迟疑的摇头,艰难的抬手指向北方。&br&&br&“北岛龙乱,神,神派我去平反,不料地蛟倾巢而出,将我围困在岛上,抽,抽了我的。。”&br&&br&他说到这,竟哽咽的厉害,一排洁白牙齿,似要硬生生咬碎。&br&&br&我失声追问:“抽了什么?!”&br&&br&三爷低下头,脸上的怅然愈发浓郁,他缓缓伸手摸向后背,低声悲吼:&br&&br&“龙筋!”&br&&br&5、&br&夕阳半轮如坠池中,待微风缕缕吹过,水里便漾开了层层叠叠的晚霞。&br&&br&沸汽弥漫,三爷幻化回龙,安静的躺在洗龙池边。&br&&br&我端起木盆走近,将热水缓缓淋在三爷的身上。&br&&br&“三爷,烫不烫?”我问。&br&&br&三爷眯着眼,龙头摇动间,轻声呢喃:“正好。。”&br&&br&我拿起澡巾,撸起袖子,沉声说:“今儿就不那么用劲了。”&br&&br&“别。”三爷打断我,咧着嘴角说:“搓一寸,是一寸的劲,一分都不能少。。”&br&&br&“那您可要撑住咯。”我抬起头,深呼吸,尽量平复焦躁的内心。&br&&br&这恐怕会是最后一次给三爷搓背。&br&&br&旋即,我按部就班的拉开架势,伸出手指轻轻掀起三爷的一片龙鳞。&br&&br&夕阳下,薄如蝉翼的龙鳞几近透明,依旧不减丝毫锋利,只是沾染上一层淡淡的褐红,分不清是映照的晚霞,还是血。&br&&br&我注视着三爷龙脊上撕裂的伤口,迟迟不肯下手。&br&&br&三爷虚弱的问询悠悠传来:“泥鳅,怎么愣着不动啊。。?”&br&&br&我如实回答:“三爷,我,我下不去手。。”&br&&br&“泥鳅,你别害怕,我不打紧,人命由天,真龙亦然,我不会有事的。”&br&&br&话虽如此,我却是不信的。&br&&br&老天爷要收谁,便好似何时刮风下雨,全凭他一人说了算。&br&&br&人也好,龙也罢,不都是要渡劫才能成就正果?&br&&br&三爷已经度过天劫,可这死劫,又该如何度?&br&&br&我想不通,索性不再多虑,将双手绕过三爷的龙脊伤口,轻轻叠放在一侧。&br&&br&双臂蓄力,迎鳞而上,我搓的异常沉稳。&br&&br&一寸劲,不多也不少,恰如其分。&br&&br&但三爷的声音却渐渐羸弱,弥留间,他的龙脊处血流成河,斑驳的龙头暗淡无光,好似仅卧在池边,就耗尽了他的全身力气。&br&&br&有谁真正见过,一条龙是如何死去的吗?&br&&br&像冬雪,春来时无声消融。&br&&br&又像窗棂上的白霜,一夜凝结,却在日出时分,不复朦胧。&br&&br&我用力的搓着,时而小心翼翼的掀开龙鳞,拿指尖轻轻撩去灰尘。&br&&br&时而又摸出刀具,替三爷刮去龙角上的污垢。&br&&br&他的龙尾耸拉无力,而龙头处,柔顺的两根龙须贴在地上,软塌塌的毫无一丝灵气。&br&&br&他紧闭着双眼,就连露出苍凉的目光,似乎都成了一种奢侈。&br&&br&不知过了多久。&br&&br&我搓着搓着,双手之下,除了澡巾,再无一物。&br&&br&我愣在原地,想起三爷的笑容,想起他飞入云霄时的壮阔。&br&&br&一瞬间,心如石坠。&br&&br&等我回过神来,只见缤纷的白碎如素湍一样徐徐飞过。&br&&br&漫天都是三爷。&br&&br&6、&br&我在洗龙池边静坐了整整一夜,于破晓时分,才怅然若失的起身。&br&&br&只见面前的洗龙池内,龙血掺杂进水,早已混肴不清。&br&&br&我凝望着满池的红汤,恍惚中又觉得这是三爷遗留的眷念。他生而为蛟,修炼千年化身成龙,却在拼杀中被硬生生抽去龙筋。&br&&br&若论龙之奇耻大辱,莫过于此。&br&&br&但我又能做什么?我不过是一介凡人,只是会点儿给龙搓澡的本事罢了。&br&&br&难不成要拿肉身,去跟坚硬的龙躯相抗?&br&&br&想到这,我笑了,仰止不住的疯癫大笑。&br&&br&可我笑着笑着,又突然想哭。&br&&br&所有顾客里,只有三爷曾厚待我,其他的龙,从不把我放在眼里。&br&&br&人之心愿,不一定会上达天听,但遇到艰难险阻,总归要去试一试。&br&&br&不然谁又能知道结果呢?&br&&br&于是我背起行囊,站在洗龙池边轻声祈求:&br&&br&“三爷,小泥鳅虽然惜命,但不是不讲义气的人,这趟远门是福是祸,您可得佑着我点儿,万一我真遇上事儿,到了那边,一样给您搓背。”&br&&br&说罢,那一汪血池内忽而翻起细小浪花,水珠滴落间,好似冥冥中自有天意。&br&&br&我深深错愕,又苦笑着补上一句:“您放心,咱不差劲儿。”&br&&br&洗龙池重归平和,好似一面红镜。&br&&br&我转过身,头也不回,就此踏上征程。&br&&br&走在路上,我想了很多。&br&&br&也许多年以后,人间会有这样的传闻:&br&&br&南山曾有一堂倌,号泥鳅,年方及冠,一身搓澡技艺已是炉火纯青。&br&&br&然泥鳅有一至友,乃青龙三爷是也,岂料与地蛟搏战后,痛失龙筋,不日殒命。&br&&br&泥鳅悲愤之际,以凡胎肉体,勇往恶蛟所居之北岛。&br&&br&欲斩龙足,嚼龙肉。&br&&br&寻龙筋。&br&&br&7、&br&沿途我经过多番打探,才从路人口中,得知了北岛的大体概况。&br&&br&据说,北岛属东海以西,南山以北,为四面环海之地。&br&&br&于海之前,另有一座大山,横拦而成天险。&br&&br&名曰:烨山。&br&&br&而在大山之前,还有一条大江,如同天工手笔,宽约百丈,且万分汹涌,非人力所能蹚渡。&br&&br&因沿岸百姓信奉天工之神,故称其为,工神江。&br&&br&由此说来,我要先过江,再翻山,才能入海,以登北岛。&br&&br&可等我出了澡堂,来到依江而建的一座城池,却率先犯了难为。&br&&br&不为别的,自然是出门时太过匆忙,忘记带上盘缠。&br&&br&“还真是一分钱难倒搓澡汉。。。”&br&&br&我嘀咕着,顺手摸向咕咕直叫的肚子,站在一家面馆前望而却步。&br&&br&老板抄起汤勺搅动锅里的热腾汤面,生怕旁人听不清似的,还非得大声吆喝:“来诶,好吃的面嘞~!一碟酸甜可口的腌咸菜,配一碗热气腾腾的暖胃面嘞~”&br&&br&我默念忍字诀,强行挪开步子,谁知那老板却吆喝的更加起劲儿:“诶~吃一碗还想第二碗诶~走过路过,填饱肚子才有劲儿诶~”&br&&br&呵呵,我泥鳅虽然饿的前胸贴后背,但岂是那轻易言败之人?!&br&&br&于是我大手一挥,朝老板卯足了劲儿,怒声大吼:&br&&br&“老板,来一碗面!不要葱花,多放醋!”&br&&br&“好嘞~客官您请坐,汤面即刻就好!”老板眉开眼笑的回应着,顺手就往锅里下面,生怕我反悔似的,动作别提有多麻利。&br&&br&约莫一炷香之后。。。&br&&br&“老板,再来一碗。。嗝。。”&br&&br&我揉着肚子,只觉得五脏庙还欠点儿香火。&br&&br&老板啧啧摇头,收起我面前的碗,说:“客官,您这可都第三碗了,还要啊?”&br&&br&我皱着眉头反问:“怎地,没吃饱不行啊?”&br&&br&“行行行,马上就来啊!”老板把毛巾往肩膀上一搭,忙不迭的去煮面。&br&&br&等第四碗面下肚,我站起身,将双手撑在桌子上,转头四顾后,瞅准机会刚想开溜。&br&&br&突然!&br&&br&一声稚嫩的呼喝从身后响起,惊的我十指深深嵌入桌木之内,脆弱的木板当即由我指尖处,蔓延出丝丝裂纹,如久旱之地,龟裂丛生。&br&&br&“爹!有人想吃霸王餐!!”&br&&br&我寻声转头望去,竟是一个模样娇俏的女孩儿。&br&&br&她鼻梁高挺,下巴圆润,肌肤水嫩比之羊脂白玉也不遑多让。&br&&br&我盯着她咽了口唾沫,呆愣在原地,是走也不是,站也不是。&br&&br&那姑娘目露深深惊恐,又怯生大喊:&br&&br&“爹!”&br&&br&老板双手握持菜刀,气势汹汹的冲到近前,朝我瞪圆了一双铜铃大眼,怒声发问:&br&&br&“咋了闺女?!”&br&&br&我本以为这俊俏姑娘,是对我非比寻常的过人指力,心生惊疑。&br&&br&谁知她一手捂嘴,一手指着我的双掌,放声娇呼:&br&&br&“他还把咱家桌子给抠烂了!”&br&&br&8、&br&星垂平野,月悬中天。&br&&br&面馆内,我站在父女俩身前,打定了主意悉听发落。&br&&br&俊俏姑娘掰着手指头,如数家珍:&br&&br&“一碗面三文钱,你吃了足足四碗。一张木桌十二文钱,你给抠的烂乎乎。统共二十四文钱,何时补齐才算完。”&br&&br&我无比汗颜的低下头去,偷偷瞄向老板。&br&&br&他仰起脸,用手里的菜刀不停拍打臂膀,面露凶狠,好似杀猪的屠户。&br&&br&于是我轻声解释说:“姑娘,您这算术可真好,小生着实佩服。但我离家时太过匆忙,忘带了盘缠,所以能否看在。。”&br&&br&姑娘冷哼着打断:“不能!这过日子就得精打细算,大手大脚那是富贵人家,像我父女俩这等小本营生,吃喝衣住全在一分一文里出,你别墨迹,欠债还钱,乃是天经地义之事!”&br&&br&“行了行了。”老板急不可耐的说:“闺女,依我看啊,让这小子洗上个把月的碗,权当补账了。”&br&&br&话说完,他又眯眼看着我问:“诶,小子,你是做何行当的?”&br&&br&我连忙应答:“小生是南山一名堂倌。”&br&&br&“哟,堂倌?”老板挑起眉毛,饶有兴致的再问:“手艺如何?”&br&&br&我苦笑着撸起袖子:“一试便知。”&br&&br&良久。。&br&&br&“再往左边儿一点,诶诶对对对,就是这,使劲儿!”&br&&br&老板坐在浴桶里,握着菜刀往胸口淋水。&br&&br&我遵照指引,在他的后背上轻轻揉搓。&br&&br&人之肌肤,与青龙迥然不同。&br&&br&然而老板常年做苦力,黢黑皮肤中又满是积郁的湿气,经我双手搓掉的泥灰污浊不堪,且长如蚯蚓,看的我直犯恶心。&br&&br&于是我忍不住出言指点:“老板,我斗胆说一句,您以后尽量远离灶台,尤其还得勤洗澡。”&br&&br&“咋了?”他回脸看我一眼,目露疑惑。&br&&br&我将澡巾递到他眼前,耐心解释:“您看啊,这搓掉的灰得有半指长,证明您肌肤闭塞,不常搓澡。再说泥灰的颜色,暗而深,乃是湿气积多的表象。由此,小生敢大言不惭的问一句,您平日里,是否常感腰酸背痛,体虚乏力?”&br&&br&于我而言,这些不过是搓澡过程中,最为浅显的经验之谈。&br&&br&毕竟做一行,要爱一行。&br&&br&但于老板而言。。。&br&&br&“乖乖,你当真只是个搓澡的?!”老板瞪大了眼珠子,满脸不可思议。&br&&br&“呃。。”我略作沉吟,点点头:“如假包换。”&br&&br&老板猛地从桶里站起,将水花扑腾的满地都是。&br&&br&我受惊之下,还未有所反应。&br&&br&只听他朝门帘外大声呼唤:&br&&br&“闺女!快!去把邻居们都叫来!!”&br&&br&片刻后。。&br&&br&“嗨呀!舒坦~!”&br&&br&老板揉着臂膀,着一件宽大麻衣,袒露胸腹,大摇大摆的迈出门去,活脱脱像是玩畅快的大爷。&br&&br&我咬着牙,凝望聚集在门前的一众老少爷们儿,着实欲哭无泪。&br&&br&但见老板侧开身,朝众位邻里拱手,豪言道:&br&&br&“今儿个,鄙人请搓澡,大家伙放心,不花钱!”&br&&br&我心心念念,全是要去北岛寻龙筋。&br&&br&却只能眼睁睁的看着一群男女老少,蜂拥而上。&br&&br&是连想死的心都有了。。。&br&&br&9、&br&一听老板说请客搓澡,众人皆排起等候的长龙。&br&&br&我挨个伺候着,心中起先略有抱怨,但也在过程中渐渐消磨了烦躁。&br&&br&这搓澡即是我安身立命的本钱,是我赖以度日的本分,更是我所仰仗的名声,自然马虎不得。&br&&br&所以我给每个素未谋面的陌生人,都搓的异常用心。&br&&br&每寸劲,都实打实的贴着肌肤,一上一下,缓而不急。&br&&br&趁擦汗的空当,我回忆起为龙搓背时的情景,深感个中迥异。&br&&br&龙之肌肤,比不得人细腻。&br&&br&尤其是苍龙,鳞片大小不均,心性也是最凶,略有不悦便会龙颜大怒,得小心翼翼的伺候着不说,还得确保搓澡中不出差错,每一下都按照它的心意来。&br&&br&地蛟虽恶,却不拘小节,他们不管你劲力足不足,只在乎洗的干不干净,然我并不否认,某些恶蛟确实脾气极臭,但大多数都像顽劣的孩童,从不过分计较。&br&&br&可给人搓背,却是另有讲究。&br&&br&就拿我面前这位客栈老板来说,他背部光滑,鲜有粉刺,再观面相更是油红似白,搓澡期间却多次抱怨生意惨淡,且赌博手气不佳,晚上输了不少银子,言谈中又颐指气使,尽是优越。&br&&br&于他而言,我便是可供差遣的下人,不必正眼相待,所以我搓的满心厌恶。&br&&br&反观上一位摊饼的汉子,每日起早贪黑,为了膝下一儿一女赚取辛苦的糊口费,虽然背如荒地,粗粝不堪,但语气平易近人,说起话来极有教养。&br&&br&我于是为他多搓了半刻,也更舍得下功夫。&br&&br&两相比较,高下立判。&br&&br&世间以小见大的事情甚多,别的行当我不敢造次,但仅搓澡一门,我若说以背能观心,只怕无人敢出言反驳。&br&&br&为街坊邻里们搓完背,已是午夜时分。&br&&br&我收拾了澡间,换了一身利索衣物,背着行囊走向面馆前院。&br&&br&老板还未睡,正坐在摇椅上举杯邀月,口中含糊不清,也不知在说些什么。&br&&br&那俊俏姑娘端了一碗热气腾腾的汤面,低着头走到我身边,看我的眼神中再无不屑,反而多了几分真诚。&br&&br&她好似鼓足了勇气,将面举到我眼前,柔声说:“累了一晚上,吃碗面吧。”&br&&br&我看着那碗面,还真觉得有些饿了,便朝姑娘点点头,一把接过碗,不顾吃相的狼吞虎咽。&br&&br&“你慢点儿。”姑娘柔声宽慰,“没人跟你抢。”&br&&br&“嗯。”我囫囵吞枣的应着,却吃的更急了。&br&&br&姑娘于是笑出了声,扶着腰问:“你叫什么啊?”&br&&br&我咽下一大口面条,头也不抬的说:“叫我泥鳅就行。”&br&&br&“泥鳅?”姑娘长大了嘴,苦笑说:“你这名字可真够接地气儿。”&br&&br&我咧了咧嘴,却差点儿被噎着,急忙捶胸顿足,那姑娘看我狼狈不堪的样子,竟乐完了腰,花枝乱颤间笑声愈发银铃悦耳,脆脆如蝉鸣。&br&&br&月光下,她一袭素衣,美貌脱俗。&br&&br&如同不慎下凡的瑶池仙子。&br&&br&我呆呆的举着碗,像傻了一样。&br&&br&正如痴如醉间,只听姑娘好奇的问:“那泥鳅,你说有要紧事,是去做什么啊?”&br&&br&我回过神来,继续低头扒面,闷声说:“去北岛。”&br&&br&谁知姑娘竟哑然失笑,站在原地,瞪大一双美目。&br&&br&“你说你要去哪儿?”她好似没听清楚,但嗓音却开始不自觉的发颤。&br&&br&我擦着嘴角,皱起眉头反问:“去北岛啊,怎么了?”&br&&br&姑娘脸色当即发白,她深深的看我一眼,转过身,留给我一道黯然削瘦的背影,漫步走回堂屋,好似丢了魂儿一样。&br&&br&我不明所以的咽下最后一口面,只听大醉酩酊的老板,躺在长椅上似梦中呓语,轻声呢喃:&br&&br&“娘子啊,嗝,好酒。”&br&&br&&br&10、&br&这夜,我辗转难眠。&br&&br&实在无心安睡后,我索性起身,依靠着门栏托腮凝思。&br&&br&关于未来如何,我并没有那么多的深谋远虑。&br&&br&对人对事,更是远远谈不上心思活算。&br&&br&在南山整日为龙搓背,说难听些,无异于闭门造车,此次来到江城,已是我人生中行至最远的一处。&br&&br&这般想着,我渐渐意志有些消沉,前途未卜,寻龙筋看似简单,实则不是仅凭一腔热血就能达成的壮举。&br&&br&一看天色,时辰确是不早了,我叹口气,刚要回屋躺下,却听到一声娇柔的轻呼:&br&&br&“泥鳅,睡了么?”&br&&br&我连忙转身回望,竟是俊俏姑娘,她手里提着布包,一身出行打扮。&br&&br&见此情形,我很是心惊,便疑惑发问:“姑娘,你这是?”&br&&br&她抬起头,看着我的眼里有泪,泪中更有掩藏不住的期许。&br&&br&“我想和你一起去北岛,最好即刻启程。”&br&&br&听了这话,我呆立当场,急切的开口劝说:“我虽去北岛,但此趟万分凶险,所为的事情也不便与旁人说。非是我小瞧了你,实在是你去不得。”&br&&br&“不。”姑娘摇头,神情执着,“你不知道我为何要去。”&br&&br&我怔怔凝视她的决然面容,月色朦胧,恰似寒风过境,平添一抹袭人的清冷。&br&&br&良久,姑娘叹口气,独自走向院门。&br&&br&她似乎打定了主意,要一个人去北岛。&br&&br&我不知她是何动机,更不能让她独身前往,无奈下只好狼狈的抱起衣服,背着行囊快步跟上。&br&&br&马不停蹄的出了城门,在江边,姑娘渐渐放慢了步子,我走在她身后,一时间相顾无言。&br&&br&耳畔浪涛翻涌,于夜色中更具澎湃,树林沙沙作响,枝影虚晃间徒显大风飘摇。&br&&br&我将行囊抱在胸口,艰难的走到姑娘身侧,一步一步的沉默向前,却未曾感到丝毫有人相伴的喜悦。&br&&br&“你知我为何执意要去北岛么?”&br&&br&姑娘忽然开口问。&br&&br&我摇头,紧了紧肩上的行囊说:“愿闻其详。”&br&&br&姑娘轻吐一口长气,单薄背影微微颤动。&br&&br&于是她转身面向我,娓娓道来:&br&&br&“三年前,我突发癔症,父亲为我在城中四处求医未果,后来偶然结识一名江湖郎中,我的母亲忧我心切,便轻信了郎中的妄言,只身前去北岛寻草药,至此,已经整整三年杳无音信。”&br&&br&听了她的叙述,我微微错愕,便问:“那你的病?”&br&&br&姑娘侧过脸,双手提着布包,耸肩讪笑说:“在母亲失去音信后,竟日渐不治而愈,我也不知是该喜,还是该忧。其实我本打算再过几日,便去北岛寻找母亲,正巧你的出现,让我下定决心提前动身。”&br&&br&“哎!”我重重叹息,对她的勇气倍感钦佩,却又以她所言为引,不由勾起了我对三爷的执念。&br&&br&想来,我和这姑娘是同病相怜,却各有所求。&br&&br&她去北岛,为寻亲母。&br&&br&我去北岛,为寻龙筋。&br&&br&殊不知,哪个更伟大些?&br&&br&我心里胡思乱想着,姑娘已经先我一步向前。&br&&br&“姑娘,等等!”我叫住她,这才想到还不知她的名讳。&br&&br&姑娘疑惑着停脚,轻声询问:“怎么了?”&br&&br&我微微弯腰,拱手作揖,遵照礼数恭声说:“敢问姑娘芳名,小生这厢有礼了。”&br&&br&姑娘浅浅一笑,嘴角漾起半分娇羞,掺杂着半分月色,好似晨间雾漫下含苞的花蕊。&br&&br&而后,她欠身施了个万福,柔声应道:“小女子名叫一朵,公子不必多礼。”&br&&br&一朵姑娘?&br&&br&妙哉。&br&&br&我细细品味她的名字,只觉得这小姑娘年纪轻轻,肩上所担责任,足有千斤沉,万斤重。&br&&br&等我回过神来,两侧的密林早已过眼而退。&br&&br&一条大江,好似银河泄地。&br&&br&怒涛翻滚间,映照满天星斗。&br&&br&生生不息。&br&&br&11、&br&来到江堤,已是黎明。&br&&br&我迎着凛冽寒风,与一朵驻足于渡口。&br&&br&遥遥望去,满江银波,被朝阳烘上一层淡淡的红晕,仿佛一卷浸染朱砂的百丈丝绸。&br&&br&又见许多渔船扬帆归来,起浮于波涛之中,好似一闪一灭的陨陨繁星。&br&&br&可这副波澜壮阔的美景,却由不得我静心赏阅。&br&&br&我用手提着行囊,皱起眉头对一朵说:“看此情形,那些渔船也不敢跑远,一朵姑娘有没有渡江的好法子?”&br&&br&一朵将眉边秀发撩到耳后,柔声回答:“我在之前曾有所耳闻,渔夫们口口相传,早先江边有一位饲养江豚的老翁,常骑豚游江,说来也怪,其所养江豚在那湍急的江水里,竟能灵活自如,所以我就想,倘若能找到那老人家,兴许他能载我们渡江。”&br&&br&“养江豚的老翁?!”我惊呼出声,“那江豚得有多大?”&br&&br&一朵蹬起纤细的小腿,绷直了脚尖,在沙土里缓缓画圆,迟疑的说:“大概,有这么大吧。。”&br&&br&“这么大啊。。?”我怔怔注视地上歪歪扭扭的圆圈,忍不住咽了口唾沫。&br&&br&“嗯。。。”一朵面露羞怯,喏喏点头。&br&&br&我看着她煞有其事的认真模样,心觉柔柔弱弱的一朵姑娘,着实可爱。&br&&br&对此我无可奈何,只好摇头叹息:“哎,当务之急,还是先找到老翁再说吧。”&br&&br&话音方落,正巧有一位年轻的渔夫身背竹篓,向我与一朵迎面而来。&br&&br&我急忙上前拦住他,拱手说:“敢问这位小哥,附近是否有一位饲养江豚的老翁?”&br&&br&渔夫挑起眉毛,用警惕的眼神看着我反问:“你找那老翁,所为何事?”&br&&br&听了这话,我心中一喜,料定这年轻渔夫与老翁相识,便恭声回答:“我和这位姑娘想要渡江,又听闻方圆百里内,只有那位老翁有这番能耐。”&br&&br&谁知渔夫竟嘿嘿直乐:“你当真听别人这么说?”&br&&br&“那还有假!听闻老翁大名,如雷贯耳。”我陪着笑脸,心中愈发笃定。&br&&br&渔夫闻言面露欣喜,忽而抱着膀子爽朗大笑:“哈哈哈哈,既然如此,实不相瞒!没错,我正是你口中所说,方圆百里内唯一能渡江的养豚老翁!”&br&&br&我倍感错愕,打量着他全身上下,惊疑着说:“可你的年纪,是一点儿都不老啊。。”&br&&br&“我有说自己很年轻吗?”小哥目露不屑,又问:“难道你没听说过,人不可貌相,大海不可斗量吗?”&br&&br&我顿觉无比汗颜,咧着嘴说:“好像确有几分道理,但是。。”&br&&br&“行了!”小哥急不可耐的把我推开,径直往前走,“你二人到底还想不想渡江?!”&br&&br&我心中当即升起一股忐忑,遂向一朵投去询问的目光,她也显出几分犹豫。&br&&br&经过一番抉择,我只好将一朵护在身后,快步跟上年轻的渔夫,中途却不曾有一刻放松警惕。&br&&br&直到。。&br&&br&“怎样?看清楚了么?”&br&&br&渔夫站在用纱网圈出的一块池塘前,洋洋得意。&br&&br&我瞪大双眼,颤声说:“一,一朵,这江豚,可比你画的还要大啊。。”&br&&br&话说完,一只江豚见人靠近,竟欢快游曳,旋即轻灵跃出水面,凌空翻转后,又一个猛子扎入水中。&br&&br&我亲眼所见,足有八尺之长的豚身光滑如玉,形似梭箭,在日光的照耀下,褶褶生辉,有如稀世灵物。&br&&br&不仅是我,就连一朵也呆立当场,反观渔夫,则跟吃了两碗大米一样,淡定如常。&br&&br&“这下相信了吧?我便是你们口中所说的渔夫,虽然工神江确非人力所能蹚渡。”渔夫笑笑,抬手指向水中江豚,平声静气道:“但它能。”&br&&br&我强行镇定过后,试探着问渔夫:“如此说来,你愿意帮我们渡江?”&br&&br&“自然不会无偿奉献,这些豚儿,可都是我悉心养大的,而且渡江本就是一件玩命的差事,闹不好就葬身于此,所以。”渔夫忽然绕过我的视线,歪头看向一朵,轻笑着说:“事成之后,得让她嫁给我。”&br&&br&闻言我心如石坠,脱口而出惊呼道:“你说什么?!”&br&&br&渔夫撇撇嘴,懒洋洋的抱起双臂:“那你们就只能乖乖呆在岸上了。”&br&&br&我转头望向一朵,她楚楚可怜的咬着嘴唇,脸色愈发苍白。&br&&br&于是我冷笑着斥责渔夫:“哪有你这般趁人之危的?!”&br&&br&岂料渔夫还未答话,一朵却前踏一步。&br&&br&我愣在原地,恍惚中,只见她眸里突闪一丝不忍,更掺杂几分诀别。&br&&br&下一刻,一朵面朝怒涛江水,又直视年轻渔夫。&br&&br&她忽而笑靥如花,轻启朱唇:&br&&br&“好。”&br&&br&12、&br&一朵为何会答应渔夫无理的要求,我暂且不予深思。&br&&br&因此次去往北岛之行,已经远远超出我的预期。&br&&br&尤其是眼下,我死命拽着缰绳,踩在形似马鞍的木板上,愣愣看着脚下的江豚乘风破

我要回帖

更多关于 超级马里奥跑酷 的文章

 

随机推荐