1、前言
《人脸识别实战》系列文章将讲述一个人脸识别系统的设计与实现过程。本文是系列文章的开篇,主要描述系统的整体架构和各模块的功能职责,以及系统所需要的环境依赖部署。详细的设计细节及项目源码地址在以下的公众号发布:
文章同步更新在公众号 AIPlayer,欢迎扫码关注,共同进步2、系统整体架构
文章图片
文章图片
2.1 服务器端
(1)网络消息处理模块
主要负责管理客户端发送来的网络连接请求、消息数据的收发与数据协议解析,以及对图像数据的编解码处理。在系统中以JSON格式进行消息封装,使用TCP连接进行收发通信,而图像数据的解码仅支持OpenCV对图像数据的编解码操作。
(2)图像处理模块
图像处理模块负责处理人脸图像的数据,需要实现的功能包括:
- 人脸检测:如果客户端发送来的图像数据是人脸图像则不需要再进行检测,否则就需要对人脸进行检测。系统将采用基于ncnn实现的MTCNN算法进行部署。
- 人脸对齐:将检测到的人脸图像区域调整到正常角度,系统中将使用OpenCV的仿射变换来进行对齐。
- 人脸特征提取:系统将集成FaceNet和InsightFace两种算法进行人脸的特征提取。
- 人脸特征比对:使用欧式距离进行人脸特征比对,在阈值范围内选择最小值作为比对结果。
数据库管理模块负责数据库的连接与管理以及用户数据的增删改查,主要包括新用户的信息及人脸特征的注册与删除,以及人脸特征比对时的查询操作。系统中使用MySql数据库作为存储仓库。
2.2 客户端
(1)网络处理模块
主要的功能与服务器端相同,可以复用。
(2)图像处理模块
图像处理模块在客户端中仅需要实现人脸检测及人脸对齐即可。
3、环境部署
3.1 依赖
(1)硬件依赖
- 服务器端:需要运行的人脸特征算法比较耗时,需要GPU加速支持。
- 客户端:摄像头读取图像,处理器仅需要CPU即可。
- 服务器端
- Tensorflow C++动态库:用于支持FaceNet与InsightFace的运行。
- OpenCV C++动态库:用于支持图像数据读取,编解码,人脸对齐等操作。
- ncnn:用于实现MTCNN。
- Cuda:支持GPU运行。
- MySql:数据库开发库。
- Tensorflow C++动态库:用于支持FaceNet与InsightFace的运行。
- 客户端
- OpenCV:用于支持图像数据读取,编解码及人脸对齐等操作。
- ncnn:用于实现MTCNN算法的人脸检测。
- OpenCV:用于支持图像数据读取,编解码及人脸对齐等操作。
(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 https://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 https://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,欢迎扫码关注,共同进步
【人工智能|【人脸识别实战一】系统架构设计】
文章图片
推荐阅读
- 阅读笔记|GIN(图神经网络有多强大? HOW POWERFUL ARE GRAPH NEURALNET WORKS)
- 【SIGIR 2022】面向长代码序列的Transformer模型优化方法,提升长代码场景性能
- 资讯|为什么有些程序员敲代码太慢,效率太低()
- 芯片|从学术空间通往商业之路 系统性AI芯片专著《人工智能芯片设计》面世
- 算法|【整数规划算法】列生成(理论分析+Python代码实现)
- 算法|AAAI2021(面向交通流预测的时空融合图神经网络)
- 算法|图神经网络(01)-图与图学习(上)
- ML学习分享系列|ML学习分享系列3_计算广告小窥[下]要啥自行车!
- 神经网络|神经网络究竟干了一件什么事()