背景
在现今的城市里,大多数现代化小区都已配备了门禁系统作为保护居民安全的一道重要屏障。传统的门禁系统一般采用门禁卡,但未授权人员仍然可以通过盗用复制门卡或尾随等方式进入小区。随着人工智能和人脸识别技术的发展,已经有一些小区开始用智能人脸识别系统来代替门禁卡进行身份识别。当有人通过小区门禁,系统会通过摄像头拍摄的人脸提取面部特征并和已知业主进行匹配,从而确认此人是否为该小区的业主。人脸识别系统也可以与公安部门对接,识别已知的犯罪分子,进一步增加小区的安全性。但是这些人脸识别系统在实际使用中仍然会存在准确性的问题,因为拍摄照片的质量经常会受到光线、角度和人物运动的影响。
因此,我们希望可以通过多维度的信息来辅助人脸识别系统进行身份识别,来提高身份识别的准确率,使门禁系统更加有效,将来类似的系统也可用于其他安防场景。我们目前正在和一些小区合作进行实验。在这篇博客中,我们主要给大家分享一下利用WIFI信息辅助人脸进行身份识别的方法和初步结果。
为什么采用Apache Spark/Hadoop和Analytics Zoo
我们选择使用Apache Spark/Hadoop框架搭建这个应用,以满足此场景所需的多样化数据的增减,清洗,管理,分析和可扩展性,且搭建好的应用可以部署运行在云端,降低服务器维护的成本。我们选择Analytics Zoo1作为我们构建深度学习应用的平台,因为它是目前在Hadoop/Spark框架上最方便的用于开发深度学习应用的平台之一。用Analytics Zoo读取和处理存放在Hadoop/Spark集群上的数据非常方便,而且Analytics Zoo在标准的Hadoop/Spark集群上做训练和预测并不需要对集群有特殊的改动或配置。此外,Analytics Zoo还有很多预定义的模型可以开箱即用,也提供了不少示例供参考,这能让我们很容易地建立适合我们场景的深度学习模型,并且用现有小区的数据做初步实验得出结果。
注1:Analytics Zoo (https://github.com/intel-analytics/analytics-zoo) 是Intel开发的一个开源大数据分析和AI平台。它能将Spark, TensorFlow, Keras和BigDL程序无缝地集成进端到端的数据分析流水线中,直接运行在大规模、分布式的大数据集群上。
方法,数据采集和特征工程
WIFI信息可以作为辅助人脸识别的手段之一。只要在小区门禁处装上WIFI设备,系统在收集人脸信息的同时会收集到位置在小区大门附近的手机的MAC地址信息,在收集数据后,使用SGX安全技术对手机的MAC等关键隐私数据进行加密处理,生成密文的MAC地址(后续的MAC地址均是指密文的MAC地址)注1,而所有这些收集的数据都带有时间戳。如果可以训练机器学习模型将MAC地址和身份信息进行匹配,那么之后有人进出小区时,即使拍到的人像比较模糊识别置信度不高,附近的MAC地址也可以用来辅助提供身份信息。经过分析和过往经验,我们认为MAC地址记录和人脸识别身份记录的时间差,WIFI信号强弱以及在历史上短时间内成对出现的次数等可能是有用的特征。接下来我们就利用这些特征来建立MAC地址和身份信息的匹配模型。
模型的选择、训练、评估和优化
MAC地址和身份ID的匹配问题,本质上跟文本匹配和推荐排序等问题是类似的,即将MAC地址的特征和身份ID的特征都输入模型,输出一个相似度分数,再按相似度由高到底排序,用排序好的相似度信息来辅助进行身份识别。
具体来说,我们的模型输入特征包括人脸身份ID和MAC的ID,检测到的时间差,WIFI信号强弱,共同出现的频率等等,模型输出为相似度得分(0-1之间)。
我们参考了Analytics Zoo中提供的两种推荐模型的示例——Neural Collaborative Filtering (https://analytics-zoo.github.io/master/#ProgrammingGuide/recommendation/#neural-network-based-collaborative-filtering) 和Wide And Deep (https://analytics-zoo.github.io/master/#ProgrammingGuide/recommendation/#wide-and-deep) ,基于我们的输入特征稍作修改,就得到了适合我们数据输入的模型,并采用了的是二分交叉熵 (Binary Cross Entropy)损失函数。
作为初步的实验,我们邀请了一小部分小区居民事先采集他们的手机MAC地址,并且拿到了一个月里小区收集到的数据。我们将每天检测到这些居民的记录作为正样本,随机生成适当数量的负样本,用前25天的数据用于训练,后5天的数据用于验证。
在定义好模型并且把数据集经过特征工程处理成Spark RDD之后,就能用Analytics Zoo提供的Keras-Style API进行分布式训练和预测了。 训练和预测的代码非常简单,如下:
- model.compile(optimizer, loss='binary_crossentropy', metrics=['accuracy'])
- model.fit(train_rdd, batch_size, nb_epoch, validation_date=val_rdd)
- model.predict(test_rdd)
在compile模型的时候,可以指定让模型在训练集上进行多少次迭代训练(epochs),每次训练使用的批大小(batch_size),采用的优化方法以及它的学习率(learning rate) 等参数。在训练的过程中,可以在验证集上输出准确率的性能指标,这样能了解到模型在训练的过程中是否已经过拟合。同时Analytics Zoo也支持在训练过程中阶段性保存快照可用于继续训练,也可以用Tensorboard可视化learning curve等等。
在我们的实验数据上,目前模型的表现得到了令人满意的结果,我们现在也在和小区共同探索模型的落地。模型投入使用后,因为小区每天都在收集新的数据,我们会定期使用全量或增量数据线下重新训练和迭代模型。
结语
相信大家看了以上的介绍,已经对如何使用Analytics Zoo 在大数据平台上构建深度学习应用增强身份识别有了大致的了解。在AI快速发展的今天,我们相信把深度学习的技术利用在大数据上能让身份识别更加可靠,给居民的生活带来更多的便利。
如果需要更多关于Analytics Zoo的信息,请访问Github上的项目地址(https://github.com/intel-analytics/analytics-zoo) 或者主页 (https://analytics-zoo.github.io/)。
注1:手机的MAC地址进行加密处理的安全性在于,
1、确保手机的MAC隐私数据安全
2、确保隐私数据不被泄露
3、确保隐私数据仅限于本系统内使用,无法与其他系统交换