V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dogandcat
V2EX  ›  问与答

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

  •  
  •   dogandcat · 2019-08-27 12:27:08 +08:00 · 2931 次点击
    这是一个创建于 1920 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    我也在网上查阅了一些资料,找到一些思路,比如说最简单的有用 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 这类编译型语言不是更好吗?

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

    @dswyzx 不想接 sdk,一是也想探索一下新的领域,
    ipwx
        11
    ipwx  
       2019-08-28 01:51:31 +08:00 via Android
    @dogandcat 库没帮你封装,你想自己来? 没必要纠结这一点点性能问题,不占总耗时 1%
    dogandcat
        12
    dogandcat  
    OP
       2019-08-28 09:16:53 +08:00
    @ipwx 有那种成熟开源的库,还是可以,比如说 tensorflow 之类的。别人家的 sdk 那种就不太想,因为用多了还是贵,而且技术也不是自己的,就是调接口
    ipwx
        14
    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
        15
    JohnChiu  
       2019-08-28 19:51:20 +08:00
    @dogandcat #6 如果是想检测到图像中的人脸的话,在 CPU 上主流的方法是 OpenCV DNN。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5504 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 06:59 · PVG 14:59 · LAX 22:59 · JFK 01:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.