如何拍出和明星一样的自拍照?斯坦福大学用卷积神经网络建模告诉你

我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

斯坦福大学Andrej Karpathy对自拍建模,用卷积神经网络研究自拍要领,发现了自拍的关键:1. 首先你得是女的,女性得分高。2. 脸要占图三分之一。3. 砍掉额头。4. 展示长发。5. 脸要过饱和。6. 要加滤镜。7. 要加边框。

原文作者:Mahdi Kalayeh ,本文由36大数据翻译组Ms. X翻译,并经由36大数据编辑发布,拒绝任何不表明译者、来源36大数据和本文连接的转载。

36大数据

卷积神经网络(convolutional neural networks)非常强大:能识别事物、地点和个人照片中的人物、标志、人、自驾车、农作物、森林和航空影像里的交通、医学图像的各种异常和其他各种有用的东西。再过一段时间,这些强大的图像识别模型也可以用来消遣和娱乐了。在这个有趣的实验中,我们要做的事情有:我们将采用最先进的参数达到140亿的卷积神经网络,从网上搜集2百万自拍照作为训练集,来训练它给自拍照进行好坏分类。为什么做这个实验呢,因为它简单,因为我们可以。而且在这个过程中,我们也会学习如何拍摄更好的自拍照。

“放心,我会去工作的,但是首先让我发张自拍照吧。”

卷积神经网络(convolutional neural networks)

在开始之前,让我们先简单介绍一下卷积神经网络(简称ConvNets)以防有些读者会困惑。可以说,假如ConvNets是强大的锤子,那么计算机视觉问题就是钉子。如果你在2015年看到或者读到任何有关计算机识别图片或视频的信息,肯定都会涉及到ConvNets。一般的例子有:

36大数据

(用到ConvNets的例子很多,上图给出的例子自左顺时针向右分别是:在街景图片中给门牌号码分类、识别医学影像中的异常、识别汉字、交通标志和面孔。)

简单介绍一下历史。ConvNets有一个很有趣的背景故事。ConvNets是由 Yann Lecun 等人在1980年代首先发现(基于 Fukushima 等人早期的一些工作)。在1993年,LeNet 1(ConvNets当时的名字)就能识别数字(链接是这个有趣的例子)。然而,这些模型大多被计算机视觉的人忽略了,因为人们认为他们不会扩展到“真实世界”的图像。直到2012年,当我们终于有足够的计算能力(GPU,感谢NVIDIA)和足够的数据(感谢 ImageNet ),Alex Krizhevsky、Ilya Sutskever和Geoff Hinton第一次验证验证了这些模型,并赢得了 2012年ImageNet挑战 (相当于:计算机视觉的世界杯),粉碎他们的竞争(16.4%的误差,对第二名26.2%的误差)。

我碰巧第一时间见证了这一重要时刻,因为在过去几年中ImageNet挑战是由 Fei-Fei Li实验室 (我所在的实验室)组织的,所以我记得当我同事在提交日志中发现ConvNet时难以置信的喘气(非常厉害)。我记得当时我们在房间里来回踱步试图去消化刚才发生的事情。在接来的几个月里,ConvNets从被怀疑笼罩的模糊模型变成计算机视觉的新星,成为几乎每一篇计算机视觉论文的核心模块。ImageNet挑战反映了这一趋势——2012年ImageNet挑战只有一个ConvNet条目,此后的2013年和2014年,几乎所有条目都使用ConvNets。同样有趣的是,每年赢得的团队会立即组建成一个公司。

在接下来的几年,我们完善、简化扩大了2012年最初始“ AlexNet ”架构(对的,我们给他们命的名),2013年有了“ZFNet”,2014年是“GoogLeNet”(理解吗?因为它像LeNet却来自Google?哈哈),以及“VGGNet”。总之,我们现在知道的ConvNets有了如下特点:

简单:从原始图像开始,一个操作一遍又一遍地重复几十次;

快速,在几十个毫秒就能处理一幅图像;

运行良好(如:这个 帖子 里演示了比GoogLeNet好的我试图分类图像的过程);

同时,ConvNets和我们大脑的视觉皮层一定程度类似(可以看 这篇论文 )。

