【人臉識別實戰一】系統架構設計

  • 2020 年 4 月 19 日
  • AI

1、前言

人臉識別實戰》系列文章將講述一個人臉識別系統的設計與實現過程。本文是系列文章的開篇,主要描述系統的整體架構和各模組的功能職責,以及系統所需要的環境依賴部署。

2、系統整體架構

系統框圖.png

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 發布:

掃碼.jpg