Seetaface 人脸识别 for Linux/Mac

最近做人脸检测的项目,需要用到中科院山世光老师团队开源的SeetaFace,在Ubuntu、Mac端分别进行了编译,系统信息如下:

Ubuntu:16.04 opencv:3.1.0 cmake:3.5.1
MacOS:10.13 opencv:3.4.3 cmake:3.0.2

FaceDetection 模块

1
2
3
4
5
cd ~/<user name>/SeetaFaceEngine/FaceDetection
mkdir build
cd build
cmake ..
make -j8

不出意外即可在build目录下生成可执行文件facedet_test,调用方式./facedet_test image_path ../model/seeta_fd_frontal_v1.0.bin,结果如图示
图片名称
PS:
1、编译阶段若提示opencv版本问题
ccmake .. 修改其中OpenCV_DIR路径为自己的opencv安装目录,configuration使之生效
Eg:OpenCV_DIR /home//opencv-3.1.0/build
接着设置CUDA_USE_STATIC_CUDA_RUNTIME OFF
重新cmake ..,不报错再继续make

FaceAlignment 模块

该模块依赖FaceDetection,先检测图像中哪个区域存在人脸,之后进行关键点检测,所以先复制FaceDetection模块中的相关头文件、依赖、模型到FaceAlignment/build目录中,具体如下:

1
2
3
4
5
6
cd ~/<user name>/SeetaFaceEngine/FaceAlignment
mkdir build
cd build
cp ../../FaceDetection/include/face_detection.h ../include
cp ../../FaceDetection/build/libseeta_facedet_lib.so ./
cp ../../FaceDetection/model/seeta_fd_frontal_v1.0.bin ./

接着修改face_alignment_test.cpp中,FaceDetection model路径

1
2
// Initialize face detection model
seeta::FaceDetection detector("./build/seeta_fd_frontal_v1.0.bin");

接着编译

1
2
cmake ..
make -j8

之后运行下./build/fa_test,生成如图示的关键点检测图片(注意.cpp文件中定义了仅能检测一张人脸)
图片名称
PS:
1、编译阶段若提示‘isnan’ was not declared in this scope,定位到源文件,修改为std::isnan便可以了。
2、运行阶段提示Segmentation fault (core dumped),应该是模型或图片路径不对,对于Linux或mac,cpp文件中指定的路径应当是相对于CMakelists.txt的路径

FaceIdentification 模块

类似的步骤如上,把FaceDetection、FaceAlignment模块的相关依赖拷贝进入build文件夹。

1
2
3
4
5
6
7
8
9
cd ~/<user name>/SeetaFaceEngine/FaceAlignment
mkdir build
cd build
cp ../../FaceDetection/include/face_detection.h ../include
cp ../../FaceDetection/build/libseeta_facedet_lib.so ./
cp ../../FaceDetection/model/seeta_fd_frontal_v1.0.bin ./
cp ../../FaceAlignment/include/face_alignment.h ../include
cp ../../FaceAlignment/build/libseeta_fa_lib.so ./
cp ../../FaceAlignment/model/seeta_fa_v1.1.bin ./

解压FaceIdentification/model中的两个文件(解压part1,会自动将part2解压),同样修改./src/test目录的两个CPP文件中,前两个model的路径,同上。
 
再修改/test下的两个cpp文件,加上opencv2头文件,注意这里头文件顺序需要放在cvLIB宏定义之后,如下:

1
2
3
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

接着编译

1
2
cmake ..
make -j8

之后运行./build/src/test/test_face_recognizer.bin,测试3个模块。./build/src/test/test_face_verification.bin测试存取的样本中图片的相似度即可。
PS:
1、编译到99%时报错,提示没有相关的库,需要改写/src/test中的Cmakelists.txt,在其中添加Detect、Align模块的lib库(也就是在当前build文件夹下查找),如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
aux_source_directory (. SRC_LIST)
link_directories(${PROJECT_BINARY_DIR}) # 添加lib库搜索路径
message(${SRC_LIST})
# add external libraries
find_package(OpenCV REQUIRED)
include_directories(${seeta_facedet_lib_INCLUDE_DIRS} ${seeta_fa_lib_INCLUDE_DIRS})
list(APPEND seeta_fi_lib_required_libs ${OpenCV_LIBS} seeta_facedet_lib seeta_fa_lib)
enable_testing ()
foreach (f ${SRC_LIST})
string(REGEX REPLACE "[.]cpp" ".bin" BIN ${f})
add_executable(${BIN} ${f})
#target_link_libraries(${BIN} viplnet ${OpenCV_LIBS} seeta_facede_lib seeta_fa_lib)
target_link_libraries(${BIN} viplnet ${seeta_fi_lib_required_libs}) # 添加lib
endforeach ()

Mac编译

与Linux相比,Mac的就非常简单了,需要注意Detection模块中,CMakelists.txt要求的cmake为3.1及以上,笔者是3.0,所以在这里对CMakelists.txt做简单修改,如果是Brew安装的opencv,那其他的ccmake配置也不用修改
 
之后的操作步骤与Linux描述的基本一致,编译过程中可能会有很多warning,不用管,直接make即可。