用户
搜索

[思路/技术] python人脸识别--基础

  • TA的每日心情
    擦汗
    前天 10:28
  • 签到天数: 214 天

    连续签到: 3 天

    [LV.7]常住居民III

    i春秋-核心白帽

    Rank: 4

    51

    主题

    170

    帖子

    905

    魔法币
    收听
    1
    粉丝
    1
    注册时间
    2016-9-2
    发表于 2018-2-1 13:07:54 256306
    本帖最后由 0nise 于 2018-2-1 06:58 编辑


    基于python的人脸识别

    0x00前言:
          现在的手机相机功能基本都带有人脸识别技术,即在拍照过程中相机会自动把人脸的部分框出来。
          处于好奇以及网上众多的资源,下文介绍人脸识别的实验的具体方法。
          “我们不生产代码,我们只是大自然的搬运工莫名的喜感,哈哈哈。

    0x01具体思路:
          本文基于dlib库(c++写的)进行的人脸识别,而dlib又依赖Boost库和cmake,所以首先需要安装这些库;
         Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。
         CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程),即将dlibboostc++程序进行编译。
         考虑到虚拟机性能问题,dlib库有两种安装方法,根据具体情况选择,下面安装dlib时会具体说(推荐方法二)。
         痛点:前期是在kali系统中尝试的,由于是虚拟机环境在dlib库编译过程中卡死,然后第二次进入系统时,登录界面登录后又回到登录界面(循环)无法进入桌面,此问题尚未解决,不过不影响此次实验。
    Ps:有解决此问题的可以分享以下问题所在。

    0x02具体步骤:
    本此实验环境:此处以ubuntu系统为例,预装python2.7  
    #首先更新系统包:
    [AppleScript] 纯文本查看 复制代码
    [/align][align=left]sudo apt-get update
    
    #安装pip和idle :
    sudo apt-get install python-pip
    sudo apt-get install idle
    #安装相关依赖库:
    sudo apt-get install bulid-essential cmake       //安装cmake编译工具
    sudo apt-get install libgtk-3-dev                     //安装gtk(跨平台的图形工具包)
    sudo apt-get install libbost-all-dev                 //安装boost库
    #安装相关模块:
    pip install numpy                     //可用来存储和处理大型矩阵     
    pip install scipy                        //用于图像处理
    pip install opencv-python         //opencv库也用于图像处理[/align][align=left]
    注:提供安装dlib库的两种方法(推荐方法二):

    方法一:
    直接安装,此过程会自动编译,估计要好长时间,取决于计算机的性能咯,又因为此方法编译过程中没任何提示,所以不知是卡死了,还是正在编译,kali中测试,编译过程等了1个多小时(bdist_wheelfor dlib ……/),我中断编译,改用其他方法。
    [AppleScript] 纯文本查看 复制代码
    [/align][align=left]pip installdlib         
    
    方法二:
    下载dlib官方库,目前最新版是19.9dlib库,此方法的好处是可以看到编译的进度条,知道编译的进展情况如何。
    #解压
    [AppleScript] 纯文本查看 复制代码
    bunzip2 dlib-19.9.tar.bz2             //解压后会有一个.tar文件
    #再解压.tar文件
    tar -xf dlib-19.9.tar                        //解压
    #进入解压后的目录:
    #可以看到setup.py 文件,并运行:
    sudo python setup.py install
    #打开python命令行查看所需的库与模块是否正常,没有报错即为正常:
      
    #人脸检测是基于训练好的模型数据,即模型标记人脸的特征点(眼,鼻,嘴,下巴,眉毛)并在图片进行匹配,然后标记图片中人脸的部分。
    #还需要下载模型,文末会提供云盘链接;      

    0x03具体代码如下
    #! /usr/bin/envpython
    # coding:utf-8
    #首先定义三个工具函数:
    #这个函数里的rectdlib脸部区域检测的输出。这里将rect转换成一个序列
    #,序列的内容是矩形区域的边界信息。

    [Python] 纯文本查看 复制代码
    def rect_to_bb(rect):
    
        x = rect.left()
    
        y = rect.top()
    
        w = rect.right() - x
    
        h = rect.bottom() - y   
    
        return (x, y, w, h)


    #这个函数里的shapedlib脸部特征检测的输出,一个shape里包含了前面说到##的脸部特征的68个点。这个函数将shape转换成Numpy array,为方便后续处理。
    [Python] 纯文本查看 复制代码
    def shape_to_np(shape, dtype="int"):
    
        coords = np.zeros((68, 2), dtype=dtype)   
    
        for i in range(0, 68):
    
            coords = (shape.part(i).x, shape.part(i).y)   
    
        return coords

    #这个函数里的image就是我们要检测的图片。在人脸检测程序的最后,我们会显示#检测的结果图片来验证,这里做resize是为了避免图片过大,超出屏幕范围。

    [Python] 纯文本查看 复制代码
    def resize(image, width=700):
    
        r = width * 1.0 / image.shape[1]
    
        dim = (width, int(image.shape[0] * r))
    
        resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)   
    
        return resized

    #主程序部分:

    [Python] 纯文本查看 复制代码
    import sys
    import numpy as np
    import dlib
    import cv2
    if len(sys.argv) < 2: 
        print "Usage: %s <image file>" % sys.argv[0]
        sys.exit(1)
    image_file = sys.argv[1]
    detector = dlib.get_frontal_face_detector()
    predictor = dlib.shape_predictor("/shape_predictor_68_face_landmarks.dat")
    

    #shape_predictor中的参数就是我们之前解压后的文件的路径,此处以根目录为例。

    [Python] 纯文本查看 复制代码
    [/align][align=left]image = cv2.imread(image_file)
    image = resize(image, width=700)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    rects = detector(gray, 1)
    for (i, rect) in enumerate(rects):
        shape = predictor(gray, rect)
        shape = shape_to_np(shape)
        (x, y, w, h) = rect_to_bb(rect)
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
        cv2.putText(image, "Face #{}".format(i + 1), (x - 10, y - 10),
            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)   
        for (x, y) in shape:
            cv2.circle(image, (x, y), 2, (0, 0, 255), -1)
    cv2.imshow("Output", image)
    cv2.imwrite("/home/ubuntu/桌面/end.jpg", image, params=None)
    cv2.waitKey(0) [/align][align=left] 
    #此处将标记脸部特征的图片输出到桌面并保存为eng.jpg ,具体保存路径视自己的情况而定;
    #按任意健退出,或者ctrl+z

    0x04测试程序:
    #将之前的代码在idle中保存为face2.py  文件:
    66.jpg是桌面下的待检测图片:



    最终桌面生成end.jpg图像:



    0x05总结:
          此次实验到此结束,嗑嗑绊绊总算完成了,说难也不难,遇见问题解决问题有些问题虽然没有解决但是不影响实验。
          模型和代码部分还可以深究,比如大佬们可以自建模型,如果模型够完善且特征点足够多,多到可以唯一标记一张人脸,即人脸匹配,那么可以运用到刑侦方面。代码也可以优化,比如检测实时视频中的人脸而不是图片中的人脸就更棒了。有什么问题或者想法欢迎交流。
    我们不生产代码,我们只是大自然的搬运工

    图片来自网络,如涉及版权问题,请联系我们以便处理。

    模型下载地址:链接: https://pan.baidu.com/s/1bpOAGW3 密码:
    游客,如果您要查看本帖隐藏内容请回复







    no pain no gain
    发表于 2018-2-1 15:45:22
    楼主文中一行代码出现BUG TIM图片20180201154051.png
    导致错误为
    TIM图片20180201154208.png
    修改为
    TIM图片20180201154254.png
    就可以正常运行了,附带一张运行结果
    TIM图片20180201154425.jpg

    评分

    参与人数 1魔法币 +2 收起 理由
    l春秋 + 2 感谢您的宝贵建议,我们会努力争取做得更好.

    查看全部评分

    使用道具 举报 回复
    口怕……要不是老夫幼儿园毕业了,老夫差点就让吓到了
    使用道具 举报 回复
    发表于 2018-2-15 12:02:53
    emmmmm老哥你这个,有点短小精悍啊
    做自己的自己 和平年代的炮灰,战争年代的爆破鬼才
    使用道具 举报 回复
    人脸识别,新一代的技术啊
    不服你TMD来打我啊!
    使用道具 举报 回复
    大佬又来收割膝盖了,受教!
    使用道具 举报 回复
    感谢分享这么好的文章
    使用道具 举报 回复
    这个插个眼,正在学习中
    使用道具 举报 回复
    发表于 2018-2-1 16:24:09
    学习下大佬的人脸识别
    使用道具 举报 回复
    发表于 2018-2-1 14:28:30
    沙发   
    使用道具 举报 回复
    发表于 2018-2-1 15:41:59
    回复给不给魔法币

    评分

    参与人数 1魔法币 +2 收起 理由
    l春秋 + 2 欢迎分析讨论交流,i春秋论坛有你更精彩!.

    查看全部评分

    使用道具 举报 回复
    发表于 2018-2-1 17:05:43
    酷,66666
    求知若饥,虚心若愚。
    使用道具 举报 回复
    厉害了。谢谢分享
    使用道具 举报 回复
    py也有库
    使用道具 举报 回复
    学习下
    使用道具 举报 回复
    发表于 2018-2-2 00:42:33
    前端学习,666
    使用道具 举报 回复
    发表于 2018-2-2 09:56:24
    6645喝喝酒过y
    使用道具 举报 回复
    谢谢楼主分享。
    使用道具 举报 回复
    看看看看。
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册