幕后

ConvNets到底如何工作的呢?当你想探究背后的原理,你会发现一个简单的计算主题一遍又一遍的重复。下面的GIF图演示了一个小ConvNet处理的整个计算过程:

卷积神经网络

(推理过程的说明)

在左边,我们输入原始的图片。上图的左边代表我们输入的原始图像像素,我们用三维网格数字在表示。例如,一个256*256的图像表示为一个256*256*3的数组(最后的3代表红、绿、蓝)。然后我们进行卷积(convolution),这是一个奇特的方式来说我们用小过滤器在图像空间展开(slide over)。不同的过滤器对图像中不同的特征有反应:比如有些过滤器对水平边缘有强烈反应,有些可能会对有红色边缘的区域反应等等。假设我们有10个过滤器,这样我们就可以把原始图像(256,256,3)转化为一个(256,256,10)的“图像”,我们丢弃了原始图像的信息,只保留图像中对10个滤波器有反应的位置。有点像我们把三个颜色通道(红、绿、蓝)现在换成10个对过滤反应的通道(见上面右边gif图像)。

现在,我已经解释了图像激活后的第一列,那么接下来的其他所有列是什么呢?一旦产生新列,他们是完全相同的操作重复一遍又一遍。下一列将对应于另一组过滤器过滤前面产生的列,逐步检测越来越复杂的视觉模式,直到最后一组过滤器计算图像中整个视觉类的概率(如狗/蟾蜍)。显然,我略掉了一些内容,但这就是基本要点:就是从头到尾的卷积。

训练。我们已经明白一个ConvNet是由一个大量滤波器构成,但是我们怎么知道要什么样的过滤器呢?我们不知道——我们随机初始化过滤器,然后随着不断训练他们。例如,我们输入一张图片给一个有随机过滤器的ConvNet,它可能会说,54%确定那是一只狗。然后我们告诉它,实际上是蟾蜍,那么ConvNet会有一个数学过程来稍微改变过滤器,使它下次看到同一幅图像时更可能识别出是蟾蜍。然后我们用数以百万计的图像来重复这个过程上千万/上亿万次。自动的,ConvNet里的不同过滤器和计算路径将逐渐调整自己来感应图像里重要的东西,比如先眼睛,然后头部,然后整个身体等等。

36大数据

(借用 Matth Zeiler 的 卷积网络的可视化和理解 作为例子来说明训练ConvNet的12个随机过滤器。这里的过滤器在处理的第三阶段,似乎在寻找蜂巢像模式,或车轮/躯干/文本等。再一次,我们不指定滤波器,它自己生成,我们能监督。)

另一个完全训练不错的可视化ConvNet,可参见Jason Yosinski等人的 deepvis 项目。它包括一个ConvNet在你电脑摄像头里实时运行的有趣演示,Jason的这个 视频 很好的说明了(译者注:需翻墙)。

总之,整个训练过程类给孩子展示很多事物的图片,他/她必须慢慢想出通过图像中哪些特征来区分这些东西。或如果你喜欢你的解释技术,那么ConvNet只是表达了一个以过滤器为参数的从图像像素到类概率的函数,然后我们运行随机梯度下降来最优化损失函数。或者如果你碰巧对AI/大脑/奇点概念着迷,那么可以理解这个函数为一个“深度神经网络”,过滤器是神经元,完整的ConvNet是一块自适应的、模拟视觉皮层组织。

训练ConvNet

关于ConvNet最棒的事情就是你可以用你喜欢的任何图片(和一些标签)来训练它,然后ConvNet会学会识别这些标签。在我们的实验中,我们用一些好的和坏的自拍照来训练一个ConvNet,然后它会自动学会通过照片里哪些地方来把这些自拍照分成两类。所以,让我们先抓取一些自拍照吧:

1.我写了一个快速脚本来收集标有#自拍的图片。最终得到约500万张图片(对于ConvNet,总是有越多越好)。

2.我用另一个ConvNet把这些图片缩小到约200万张,至少包含一张脸。

