教你如何製作自己的人臉識別系統

教你如何製作自己的人臉識別系統

其實這套系統的原理很簡單,本著能夠讓每個人都能讀懂的原則,一定不要用專業的眼光去看這套系統,其實它只不過是用幾個現成的組件拼接而成的。

系統流程如圖:

準備工作:攝像頭,Ubuntu系統、python開發環境、網路環境

沒錯,就是這麼簡單,需要準備的東西並不多。這裡你也可以用Windows系統來搭建,只要你高興,怎麼著都行。

安裝python的依賴包

對於python環境,你可以直接通過下載anaconda,它是一款python的集成開發環境,裡面包含了大量的python依賴包。接下來會安裝一些anaconda中沒有的依賴包:face_recognition、OpenaCV、pymysql、wxpy

對於pymysql,可以這麼安裝:

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

對於face_recognition和OpenaCV,會比較麻煩

安裝OpenCV

裝一大堆內核:

#Remove any previous installations of x264sudo apt-get remove x264 libx264-dev#We will Install dependencies nowsudo apt-get install build-essential checkinstall cmake pkg-config yasmsudo apt-get install git gfortransudo apt-get install libjpeg8-dev libjasper-dev libpng12-dev# If you are using Ubuntu 14.04sudo apt-get install libtiff4-dev# If you are using Ubuntu 16.04sudo apt-get install libtiff5-devsudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-devsudo apt-get install libxine2-dev libv4l-devsudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-devsudo apt-get install qt5-default libgtk2.0-dev libtbb-devsudo apt-get install libatlas-base-devsudo apt-get install libfaac-dev libmp3lame-dev libtheora-devsudo apt-get install libvorbis-dev libxvidcore-devsudo apt-get install libopencore-amrnb-dev libopencore-amrwb-devsudo apt-get install x264 v4l-utils# Optional dependenciessudo apt-get install libprotobuf-dev protobuf-compilersudo apt-get install libgoogle-glog-dev libgflags-devsudo apt-get install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen

下載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 ..

開始編譯:

cd opencv mkdir releasecd releasecmake -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=$(which python) -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 make install # 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已經編譯完成了,在你的

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

下會有一個 cv*.so 的文件,創建一個軟連接到你的虛擬環境下就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 cv2In [2]: print(cv2.__version__)3.3.1-dev

安裝face_recognition

這個比較簡單,官方寫了一份文檔非常詳細,可以下載看看:

media.readthedocs.org/p

要說明的是,在看安裝說明時仔細一點。安裝face_recognition之前需要先安裝dlib,文檔上都有鏈接,親測可用,非常順暢。

人臉識別

接下來該編寫一小段程序了,不過不要發慌,程序也有現成的例子,只需要根據自己的需求改一改,就可以了。python語言的優點就是閱讀性很強,基本能看懂英語的都能讀懂代碼什麼意思,所以這份代碼的樣例讀起來也很容易,連接在這裡:

github.com/ageitgey/fac

上面的注釋是比較詳細的,這裡我挑幾段簡單介紹一下:

video_capture = cv2.VideoCapture(0) ①# Find all the faces and face encodings in the current frame of videoface_locations = face_recognition.face_locations(small_frame) ②face_encodings = face_recognition.face_encodings(small_frame, face_locations) ③

第1行是將攝像頭打開,開始捕捉畫面;第2行是尋找畫面中出現的人臉圖像,第3行是提取出人臉圖像中的特徵。什麼是特徵?你可以簡單把他理解為電腦為識別出人臉而定製的一套規則,符合這套規則就被認為是人臉。

找出人臉後與預存的人臉進行對比。對比的操作實際上就是計算相似度。首先需要將預存的人臉圖像進行向量化,存儲為numpy.array格式。當然,為了每次啟動程序時不必重複對預存的圖片向量化,可以將結果進行存儲,用的時候讀取就行。

import os import face_recognitionimport numpy as np import constants as consknow_face_path = cons.BASE_FACES_PATHmodel_path = cons.MODEL_PATHtime_now = cons.time_strknown_faces = [] known_names = []for index, file_name in enumerate(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)[0] 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)if match[id]: name = known_names[id].split(.)[0]

好了,這就是代碼中的主要部分,剩下的就是一些個性化的定製了。比如你可以在檢測到人臉之後,給自己發送微信消息,這就用到了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上瞧瞧:

github.com/youfou/wxpy

展示

以上就是製作人臉識別系統的過程,過程相對比較簡單,只要有耐心,都能夠製作完成,尤其是當看到系統正常運行時的心情,如沐浴春風,北京的天都藍了。

以下是我的運行結果圖(為銀行製作,後面搭接一個產品推薦系統):


推薦閱讀:

人臉識別的LOSS(上)
走在路上能被識別人臉,該為高科技而喜還是為隱私而憂?
目標檢測Tensorflow object detection API之構建自己的模型
MTCNN人臉檢測---PNet網路訓練
智慧春運時代:迅通人臉識別儀「刷」新你的春運印象

TAG:計算機視覺 | 人臉識別 |