教你如何制作自己的人脸识别系统

之前一些非程序员朋友问我,自己是否应该学习一门编程语言。我的回答是:是的,你一定要学会一门编程语言,来简化你在现今环境中的一些繁琐重复的工作。虽然我是一名程序员,但我觉得我的编程技能更多的用在了生活上。

接下来说说人脸识别系统。

How

其实这套系统的原理很简单,本着能够让每个人都能读懂的原则,一定不要用专业的眼光去看这套系统,其实它只不过是用几个现成的组件拼接而成的。

系统流程如图:

准备工作:摄像头,Ubuntu系统、python开发环境、网络环境

没错,就是这么简单,需要准备的东西并不多。这里你也可以用Windows系统来搭建,只要你高兴,怎么着都行。

安装python的依赖包

对于python环境,你可以直接通过下载anaconda,它是一款python的集成开发环境,里面包含了大量的python依赖包。接下来会安装一些anaconda中没有的依赖包:face_recognition、OpenaCV、pymysql、wxpy

对于pymysql,可以这么安装:

pip install pymysql -ihttps://pypi.tuna.tsinghua.edu.cn/simple

对于face_recognition和OpenaCV,会比较麻烦

安装OpenCV

装一大堆内核:

#Remove any previous installations of x264

sudoapt-getremovex264libx264-dev

#We will Install dependencies now

sudoapt-getinstallbuild-essentialcheckinstallcmakepkg-configyasmsudoapt-getinstallgitgfortransudoapt-getinstalllibjpeg8-devlibjasper-devlibpng12-dev

# If you are using Ubuntu 14.04

sudoapt-getinstalllibtiff4-dev

# If you are using Ubuntu 16.04

sudoapt-getinstalllibtiff5-dev

sudoapt-getinstalllibavcodec-devlibavformat-devlibswscale-devlibdc1394-22-dev

sudoapt-getinstalllibxine2-devlibv4l-dev

sudoapt-getinstalllibgstreamer0.10-devlibgstreamer-plugins-base0.10-dev

sudoapt-getinstallqt5-defaultlibgtk2.-devlibtbb-dev

sudoapt-getinstalllibatlas-base-devsudoapt-getinstalllibfaac-devlibmp3lame-devlibtheora-dev

sudoapt-getinstalllibvorbis-devlibxvidcore-dev

sudoapt-getinstalllibopencore-amrnb-devlibopencore-amrwb-dev

sudoapt-getinstallx264v4l-utils

# Optional dependencies

sudoapt-getinstalllibprotobuf-devprotobuf-compiler

sudoapt-getinstalllibgoogle-glog-devlibgflags-dev

sudoapt-getinstalllibgphoto2-devlibeigen3-devlibhdf5-devdoxygen

下载opencv包:

git clone https://github.com/opencv/opencv.gitcd opencvgit checkout 3.3.1cd ..

下载opencv_contrib包:

git clone https://github.com/opencv/opencv_contrib.gitcd opencv_contribgit checkout 3.3.1cd ..

开始编译:

cdopencv

mkdirrelease

cdrelease

cmake-DBUILD_TIFF=ON\

-DBUILD_opencv_java=OFF\

-DWITH_CUDA=OFF\

-DWITH_OPENGL=ON\

-DWITH_OPENCL=ON\

-DWITH_IPP=ON\

-DWITH_TBB=ON\

-DWITH_EIGEN=ON\

-DWITH_V4L=ON\

-DWITH_VTK=OFF\

-DBUILD_TESTS=OFF\

-DBUILD_PERF_TESTS=OFF\

-DCMAKE_BUILD_TYPE=RELEASE\

-DCMAKE_INSTALL_PREFIX=$(python-c"import sys; print(sys.prefix)")\

-DPYTHON3_EXECUTABLE=$(whichpython)\

-DPYTHON3_INCLUDE_DIR=$(python-c"from distutils.sysconfig import get_python_inc; print(get_python_inc())")\

-DPYTHON3_PACKAGES_PATH=$(python-c"from distutils.sysconfig import get_python_lib; print(get_python_lib())")\

