如何用DL4J构建起一个人脸识别系统( 五 )


1、1:1应用
典型的1:1应用如手机的人脸识别解锁,钉钉的人脸识别考勤,这种应用比较简单,仅仅只需要张三是张三即可,运算量很小 。很容易实现
2、1:N应用
典型的1:N应用如公安机关的人脸找人,在不知道目标人脸身份的前提下,从海量人脸库中找到目标人脸是谁 。当人脸库中数据量巨大的时候,计算是一个很大的问题 。
如果不要求结构可以实时出来,可以离线用Hadoop MapReduce或者Spark来计算一把,我们需要做的工作仅仅是封装一个Hive UDF函数、或者MapReduce jar,再或者是Spark RDD编程即可 。
但对于要求计算结果实时性,这个问题不能转化为一个索引问题,所以需要设计一种计算框架,可以分布式的解决全局Max或者全局Top的问题,大致结构如下:

如何用DL4J构建起一个人脸识别系统

文章插图
 
蓝色箭头表示请求留向,绿色箭头表示计算结果返回,图中描述了一个客户端请求打到了节点Node3上,由Node3转发请求到其他Node,并行计算 。当然如果各个Node内存够大,可以将整个人脸库的张量都预热到内存常驻,加快计算速度 。
当然,本篇博客中并没有实现并行计算框架,只实现了用springboot将模型包装成服务 。运行FaceRecognitionApplication,访问http://localhost:8080/index,服务效果如下:
如何用DL4J构建起一个人脸识别系统

文章插图
 
本篇博客的所有代码:https://gitee.com/lxkm/dl4j-demo/tree/master/face-recognition
五、总结
本篇博客的主要意图是介绍如何把DL4J用于实战,包括pretrained模型参数的获取、自定义层的实现,自定义迭代器的实现,用springboot包装层服务等等 。
当然一个人脸识别系统只有一个图片embedding和求张量距离是不够的,还应该包括人脸矫正、抵御AI attack(后面的博客也会介绍如何用DL4J进行 FGSM 攻击)、人脸关键部位特征提取等等很多精细化的工作要做 。当然要把人脸识别做成一个通用SAAS服务,也是有很多工作要做 。
要训练一个好的人脸识别模型,需要多种loss function的配合,如可以先用SoftMax做分类,再用Center Loss、Triple Loss做微调,后续的博客中将介绍如何用DL4J实现Triple Loss(
如何用DL4J构建起一个人脸识别系统

文章插图
 
),来训练人脸识别模型 。
快乐源于分享 。
此博客乃作者原创,出处:https://my.oschina.net/u/1778239/blog/4575155

【如何用DL4J构建起一个人脸识别系统】


推荐阅读