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

  • 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
Exit mobile version