其實這套系統的原理很簡單,本著能夠讓每個人都能讀懂的原則,一定不要用專業的眼光去看這套系統,其實它只不過是用幾個現成的元件拼接而成的。
系統流程如圖:
準備工作:攝像頭,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 x264
sudo apt-get remove x264 libx264-dev
#We will Install dependencies now
sudo 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。04
sudo apt-get install libtiff4-dev
# If you are using Ubuntu 16。04
sudo apt-get install libtiff5-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
sudo apt-get install libxine2-dev libv4l-dev
sudo apt-get install libgstreamer0。10-dev libgstreamer-plugins-base0。10-dev
sudo apt-get install qt5-default libgtk2。0-dev libtbb-dev
sudo apt-get install libatlas-base-devsudo apt-get install libfaac-dev libmp3lame-dev libtheora-dev
sudo apt-get install libvorbis-dev libxvidcore-dev
sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt-get install x264 v4l-utils
# Optional dependencies
sudo apt-get install libprotobuf-dev protobuf-compiler
sudo apt-get install libgoogle-glog-dev libgflags-dev
sudo apt-get install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen
下載opencv包:
git clone https://github。com/opencv/opencv。git
cd opencv
git checkout 3。3。1
cd 。。
下載opencv_contrib包:
git
clone
https
:
//
github
。
com
/
opencv
/
opencv_contrib
。
git
cd
opencv_contrib
git
checkout
3
。
3
。
1
cd
。。
開始編譯:
cd opencv
mkdir release
cd release
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=$(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 cv2
In [2]: print(cv2。__version__)
3。3。1-dev
安裝face_recognition
這個比較簡單,官方寫了一份文件非常詳細,可以下載看看:
https://
media。readthedocs。org/p
df/face-recognition/latest/face-recognition。pdf
要說明的是,在看安裝說明時仔細一點。安裝face_recognition之前需要先安裝dlib,文件上都有連結,親測可用,非常順暢。
人臉識別
接下來該編寫一小段程式了,不過不要發慌,程式也有現成的例子,只需要根據自己的需求改一改,就可以了。python語言的優點就是閱讀性很強,基本能看懂英語的都能讀懂程式碼什麼意思,所以這份程式碼的樣例讀起來也很容易,連線在這裡:
https://
github。com/ageitgey/fac
e_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 video
face_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_recognition
import numpy as np
import constants as cons
know_face_path = cons。BASE_FACES_PATH
model_path = cons。MODEL_PATH
time_now = cons。time_str
known_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
展示
以上就是製作人臉識別系統的過程,過程相對比較簡單,只要有耐心,都能夠製作完成,尤其是當看到系統正常執行時的心情,如沐浴春風,北京的天都藍了。
以下是我的執行結果圖(為銀行製作,後面搭接一個產品推薦系統):