人脸识别:使用MinGW编译seetaface6

刚编译完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库,否则编译时会爆出多重定义 

 到这里我遇到的坑都填完了,后面几个模块照这样一个个编译

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值