过去的2018年,是人脸识别技术全面应用的重要一年,“刷脸”时代正式到来。手机解锁实现了从数字密码、指纹到人脸的新鲜跳跃;多所高校入学季尝试了人脸注册;肯德基部分餐厅上线“刷脸”支付……今天,我们就来聊聊这个时代新宠儿——人脸识别。
先看一组数据。2010年,我国人脸识别行业市场规模是3.77亿元,2011年来几乎是直线上升状态,到2016年达到17亿元。2017年到2018年的增速都超过20%。
01. 强势爆发的人脸识别未来趋势如何?
第一,大数据与人脸识别技术会深度融合,逐步提升在不同场景下的精度效果;第二,3D人脸识别逐步替代2D,3D识别效果在误识率、拒识率上都会低于2D,特定场景下,像姿态变化、头发遮挡、弱光线,3D识别精度也更高;第三,人脸识别会逐步依托嵌入式硬件,落到端上,但由于端上底库存储容量有限,一些数据还要传到后端的云端来处理,这就需要跟5G技术结合,实现低延时。
02. 目前,人脸识别的技术挑战有哪些?
第一,需要大量计算,除了越来越大的数据库,算法更新迭代过程也需要模型再重新训练;第二,识别精度需要突破,一些很理想状态下,精度可达到99%以上,但有些场景下,精度还需提高;第三,实际应用中,对不同场景的适应性需要增强,以及在实际应用中如何做到毫秒级低延时响应,提升用户体验,包括多路视频数据情况下,如何实现并发的高吞吐响应。
03. 人脸识别到底是如何实现的呢?
我们来讲一个也许你不太了解的它——FaceNet。2015年谷歌在CVPR上发布了一篇关于人脸识别算法的文章,主角就是FaceNet。这种算法的精度在LFW数据上达到99.63%,在YouTube人脸数据集上达到95.12%。它实际上是比较大的革新。因为它实现了端到端的学习,实现了CNN学习图像到人脸特征向量的直接映射。其次,引入了triplet损失,提升了模型学习效果。
FaceNet在公布论文的同时也做了开源,基于TensorFlow快速实现模型训练,并且会提供对比、聚类、识别样例代码。
04. 用FaceNet实现具体场景的解决方案,瓶颈和挑战在哪里?
第一,目前FaceNet工程代码只支持单卡训练,并且计算核心利用率只有60%左右,整体性能不高。对于比较大的人脸底库,需要时间会非常长。随着数据量增大,训练周期也会越来越长。
有个数据可以分享。40万人脸数据,单卡的话,训练一个batch基本上需要0.45秒,达到98.5%的精度。把40万数据全部训练完的话,可能有8万个batch,那就需要十个小时。如果是亿级底库,那单卡可能需要一年时间。算法创新需要更快的进行算法迭代,我们需要的是天级或者分钟级,等一年是很难忍受的。这样的话,FaceNet工程就需要实现并行化,以实现训练更大的数据集。
第二,再深入分析,我们发现这里面采用的是CPU的平台来做软解码,然后再送到GPU里面做推理。这样一是解码效率比较低,二是延迟高,所以如何进一步降低延时,也是FaceNet面临的挑战。
05. 针对实时视频人脸识别场景,我们对FaceNet做了哪些优化?
第一,把单卡扩展到多卡再到多机,实现更大规模并行训练;第二,对GPU进行解码,实现低延时。我们希望达到线性扩展,充分利用GPU大规模的平台资源,提高它的核心利用率,降低能耗,提升技术效率。
敲黑板! 重点重点!!接下来,进入“提纯”干货。
Part1 训练——分布式训练架构▼
基础平台是AI服务器,存储采用NVME,互联之间、节点之间采用IB网络。我们首先对数据分批次,然后调用Hvd框架做整个GPU分布式环境的初始化,接着把相关的参数传到各个GPU,做模型的梯度计算、更新权重,最后调用它整个框架做参数同步,生成特征模型。总结一下,做到分布式并行主要是这三点。首先,利用Hvd实现GPU环境初始化;第二,把GPU0的全局变量广播到所有的GPU里面去,然后采用多机多卡的方式实现GPU的分布式训练;最后生成特征模型。
Part2 推理——推理优化的架构应该如何设计?▼
先来看一下整个推理流程。视频过来之后,我们采用Rtsp流或Rtmp流进行传输,然后解码,解码后生成视频帧,会进行实时帧特征提取,同步人脸底库特征提取。两边结束后,这两部分特征进行比对。我们做的主要工作集中在数据解码和实时帧特征抽取。
从效果上看,单路延时会低于50毫秒,而且会保存其高精度。
整体总结一下优化思路,两个部分。一是,如何针对大规模数据更快训练,我们改进了FaceNet,实现单卡到多卡的加速,实现线性扩展。第二,针对实时视频流场景,实现FaceNet端到端的推理,从原来的软解到GPU硬解,实现低延时。
最后,感谢今天精神食粮的贡献者,浪潮AI首席架构师张清老师,小浪笔芯。
https://www.toutiao.com/a6719705117857153539/