3.现在该决定哪些自拍照是好哪些是坏了。直观上,我们要计算有多少人看到了这张自拍,然后把喜欢这张自拍的人数作为观众规模的函数。我把所有的用户根据他们的关注数量分类。基于标签会吸引更多眼球的假设,对除了自拍标签外还有其他标签的照片给予小加分。然后对100组照片按照这个方法整理,并根据喜欢人数排序。我只计数了在线时间超过一个月的自拍照来保证每一张都有稳定的喜欢数量。我把排名前50名的自拍照定义为积极自拍照,后50名为消极自拍照。通过试图把可能看过自拍照人数进行标准化,我们最终基于二元分割把数据分成了两半。在这个过程中,我还过滤得到了有最多关注者、最少关注者和有很多标签的图片。

3.把这处理好的100万好自拍照和100万自拍照的数据集训练一个ConvNet。

你可能不认同我决定自拍照是好是坏的方法——例如,如果有人发布了一个很好的自拍,但是是在深夜,所以也许并不会有很多人看到它,因而它就不是那么受欢迎了?你是对的——它几乎肯定是错误的,但它只要对的次数更多,那这个ConvNet就能处理好。它不会感到困惑或沮丧,它只用所给的得出最好的。看看下面一些训练图像的例子,就能了解区分两类数据有多难。如果我给你这些图片中的任何一张,你能告诉为属于哪一类吗?

36大数据

(我们训练数据中好自拍和坏自拍的例子。这些数据作为学习材料输入给ConvNet)

训练细节。扔掉一些技术方面的细节,我用 Caffe 来训练ConvNet。我使用了ImageNet上已经训练好的一个VGGNet,然后用自拍数据集来微调。用一个NVIDIA K40的GPU整晚训练模型训,并禁用了dropout(译者注:dropout是指在模型训练时随机让网络某些隐含层节点的权重不工作,不工作的那些节点可以暂时认为不是网络结构的一部分,但是它的权重得保留下来),因为没有它有更好的结果。我也尝试过一个用面孔数据集训练好 的VGGNet,,但是没有获得从ImageNet VGGNet pretrained与面孔,但比从一个ImageNet检查点开始获得的结果好 。最终的模型在我验证的数据分割中 获得60%的精度(50%是随机猜测)。

什么构成了一个好的#自拍?

好了,我们收集了200万自拍,基于它们获得的喜欢数(控制了关注者数量)决定自拍照是好是坏,然后把数据输入Caffe来训练一个ConvNet。这个ConvNet“看”这200万张自拍照中每一张数十次,然后微调它的过滤器以最好地实现好坏照片的区分。我们不能很容易地检查它到底发现了什么(1.4亿个参数混杂在一起定义了过滤器)。不过,我们可以用它从没看过的自拍图片来松散(loose),试图通过看它对图片的坏好区分来看出些端倪。

我从测试数据(这个ConvNet从没看过)中取了5万张自拍第可视化。作为第一个可视化,在下图中我展示了一个连续的可视化,自拍中最好的在最上面一行,最糟糕的在放在最下面一行,每一行之间是连续变化的:

36大数据

(ConvNet判断的自拍照,从好(最上面)到坏(最下面))

结果很有趣的。让我们看下ConvNet认为5万张自拍中最好的100张:

36大数据

(ConvNet认为5万张自拍中最好的100张)

如果你想看更多,这里是 1000张(3.5MB)最好自拍 的链接。你注意到ConvNet可能的一个区分模式了吗?我注意到了一些,如果你发现了其他的,我很乐意在评论中听到。拍一张好的自拍,需要:

❶女性 。女性排名一直都高于男性。特别是在前100名没有一个男的。

❷脸应该占据图片的是是1/3左右 。发现排名靠前的脸部位置和姿势保持一致。脸总是占据了图片约1/3,位置在顶部的中心并稍微倾斜。这也让我到:

❸切掉你的额头。 会怎样?它看起来是一个受欢迎的策略,至少对女性。

❹展示你的长发。 发现排名中出现频率多的有,长发超过肩膀的。

❺加重脸的饱和度 。发现出现频率多的有,光线过度饱和,这常常使面部看起来更加统一和淡出。

❻相关的还有,加一个滤镜 。黑白照片似乎表现很好,大多数排名靠前的图片都加了某种滤镜,淡化了图片,降低了对比度。

