【新智元导读】实现人脸检测、人脸识别以及情绪检测最少需要多少代码?8行!目前在人脸识别方面已经做的非常成熟了,但对于开发者来说,对效率的追求是永远不会停止的。通过不断精简代码,目前能够同时实现上述3个功能所需的最少代码是8行,代码已在Github开源。
人类具有识别和区分面部的天生能力,但人类也存在脸盲的现象。现在计算机也能够识别并区分人脸,并且这项技术已经非常成熟。人脸检测和识别可以用来改善访问和安全性,就像最新的Apple iPhone一样(参见下面的gif),用户可以在没有实体支付卡(例如银行卡、信用卡等)的情况下,实现刷脸移动支付、启用犯罪识别并允许个性化的医疗保健和其他服务。
人脸检测和识别是一个被广泛研究的课题,在网上可以找到大量的资源。今天向大家展示的一个最简单的实现方式。为了找出最简化、同时又具备一定准确度的实现,本问作者尝试了多个开源项目,而且还创建了一个pipeline,只需8行代码就可以对任何输入图像进行人脸检测,人脸识别和情感理解! 代码yiji在Github上开源的。
通过这8行代码,我们要实现以下3个功能:
- 面部检测:能够检测任何输入图像或帧中的面部位置。 输出是检测到的面的边界框坐标
- 面部识别:将多个面部进行比较以识别哪些面部属于同一个人。 这是通过比较面嵌入向量来完成的
- 情绪检测:将脸上的情绪分类为快乐,愤怒,悲伤,中立,惊讶,厌恶或恐惧
面部检测
面部检测是pipeline的第一部分。使用python库的Face Recognition,这库非常易于安装并且在检测面部时非常准确。此库扫描输入图像并返回所有检测到的面的边界框坐标,如下所示:
系统需求:
- Python 3.3+ or Python 2.7
- macOS or Linux
安装指南:
首先确保你已经安装了dlib。如果没有可以谷歌如何安装。
然后通过下面命令进行安装(缺人你的Python版本,如果是2就把pip3改成pip2)
pip3 install face_recognition
下面的代码段显示了如何使用face_recognition库来检测面部
face_locations = face_recognition.face_locations(image)
top, right, bottom, left = face_locations[0]
face_image = image[top:bottom, left:right]
有关安装人脸识别和使用它的完整说明也在Github上
面部识别
面部识别用于验证两张脸是否相同。面部识别的使用在安全性、生物指标、娱乐、人身安全等方面有着巨大的需求和价值。用于面部检测的python库face_recognition也可以用于面部识别。
测试显示,该库具有良好的性能。给定两张脸进行匹配,最终得出对比结果为True或False。面部识别涉及的步骤是
- 在图像中查找面部
- 分析面部特征
- 比较2个输入面的特征
- 如果匹配则返回True,否则返回False
执行此操作的代码段如下所示。我们为两张脸创建脸部的编码矢量,然后使用内置函数来比较矢量之间的距离。
encoding_1 = face_recognition.face_encodings(image1)[0]
encoding_2 = face_recognition.face_encodings(image1)[0]
results = face_recognition.compare_faces([encoding_1],encoding_2,tolerance = 0.50)
现在用下面两张图来测试模型:
如图所示,我们有两张不同姿势的莱昂纳多迪卡普里奥的脸。甚至第一个照片里的脸还不是正面镜头。使用上面代码进行识别,我们的人脸识别程序能够确定这两张脸属于同一个人!
情绪检测
人类习惯于察言观色。现在,计算机在读懂人类面部情绪方面,做的越来越好了。所以计算机是如何做到检测图像中的情绪呢?这里我们使用一个开源数据集,来自Kaggle的Face Emotion Recognition(FER ),并构建了一个CNN来检测情绪。我们定义情绪可分为7类:快乐,悲伤,恐惧,厌恶,愤怒,无所谓和惊讶。
首先让我们在Keras中构建一个6层卷积神经网络(CNN),并使用图像增强来提高模型性能。尝试了许多不同的模型之后,我们找出了最佳实现,并将此开源,读者可以访问以下链接查看代码:
https://github.com/priya-dwivedi/face_and_emotion_detection/blob/master/src/EmotionDetector_v2.ipynb
现在你可以使用以下两行代码加载预训练模型并在图像上运行它:
model = load_model("./emotion_detector_models/model.hdf5")
predicted_class = np.argmax(model.predict(face_image)
结论
如你所见,面部识别在今天看来,已经是一个非常简单的任务,你甚至仅仅使用8行代码就可以实现。当然精确度可能有待商榷,但起码在一半情况下是完全具备可用性的。
参考链接:
https://towardsdatascience.com/face-detection-recognition-and-emotion-detection-in-8-lines-of-code-b2ce32d4d5de