在《图像技术在直播中的应用(上)》中,咱们简述了美颜技术1.0的原理与实践问题。在文章的最后,咱们提到了美颜2.0最关键的技术——人脸识别。这是项复杂但又很是热门的技术,咱们将在这篇文章中聊一聊图像识别,其原理与具体实践的一些问题。该分享系列整理自涂图CTO在架构师沙龙上的演讲内容。算法
近段时间,机器学习、深度学习的概念很是火,尤为是今年 AlphaGo 击败了韩国棋手这件事,引发了世界的轰动。机器学习和深度学习这两个概念,比较容易混淆,以致于不少媒体在写报道时,常常把这两个词混着用。因为这两个概念目前最主要应用在图像领域上,因此咱们仅就图像识别,尤为是人脸识别方面,区分一下这两个概念。网络
机器学习的概念提出的比较早,上世纪 90 年代初,人们开始意识到一种能够更有效地构建模式识别算法的方法,那就是用数据(能够经过廉价劳动力采集得到)去替换专家(具备不少图像方面知识的人)。而深度学习能够算是机器学习的一个分支,只在近十年内才获得普遍的关注与发展。架构
下面说说具体的区别。框架
首先,机器学习识别物体是基于像素特征的。咱们会搜集大量的图像素材,再选择一个算法,使用这个算法来解析数据、从中学习,而后对真实世界中的事件作出决策和预测。机器学习
而深度学习能够算是机器学习的一个分支,只在近十年内才获得普遍的关注与发展。它与机器学习不一样的,它模拟咱们人类本身去识别人脸的思路。好比,神经学家发现了咱们人类在认识一个东西、观察一个东西的时候,边缘检测类的神经元先反应比较大,也就是说咱们看物体的时候永远都是先观察到边缘。就这样,通过科学家大量的观察与实验,总结出人眼识别的核心模式是基于特殊层级的抓取,从一个简单的层级到一个复杂的层级,这个层级的转变是有一个抽象迭代的过程的。深度学习就模拟了咱们人类去观测物体这样一种方式,首先拿到互联网上海量的数据,拿到之后才有海量样本,把海量样本抓取过来作训练,抓取到核心的特征,创建一个网络,由于深度学习就是创建一个多层的神经网络,确定有不少层。有些简单的算法可能只有四五层,可是有些复杂的,像刚才讲的谷歌的,里面有一百多层。固然这其中有的层会去作一些数学计算,有的层会作图像预算,通常随着层级往下,特征会愈来愈抽象。函数
举例来讲,识别一张人脸。若是是在具体环境中的人脸,若是遇到云雾,或者被树遮挡一部分,人脸就变得模糊,那基于像素的像素特征的机器学习就没法辨认了。它太僵化,太容易受环境条件的干扰。而深度学习则将全部元素都打碎,而后用神经元进行“检查”:人脸的五官特征、人脸的典型尺寸等等。最后,神经网络会根据各类因素,以及各类元素的权重,给出一个通过深思熟虑的猜想,即这个图像有多大多是张人脸。工具
因此,深度学习比机器学习无论在人脸识别仍是各类各样的识别表现都要好,甚至已经超过人类的识别能力。好比 2015 年谷歌发布了一个 facenet 网络,作人脸检测的,号称用这个网络能够达到 98% 以上识别率。而咱们人类本身去看样本所达到的正确率,同样不是百分之百,甚至尚未如今一些最早进的采用深度学习算法的技术准确率高。性能
在机器学习方面,目前国际上比较主流的基于人脸检测的计算,一是 HOG 算法,还有其余像 LBF 特征算法。 LBF 是 OpenCV 的,OpenCV 是个很是有名的开源库,里面有各类各样的图象处理相关功能,并且是开源的,可是它在移动平台上效果不好,没有办法达到咱们要的效果。这里提到是由于它很是有名,里面包含了各类各样图象处理相关的功能,好比说作特殊处理,作人脸识别、物体识别等等。OpenCV 里面就包含了 LBF 算法的实现。学习
深度学习有很多开源框架,好比 Caffe、TensorFlow。这些框架提供的仅仅是构建深度学习网络的工具,可是深度神经网络才是最关键的东西。网络怎么构建?网络有多种构建方式,好比你们去关注这方面会发现常常看到一些名词,CNN、RNN,CNN 多是比较火的,在人脸识别方面是表现很是优越的一个网络,如今也是比较主流的一个网络。固然也有不少网络,RNN 或者是更快的 CNN 网络等等,在解决某些具体问题的时候,有更加好的表现。测试
当们咱们具有了相关的深度学习技术后,就能够在服务端上构建应用了。好比作智能鉴黄,一路视频流输入,解码之后拿到每一帧,识别出有问题的部分,对它进行处理;好比打上马赛克,或者把内容保存下来,而后发送通知给后台,告诉后台这里有一张疑似有不可描述的东西出现了等等,以后再编码,输出到其它地方,好比再分发到 CDN 等等。这些过程若是用人工识别成本很是高,要发展确定要经过技术手段去解决。
最后说下手机端上的经验:涂图的产品在人脸检测性能方面的测试指标。好比 iOS 和安卓平台上面咱们作的测试,在 iPhone 6 上,40 特征点抓取须要 40 毫秒,至关于一秒内能够处理 25 帧。固然实际上并不须要这么多的次数,人眼观察事物,由于有视觉暂留效应,通常来讲 12 帧是个分界线,小于 12 帧就能感受到画面卡顿,可是只要大于 12 帧,看起来就是连续的。因此咱们通常限制在十七八次的检测,在 iOS 上够用了。安卓方面,相对于 iOS 平台的表现确实要差一些,不管是 API 的封装,仍是整个硬件的搭配,可能一样一个 GPU 型号,用在安卓的设备上就无法达到跟 iOS 一样的表现,iOS 平台确实在各方面上要作得比安卓好一点。小米5是比较新的设备了,40 特征点抓取须要大概 60毫秒。
虽然在手机端上,好比 iOS 9,已经推出了深度学习 API,iOS 10 又对其进行了升级,提供了更多的功能;可是通常来讲咱们是在 PC 上面开发、训练的,直到把代码都作好,再放在手机设备上运行。由于就像刚才提到的,机器学习、深度学习的开发中很是关键的环节是训练。
训练是什么意思?
好比我取 1 万张图片把人脸都标识出来,把 1 万张样本处理以后获得经验,到底人脸有什么特征,好比涉及 150 个参数,得出一个函数,调整后获得一个函数模型,这样的模型再去训练、测试,最后获得一个比较好的模型。接下来再找不少测试数据,好比 1 万张测试数据,来检测这个模型,若是表现很好,那这个数据模型网络是可靠的,最后用在实际中。
可是这个训练的过程很是耗时间。咱们运行一个训练,CPU 可能须要二三十个小时。这仍是简单的模型,一些复杂的模型,好比谷歌开放的 125 层神经网络,若是用 CPU 来跑可能要三四天,至关于这么久之后才能获得一个模型,你才知道这个模型是好是坏。若是你发现不行,又改了一个小参数,结果还要继续三四天时间。因此解决的办法只有一条,就是升级硬件。好比 GPU 取代 CPU 完成运算。
这里列了一个细的指标,好比有些算法须要在 RGB 空间里作检测,有没有不可描述的内容在里面。若是咱们用 GTX 980 Ti 来运行,能够小于 20 毫秒一帧,用 i7 的 CPU 运行,检测出来则是 800 秒,跟 GPU 跑彻底不可比。但问题是,专门作训练的 GPU 设备很是贵,七八千块钱的 GPU 在机器训练里面都不算好的,并且为了在复杂的场景中不耽误时间,好比像 AlphaGo 作训练同样,只能用海量的设备来弥补,这个成本可想而知。因此才说只有有必定实力的公司才能担负的起作深度学习。
如今国际上一些主流的大公司,好比微软,不少服务包括云服务等等,用的是 FPGA 方案。百度也在作基于运算单元的芯片,中科院也在作相关的研究。因此深度学习一路发展下来,实际上一直都卡在计算上,计算能力远远跟不上咱们软件的要求,最后就又变成了比拼硬件的时代。但其实这个问题并非近期才有的;早在人工智能出现的早期,神经网络的概念就已经存在了,但神经网络对于“智能”的贡献微乎其微,主要问题就出在运算能力不足上。因此如今你们能够预见,量子计算一旦成为可能,人工智能的时代才算真正要到来了。