❼添加一个边框。 你会发现这些照片中频繁出现一个水平/垂直的白色边框。

有趣的是,不是所有这些规格适合男性。我在前2000名图片中人工选出了男性的自拍照,如下:

36大数据

(前2000名自拍照中最好的几个男性自拍照)

在这种情况下,我们看到看不到任何没有额头的。相反,大多数自拍似乎用了一个广角的镜头,图片中可以看到整个头部和肩膀。看起来大多数自拍都有稍长的头发向上梳起的漂亮发型。不过,我们也能看到很多自拍都淡化了面部特征。

让我们也看下一些这个ConvNet认为不会得到很多喜欢的坏自拍。 这次我给出的图像格式小很多,并且没那么可识别,这是因为我的目的是让我们了解大概的模式,所以降低了自拍照的质量,不关注刚好拍了坏自拍的人。他们有:

36大数据

(根据卷积神经网络,5万张自拍里最坏的300张。)

即使在如此小的分辨率,一些模式也明显出现了。不要:

❶在光照不好自拍 。ConvNet很一致的把偏暗的照片(这些照片也经常有很多噪点排名很低。

❷把脑袋构图太大。 大概没有人想看到这种近距离视角。

❸集体照。 和你的朋友一起自拍很有趣,但效果似乎不是很好。

❹保持简单, 你一个占用整个空间。但不要空间太大。

❺最后一点, 注意造就一个好自拍或坏自拍还与照片的风格有关 ,而不是最原始人的魅力。

❻同样,可以松一口气, 最好的自拍和那个露最多皮肤的人没关系 。我曾经担心了一会儿,我的有1.4亿惊人参数的ConvNet最后是一个简单的皮肤纹理计数器。

❼名人。 作为最后一个有趣的实验,我在几个著名名人自拍照上运行ConvNet,并对结果连续可视化排序,最好的自拍在顶部,然后按照分数降低向右边和底部排列。

36大数据

(根据卷积神经网络对名人自拍评价。 最有吸引力的自拍:左上角,然后随质量下降先向右边再向底部排列

有趣地是,发现我们之前观察到的好自拍一般法则(不要集体照片),被那张有名的来自奥斯卡Ellen DeGeneres等人的集体照打破,ConvNet这是一张很好的自拍,把它排在了第二行!太棒了!

我们另一个好自拍一般法则(不要男性)被 Chris Pratt的身体完败(也排在第二行),还要荣幸的提到抬起眉毛 的Justin Beiber和tephen Collbert / Jimmy Fallon duo(第3行)。 James Franco的自拍比 Chris Pratt露得更多,但是ConvNet并没有很看好(第4行)。我也是。

最后,再次发现风格的重要性。有几个无可争议好看的人,因为坏的构图(如J Lo脑袋拍得太大),或者光线不好等原因拍到了列表的底部。

探索更多#自拍

另一个有趣的自拍可视化,我们尝试用 t-SNE 来展示。t-SNE是一种非常好的算法,我几乎想在任何事情上运行,因为它运用广又非常高效——它输入一些东西(比如我们实验的图片),然后把具有相似的东西放在一起展示出来。你可以用t-SNE展示非常多事情,比如 Netflix的电影 、 文字 、 Twitter个人资料 、 ImageNet的图片 ,或者任何你有一定数量的东西,并能比较两两相似度。在我们的实验中,我们基于ConvNet认为的相似度展示自拍。用技术术语来说,我们的方法是在最后的全连接层基于fc7激活的L2规范。可视化结果如下:

36大数据

(自拍的t-SNE可视化,点击下载 高分辨率图 (9MB))

找到自拍的最佳裁剪

我们进行的另一个有趣实验是用ConvNet自动寻找最好的自拍裁剪。具体来说,我们取一张图片,随机尝试各种裁剪,然后让ConvNet选出一个看起来最好的。在下面四个处理的例子中,左边是原始的自拍,右边是ConvNet认为最好的裁剪:

36大数据

(四组都包括了原始图片(左边的)和ConvNet认为最好的裁剪过的(右边))

发现ConvNet喜欢让头部占据图片的1/3,然后剪切掉额头。有趣的是,右下方的那组,ConvNet决定摆脱自拍里面的“自拍者”,选择了完全裁剪掉自拍者的那张:)你还可以看到更多“粗鲁”裁剪的有趣例子:

36大数据

(和上图一样,左边是原始图片,右边是裁剪过的。右边的那组是我最喜欢的。)

在任何其他高级用户询问前:是的,我试过在ConvNet前和图片后插入一个 空间转化 层,然后我bp微调成6个参数来定义任意角度变化的裁剪。不幸的是,我运行不好——优化有时会卡住,或

随机漂移。我也试过约束转换比例/平移,但是没有帮助。幸运的是,当你的转化有三个有界参数时,我们可以执行全局搜索(如上图所示)。

你的自拍怎么样?

好奇这个神经网络怎么看你的自拍吗?我把这个神经网络打包成了一个Twitter机器人,你可以很容易找到。(这个机器人只有约150行Python语句,包括所有的Caffe/Tweepy代码)。附上你的图片(或链接)发推特 @deepselfie ,这个机器人会自动给你的图片打分意见。图片最好是正方形,否则机器人会压缩图片成正方形,恶化结果。机器人应该会在一钟内回复,否则出现了什么错误(请过一会儿再试)。

36大数据

(与自拍机器人互动的例子 @deepselfie )

在任何人问起前,我也尝试过给一个较小版本的ConvNet端口,让其可以在iOS上运行,这样你可以在自拍时享受实时反馈,但却发现对于一个快速小项目而言太复杂了,比如,由于没有类CUDA支持,我首先尝试写自己的片段着色器,然后发现只有一些只有CPU线程的版本,我不能让运行好并实现实时。而且我还有真正的工作要做。

结论

我希望我让你感受到了卷积神经网络有多么强大。你给他们一些有标签的示例图片,他们就能自动学会识别这些事情,而且运行良好,且迅速(至少在测试时,一旦他训练好了就很快)。当然,我们仅仅只触及了表面——ConvNet在许多神经网络中作为一个基本构建模块,不仅能对图像/视频进行分类,还可以进行分割、检测和描述,无论是在云端或机器人。

如果你想了解更多看,现在初学者的最佳起点可能是 迈克尔·尼尔森的教程 。然后,我会鼓励你看 Andrew Ng在Coursera上的课程 。接下来看 CS231n 的课程笔记/作业。这门课是去年冬季我和Fei-Fei在斯坦福大学一起授课,专门介绍ConvNets的课程。如果你有时间参加,我们也将在2016年1月再次开课。想要了解更多,我会推荐 Hugo Larochelle的神经网络课 ,或者由Yoshua Bengio、IanGoodfellow和Aaron Courville正在撰写的书 《深度学习》 。

当然和看书比,通过实际操作你将学习更多,所以我建议你尝试 101 Kaggle挑战 ,或者开发你自己的项目。如果是这样,我强烈建议你不仅操作,还要记录这个过程放在任何人都能看到的地方,例如r/机器学习等已经积累的不错的社区。至于工具推荐,现在三种常见的选项是:

  • Caffe(C++,Python/Matlab封装),过去我常常用这个。如果你想做一些基本的图片分类,那么Caffe是最简单的方式,很多情况下你不需要写代码或脚本,只需要调用。
  • 基于theano的深度学习库(Python),如 Keras 或 Lasagne ,这个更灵活。
  • Torch (C++,Lua),最近的研究中我用这个。对于高级用户,我非常推荐这个,因为它用简单的抽象就实现了自由、灵活、速度。

其他其他一些刚更新/用得不多,但有前途的库包括 Nervana 的 Neon 、 CGT ,或者Jul里的 Mocha 。

最近,有一些公司想把深度学习带给大众,比如MetaMind,提供web界面允许你通过拖放图片训练一个ConvNet(所有的细节他们在云端处理)。MetaMind和Clarifai同样提供ConvNet REST APIs。

 

就这样吧,下次见!

英语原文: What a Deep Neural Network thinks about your #selfie

End.

随意打赏

提交建议
微信扫一扫,分享给好友吧。