教你如何製作自己的人臉識別系統
其實這套系統的原理很簡單,本著能夠讓每個人都能讀懂的原則,一定不要用專業的眼光去看這套系統,其實它只不過是用幾個現成的組件拼接而成的。
系統流程如圖:
準備工作:攝像頭,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
這個比較簡單,官方寫了一份文檔非常詳細,可以下載看看:
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(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上瞧瞧:
https://github.com/youfou/wxpy
展示
以上就是製作人臉識別系統的過程,過程相對比較簡單,只要有耐心,都能夠製作完成,尤其是當看到系統正常運行時的心情,如沐浴春風,北京的天都藍了。
以下是我的運行結果圖(為銀行製作,後面搭接一個產品推薦系統):
推薦閱讀:
※人臉識別的LOSS(上)
※走在路上能被識別人臉,該為高科技而喜還是為隱私而憂?
※目標檢測Tensorflow object detection API之構建自己的模型
※MTCNN人臉檢測---PNet網路訓練
※智慧春運時代:迅通人臉識別儀「刷」新你的春運印象