..

make-j4

makeinstall# not sudo, except for Raspberry Pi

#Note: on the Raspberry Pi, consider make -j2 to avoid over-temperature and under-voltage warnings (in general when compiling on Raspberry Pi, not just for OpenCV).

此时此刻,opencv已经编译完成了,在你的

下会有一个的文件,创建一个软连接到你的虚拟环境下就OK了:

cd /home/[user_name]/anaconda3/lib/python3.6/site-packages/

ln -s /home/[user_name]/anaconda3/lib/python3.6/site-packages/cv2.cpython-36m-x86_64-linux-gnu.so cv2.so

可以打开ipython来验证一下:

In [1]: import cv2

In [2]: print(cv2.__version__)

3.3.1-dev

安装face_recognition

这个比较简单,官方写了一份文档非常详细,可以下载看看:

https://media.readthedocs.org/pdf/face-recognition/latest/face-recognition.pdf

要说明的是,在看安装说明时仔细一点。安装face_recognition之前需要先安装dlib,文档上都有链接,亲测可用,非常顺畅。

人脸识别

接下来该编写一小段程序了,不过不要发慌,程序也有现成的例子,只需要根据自己的需求改一改,就可以了。python语言的优点就是阅读性很强,基本能看懂英语的都能读懂代码什么意思,所以这份代码的样例读起来也很容易,连接在这里:

https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam_faster.py

上面的注释是比较详细的,这里我挑几段简单介绍一下:

video_capture=cv2.VideoCapture()

# Find all the faces and face encodings in the current frame of video

face_locations=face_recognition.face_locations(small_frame)

face_encodings=face_recognition.face_encodings(small_frame,face_locations)③

第1行是将摄像头打开,开始捕捉画面;第2行是寻找画面中出现的人脸图像,第3行是提取出人脸图像中的特征。什么是特征?你可以简单把他理解为电脑为识别出人脸而定制的一套规则,符合这套规则就被认为是人脸。

找出人脸后与预存的人脸进行对比。对比的操作实际上就是计算相似度。首先需要将预存的人脸图像进行向量化,存储为numpy.array格式。当然,为了每次启动程序时不必重复对预存的图片向量化,可以将结果进行存储,用的时候读取就行。

importos

importface_recognition

importnumpyasnp

importconstantsascons

know_face_path=cons.BASE_FACES_PATH

model_path=cons.MODEL_PATH

time_now=cons.time_str

known_faces=[]

known_names=[]

forindex,file_nameinenumerate(sorted(os.listdir(know_face_path))):# 为了调用时顺序一致test_image=face_recognition.load_image_file(know_face_path+'/'+file_name)model=face_recognition.face_encodings(test_image)[]np.savetxt(model_path+'/'+time_now+'_'+str(index)+'.model',model)

接下来,开始计算距离,排序,选出在我所设置阈值内的最小值,进行标识:

match=face_recognition.compare_faces(known_faces,face_encoding,tolerance=0.38)

dis=face_recognition.face_distance(known_faces,face_encoding)

name="Unknown"

id=np.argmin(dis)

ifmatch[id]:name=known_names[id].split('.')[]

好了,这就是代码中的主要部分,剩下的就是一些个性化的定制了。比如你可以在检测到人脸之后,给自己发送微信消息,这就用到了wxpy

登录微信:

# 导入模块

from wxpy import *

# 初始化机器人,扫码登录

bot = Bot()

寻找好友:

my_firend = bot.friends().search('张三', sex=MALE)[0]

发送消息:

# 发送文本给好友

my_friend.send('Hello!!!')

# 发送图片

my_friend.send_image('my_picture.fig')

其他的一些好玩的功能可以去github上瞧瞧:

https://github.com/youfou/wxpy

展示

以上就是制作人脸识别系统的过程,过程相对比较简单,只要有耐心,都能够制作完成,尤其是当看到系统正常运行时的心情,如沐浴春风,北京的天都蓝了。

以下是我的运行结果图(为银行制作,后面搭接一个产品推荐系统):

动起手来,丰富自己的生活

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180415G0M7YM00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券