最近做人脸检测的项目,需要用到中科院山世光老师团队开源的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 | cd ~/<user name>/SeetaFaceEngine/FaceDetection |
不出意外即可在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/
接着设置CUDA_USE_STATIC_CUDA_RUNTIME OFF
重新cmake ..
,不报错再继续make
。
FaceAlignment 模块
该模块依赖FaceDetection,先检测图像中哪个区域存在人脸,之后进行关键点检测,所以先复制FaceDetection模块中的相关头文件、依赖、模型到FaceAlignment/build目录中,具体如下:1
2
3
4
5
6cd ~/<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
2cmake ..
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
9cd ~/<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
2cmake ..
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
14aux_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
即可。