刚编译完seetaface2后就发现seetaface6已经出来了。对比可下两者间的结构还是差别挺大的
seetaface6:
- 基于BSD协议,可以商业使用
- 基于tennis引擎,再也没有社区版和商业版的区别
- 开放基于MobileNet的识别模型,利于边缘设备部署
- 活体检测、口罩人脸识别、人脸属性分析,闭眼检测等等均开放
源码下载
使用 git clone --recursive https://github.com/SeetaFace6Open/index.git 命令下载下来后发现各个模块子目录下还是空的,这里只能一个模块一个模块去下载了,目录结构大概就如下图了
编译顺序
OpenRoleZoo 为常用操作的集合,SeetaAuthorize 为模型解析工程,TenniS 为前向计算框架。需要重点说明的是,此次 TenniS 同时放出了 GPU 计算源码,可以编译出 GPU 版本进行使用。上述三个模块为基础模块,各个 SDK 的编译均依赖上述模块,因此需要优先编译出 OpenRoleZoo, SeetaAuthorize 和 TenniS,然后再进行其他 SDK 模块的编译。
编译参考
每个模块目录下都有一个craft文件夹,下面放了一些编译脚本
我用的是window下的32位mingw编译器,这里打开build.win.vc14.x86.cmd文件作为参考:
@echo off
set "BUILD_DIR=build.win.vc14.x86"
set "BUILD_TYPE=Release"
set "PLATFORM=x86"
set "PLATFORM_TARGET=x86"
set "WITH_SSL=OFF"
set "INSTALL_DIR=../../../build"
call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" %PLATFORM%
cd %~dp0
md "%BUILD_DIR%"
cd "%BUILD_DIR%"
md "%INSTALL_DIR%"
cmake "%~dp0.." ^
-G"NMake Makefiles JOM" ^
-DCMAKE_BUILD_TYPE="%BUILD_TYPE%" ^
-DPLATFORM="%PLATFORM_TARGET%" ^
-DORZ_WITH_OPENSSL="%WITH_SSL%" ^
-DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%"
jom -j16 install
exit /b
VS140COMNTOOLS 是微软的编译器
上面可以看到一些编译参数,试应cmake配置时对应加入上面参数,略有修改
编译OpenRoleZoo
打开cmake
PLATFORM = x86
CMAKE_BUILD_TYPE = Release
CMAKE_INSTALL_PREFIX = D:/nbook/SeetaFace/install
ORZ_WITH_OPENSSL=OFF
点击Configure,Generate生成编辑所需要的信息
用dos命令进入目录D:\nbook\SeetaFace\buile_SeetaFace6\OpenRoleZoo。这里我用的是MobaXtem这个软件,也可以用window自带的dos窗口
执行
mingw32-make.exe
mingw32-make.exe install
编译SeetaAuthorize
打开cmake
PLATFORM = x86
CMAKE_BUILD_TYPE = Release
CMAKE_INSTALL_PREFIX = D:/nbook/SeetaFace/install
ORZ_WITH_OPENSSL=OFF
ORZ_ROOT_DIR = D:/nbook/SeetaFace/install/
LIB_ROOT_DIR= D:/nbook/SeetaFace/install/lib/x86/libORZ_static.a
编译TenniS
PLATFORM = x86
CMAKE_BUILD_TYPE = Release
CMAKE_INSTALL_PREFIX = D:/nbook/SeetaFace/install
ORZ_WITH_OPENSSL=OFF
ORZ_ROOT_DIR = D:/nbook/SeetaFace/install/
CONFIGURATION=Release
TS_USE_OPENMP=ON
TS_USE_SIMD=ON
TS_ON_HASWELL=ON
TS_DYNAMIC_INSTRUCTION=ON
执行 mingw32-make.exe 报错:
D:\nbook\SeetaFace\index\TenniS\src\runtime\importor.cpp:30:31: error: invalid conversion from 'FARPROC {aka int (__attribute__((__stdcall__)) *)()}' to 'void*' [-fpermissive]
return GET_FUC_ADDRESS(m_handle, fuc_name.c_str());
大概就是说 return GET_FUC_ADDRESS(m_handle, fuc_name.c_str());类型转换错误
打开D:\nbook\SeetaFace\index\TenniS\src\runtime\importor.cpp,找到30行
修改前:
void* Importor::get_fuc_address(const std::string& fuc_name){
if(m_handle == nullptr){
TS_LOG_ERROR << "handle is nullptr,please call load() first." << eject;
}
return GET_FUC_ADDRESS(m_handle, fuc_name.c_str());
}
修改后:
void* Importor::get_fuc_address(const std::string& fuc_name){
if(m_handle == nullptr){
TS_LOG_ERROR << "handle is nullptr,please call load() first." << eject;
}
return (void *)GET_FUC_ADDRESS(m_handle, fuc_name.c_str());
}
原因:
Visual C++ 编译器有一个"扩展",允许从pointer-to-function到 void*
的隐式转换。 这里转换不是 C++ 语言的一部分。MinGw没有此扩展
至此3个基础模块编译完成了
编译SeetaEyeStateDetector
PLATFORM = x86
CMAKE_BUILD_TYPE = Release
CMAKE_INSTALL_PREFIX = D:/nbook/SeetaFace/install
ORZ_WITH_OPENSSL=OFF
ORZ_ROOT_DIR = D:/nbook/SeetaFace/install/
CONFIGURATION=Release
SEETA_AUTHORIZE=OFF
SEETA_MODEL_ENCRYPT=ON
SeetaAuthorize_dir=D:/nbook/SeetaFace/install/
CMAKE_MODULE_PATH=D:/nbook/SeetaFace/install/cmake(没有这个找不到之前编译库安装路径)
打开D:\nbook\SeetaFace\index\SeetaEyeStateDetector/CMakeLists.txt
找到下图这行,去掉FORCE,否则无修改安装路径
Configure后再重新选择各个库
这里不选bin/下的dll库,不选择lib下的.dll.a库,否则编译时会爆出多重定义
到这里我遇到的坑都填完了,后面几个模块照这样一个个编译