人脸识别:使用MinGW编译seetaface6
剛編譯完seetaface2后就發(fā)現(xiàn)seetaface6已經(jīng)出來了。對(duì)比可下兩者間的結(jié)構(gòu)還是差別挺大的
seetaface6:
- 基于BSD協(xié)議,可以商業(yè)使用
- 基于tennis引擎,再也沒有社區(qū)版和商業(yè)版的區(qū)別
- 開放基于MobileNet的識(shí)別模型,利于邊緣設(shè)備部署
- 活體檢測(cè)、口罩人臉識(shí)別、人臉屬性分析,閉眼檢測(cè)等等均開放
源碼下載
源碼地址
使用?git clone --recursive https://github.com/SeetaFace6Open/index.git 命令下載下來后發(fā)現(xiàn)各個(gè)模塊子目錄下還是空的,這里只能一個(gè)模塊一個(gè)模塊去下載了,目錄結(jié)構(gòu)大概就如下圖了
?編譯順序
OpenRoleZoo 為常用操作的集合,SeetaAuthorize 為模型解析工程,TenniS 為前向計(jì)算框架。需要重點(diǎn)說明的是,此次 TenniS 同時(shí)放出了?GPU?計(jì)算源碼,可以編譯出?GPU?版本進(jìn)行使用。上述三個(gè)模塊為基礎(chǔ)模塊,各個(gè) SDK 的編譯均依賴上述模塊,因此需要優(yōu)先編譯出 OpenRoleZoo, SeetaAuthorize 和 TenniS,然后再進(jìn)行其他 SDK 模塊的編譯。
編譯參考
每個(gè)模塊目錄下都有一個(gè)craft文件夾,下面放了一些編譯腳本
?我用的是window下的32位mingw編譯器,這里打開build.win.vc14.x86.cmd文件作為參考:
@echo offset "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 %~dp0md "%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 installexit /bVS140COMNTOOLS 是微軟的編譯器
上面可以看到一些編譯參數(shù),試應(yīng)cmake配置時(shí)對(duì)應(yīng)加入上面參數(shù),略有修改
編譯OpenRoleZoo
打開cmake
PLATFORM = x86
CMAKE_BUILD_TYPE =?Release
CMAKE_INSTALL_PREFIX =?D:/nbook/SeetaFace/install
ORZ_WITH_OPENSSL=OFF
?點(diǎn)擊Configure,Generate生成編輯所需要的信息
用dos命令進(jìn)入目錄D:\nbook\SeetaFace\buile_SeetaFace6\OpenRoleZoo。這里我用的是MobaXtem這個(gè)軟件,也可以用window自帶的dos窗口
執(zhí)行
?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
執(zhí)行?mingw32-make.exe 報(bào)錯(cuò):
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());類型轉(zhuǎn)換錯(cuò)誤
打開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++ 編譯器有一個(gè)"擴(kuò)展",允許從pointer-to-function到?void*的隱式轉(zhuǎn)換。 這里轉(zhuǎn)換不是 C++ 語言的一部分。MinGw沒有此擴(kuò)展
至此3個(gè)基礎(chǔ)模塊編譯完成了
編譯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(沒有這個(gè)找不到之前編譯庫安裝路徑)
打開D:\nbook\SeetaFace\index\SeetaEyeStateDetector/CMakeLists.txt
找到下圖這行,去掉FORCE,否則無修改安裝路徑
Configure后再重新選擇各個(gè)庫
這里不選bin/下的dll庫,不選擇lib下的.dll.a庫,否則編譯時(shí)會(huì)爆出多重定義?
?到這里我遇到的坑都填完了,后面幾個(gè)模塊照這樣一個(gè)個(gè)編譯
總結(jié)
以上是生活随笔為你收集整理的人脸识别:使用MinGW编译seetaface6的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 淘宝规则大改动,中差评取消了,对于中小卖
- 下一篇: SeetaFace编译使用 中科院人脸