实现人脸识别的思路是什么?

2019-08-27 12:27:08 +08:00
 dogandcat

最近对人脸识别(准确来说是:人脸辨识+人脸检索)特别敢兴趣,想要一探究竟,却没有一个大题的思路,故向各位大佬求解。

我也在网上查阅了一些资料,找到一些思路,比如说最简单的有用 python 的 face_recognition,但是我感觉这个是否是太简单了,不能应用于正式的生产环境。

于是我找啊找,终于找到了这样一篇文章( https://www.itread01.com/content/1546931718.html),该文章利用 python、tensorflow、opencv 进行人脸识别,大体思路如下:

1、利用 opencv 的人脸检测器(如 haarcascade_frontalface_alt2.xml),识别人脸并保存。 2、将保存的这些人脸放到 tensorflow 进行模型训练,得到模型 3、通过模型辨识出,图片中这个人是谁。

看过这篇文章,还是有很多困惑: 1、支付宝,微信(或者说用于生产环境)的人脸识别,大致思路也是如此吗?还是其他 2、我最终的目的是想实现人脸检索(不是人脸比对),那么每个人的人脸我都要使用大量样本进行训练吗? 3、人脸检索这块具体是怎么样的呢,比如说有 1 万人的,他是如何去检索的呢?借助数据库,还是就是 tensorflow 的模型呢 4、想起来,这个对程序要求比较高,为什么 python 这类脚本语言,在这个领域这么突出呢,用 java,golang 这类编译型语言不是更好吗?

2917 次点击
所在节点    问与答
15 条回复
ipwx
2019-08-27 13:05:58 +08:00
不是做这块的,但我做 deep generative model。我猜测不管是用 opencv 还是用 neural network,肯定有提取特征,特征提取为向量,并且这个向量要满足向量距离越近,脸越像。然后建立人脸向量数据库,或者检索树。给一张查询人脸,通过同样的算法检索出一定量和它像的人脸,再进行两两比对,找出最像的。
ipwx
2019-08-27 13:08:11 +08:00
至于用 python: 因为别的语言没有这么全的库呀。你列举的这些库都是 c++ 写的,给 python 能调用,所以不会有性能问题。至于为啥不用 c++?因为 c++ 程序员找不到多少靠谱的呀
across
2019-08-27 13:12:58 +08:00
关键算法,人脸数据建模、计算处理当然是 C/C++完成的。python 脚本只是做些数据调用等外部操作····
swulling
2019-08-27 13:14:27 +08:00
用英文搜资料,比如 https://github.com/davidsandberg/facenet 这个实现了 Google 的 FaceNet
JohnChiu
2019-08-27 16:26:18 +08:00
face_recognition 那个用的是 Dlib 的人脸识别是人脸检测,可以认为是特殊的目标检测,而支付宝微信的人脸识别是人脸检索,跟人脸检测不是一回事。
OpenCV 那个基于 HAAR 特征的的人脸检测都多久之前的技术了,检测成功率都不能看,更别说用于生产环境了。现在主流的人脸检测是基于深度神经网络的,人脸检索就不清楚了,但也是基于人脸特征的,提取方法五花八门,不知道现在有什么主流的技术
dogandcat
2019-08-27 17:09:51 +08:00
@JohnChiu 是的,OpenCV 那个人脸检测只有正脸的时候才会好些,画面稍微有些不理想就不行。所以想要求解一个正确的,主流的思路
dogandcat
2019-08-27 17:10:48 +08:00
@ipwx
@across 那使用 java 这类型的编译型语言,来进行外部调用,是不是性能更好呢?
whp1473
2019-08-27 17:35:16 +08:00
我就说静态非活体人脸检测
1.首先是深度神经网络进行学习,提取人脸特征值,这个值就是人脸上重要点位的坐标信息
2.大量训练后,就可以得到一个集合类似于[-12,-324,100,-30...],一般越多人脸比对越准确
3.然后构建一个内存型的服务器,将 faceId->人脸特征关联起来,建立一个映射
4.当一张脸来时,依次对该人脸特征进行矩阵运算得到一个分值,该分值越小代表人脸特征越相近
5.一般会有个阈值,低于该阈值可以认为相似。若追求准确则扫库,得到结果 faceId
dswyzx
2019-08-27 17:42:54 +08:00
接别人 sdk 吧.阿里的人脸识别技术记得也是 face++的
dogandcat
2019-08-27 22:48:04 +08:00
@whp1473 感谢,你这个描述得稍微有些思路了

@dswyzx 不想接 sdk,一是也想探索一下新的领域,
ipwx
2019-08-28 01:51:31 +08:00
@dogandcat 库没帮你封装,你想自己来? 没必要纠结这一点点性能问题,不占总耗时 1%
dogandcat
2019-08-28 09:16:53 +08:00
@ipwx 有那种成熟开源的库,还是可以,比如说 tensorflow 之类的。别人家的 sdk 那种就不太想,因为用多了还是贵,而且技术也不是自己的,就是调接口
zizhoutong
2019-08-28 10:02:42 +08:00
ipwx
2019-08-28 10:10:46 +08:00
@dogandcat 我说的就是 TensorFlow 啊。TensorFlow 的 Java API 只能载入已经存下来的模型,不能自由创建模型,基本没用。 https://www.tensorflow.org/api_docs/java/reference/org/tensorflow/package-summary

TF 1.0 我都是直接 Python 代码创建模型的,载入存下来的参数。直接载入存下来的 Graph ?还不如用 Python 代码创建来的方便,随时可以改。
JohnChiu
2019-08-28 19:51:20 +08:00
@dogandcat #6 如果是想检测到图像中的人脸的话,在 CPU 上主流的方法是 OpenCV DNN。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/595505

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX