【人臉識別實戰一】系統架構設計
- 2020 年 4 月 19 日
- AI
1、前言
《人臉識別實戰》系列文章將講述一個人臉識別系統的設計與實現過程。本文是系列文章的開篇,主要描述系統的整體架構和各模塊的功能職責,以及系統所需要的環境依賴部署。
2、系統整體架構

2.1 服務器端
(1)網絡消息處理模塊
主要負責管理客戶端發送來的網絡連接請求、消息數據的收發與數據協議解析,以及對圖像數據的編解碼處理。在系統中以JSON格式進行消息封裝,使用TCP連接進行收發通信,而圖像數據的解碼僅支持OpenCV對圖像數據的編解碼操作。
(2)圖像處理模塊
圖像處理模塊負責處理人臉圖像的數據,需要實現的功能包括:
- 人臉檢測:如果客戶端發送來的圖像數據是人臉圖像則不需要再進行檢測,否則就需要對人臉進行檢測。系統將採用基於ncnn實現的MTCNN算法進行部署。
- 人臉對齊:將檢測到的人臉圖像區域調整到正常角度,系統中將使用OpenCV的仿射變換來進行對齊。
- 人臉特徵提取:系統將集成FaceNet和InsightFace兩種算法進行人臉的特徵提取。
- 人臉特徵比對:使用歐式距離進行人臉特徵比對,在閾值範圍內選擇最小值作為比對結果。
(3)數據庫管理模塊
數據庫管理模塊負責數據庫的連接與管理以及用戶數據的增刪改查,主要包括新用戶的信息及人臉特徵的註冊與刪除,以及人臉特徵比對時的查詢操作。系統中使用MySql數據庫作為存儲倉庫。
2.2 客戶端
(1)網絡處理模塊
主要的功能與服務器端相同,可以復用。
(2)圖像處理模塊
圖像處理模塊在客戶端中僅需要實現人臉檢測及人臉對齊即可。
3、環境部署
3.1 依賴
(1)硬件依賴
-
服務器端:需要運行的人臉特徵算法比較耗時,需要GPU加速支持。
-
客戶端:攝像頭讀取圖像,處理器僅需要CPU即可。
(2)軟件依賴
- 服務器端『
- Tensorflow C++動態庫:用於支持FaceNet與InsightFace的運行。
- OpenCV C++動態庫:用於支持圖像數據讀取,編解碼,人臉對齊等操作。
- ncnn:用於實現MTCNN。
- Cuda:支持GPU運行。
- MySql:數據庫開發庫。
- 客戶端
- OpenCV:用於支持圖像數據讀取,編解碼及人臉對齊等操作。
- ncnn:用於實現MTCNN算法的人臉檢測。
3.2 環境部署
(1)基礎依賴安裝
sudo apt-get install -y cmake
sudo apt-get install -y libeigen3-dev
sudo apt-get install -y zlib1g zlib1g.dev
sudo apt-get install -y build-essential libgtk2.0-dev libavcodec-dev
sudo apt-get install -y libavformat-dev libjpeg-dev libtiff5-dev
sudo apt-get install -y libswscale-dev libjasper-dev
sudo apt-get install mysql-server mysql-client libmysqlclient-dev
sudo apt-get install libopenblas-dev
(2)OpenCV編譯安裝
wget //github.com/opencv/opencv/archive/4.1.1.zip
sudo apt-get install -y unzip
unzip -x 4.1.1.zip
OPENCV_DIR=$(pwd)/opencv-4.1.1
cd $OPENCV_DIR
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make
sudo make install
sudo echo /usr/local/lib >> /etc/ld.so.conf.d/opencv.conf
sudo ldconfig
sudo echo -e "PKG_CONFIG_PATH=\$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig\nexport PKG_CONFIG_PATH" >> /etc/bash.bashrc
source /etc/bash.bashrc
sudo updatedb
(3)tensorflow動態庫編譯
- 下載源碼
git clone //github.com/tensorflow/tensorflow.git
- cd到tensorflow目錄,更新到1.14版本
git checkout r1.14
- 執行./configure進行項目配置
- 使用bazel工具進行編譯
bazel build --config=opt //tensorflow:libtensorflow_cc.so
- 編譯完成後,在tensorflow根目錄下出現 bazel-bin, bazel-genfiles 等文件夾, 按順序執行以下命令將對應的libtensorflow_cc.so文件和其他文件拷貝進入 /usr/local/lib/ 目錄完成後就準備好了tensorflow_cc.so文件,後面在C++編譯環境和代碼目錄下編譯時鏈接這些庫即可,比如在CMakefile.txt中添加
mkdir /usr/local/include/tf
cp -r bazel-genfiles/ /usr/local/include/tf/
cp -r tensorflow /usr/local/include/tf/
cp -r third_party /usr/local/include/tf/
cp -r bazel-bin/tensorflow/libtensorflow* /usr/local/lib/
- 完成後就準備好了tensorflow_cc.so文件,後面在C++編譯環境和代碼目錄下編譯時鏈接這些庫即可,比如在CMakefile.txt中添加
include_directories(/usr/local/include/tf)
target_link_libraries(face_id -ltensorflow_cc -ltensorflow_framework)
(4)Cuda安裝
可以參考官網及其它網絡資源的教程,這裡不再詳述。
詳細的設計細節及項目源碼地址在以下的公眾號 AIPlayer 發佈: