SeetaFace6人臉活體檢測C++代碼實現Demo

????????SeetaFace6包含人臉識別的基本能力:人臉檢測、關鍵點定位、人臉識別,同時增加了活體檢測、質量評估、年齡性別估計,并且順應實際應用需求,開放口罩檢測以及口罩佩戴場景下的人臉識別模型。

????????官網地址:https://github.com/SeetaFace6Open/index

1. 概述

????????活體檢測是判斷人臉圖像是來自真人還是來自攻擊假體(照片、視頻等)的方法。

????????人臉識別系統存在被偽造攻擊的風險。因此需要在人臉識別系統中加入活體檢測,驗證用戶是否為真實活體本人操作,以防止照片、視頻、以及三維模型的入侵,從而幫助用戶甄別欺詐行為,保障用戶的利益。

????????活體檢測分為靜默活體檢測和配合式活體檢測。配合式活體檢測即“張張嘴”、“眨眨眼”、“搖搖頭”之類;多應用于APP刷臉登錄、注冊等。靜默活體檢測是不需要任何動作配合,通過算法和攝像頭的配合,進行活體判定;使用起來非常方便,用戶在無感的情況下就可以通過檢測比對,效率非常高。

????《GB∕T 41772-2022 信息技術 生物特征識別 人臉識別系統技術要求》給出了假體攻擊類型包括不限于二維假體攻擊和三維假體攻擊,如下表所示。

二維假體攻擊

二維靜態紙張圖像攻擊

樣本材質

打印紙、亞光相紙、高光相紙、絨面相紙、啞粉紙、銅版紙等

樣本質量

分辨率、清晰度、大小、角度、光照條件、完整度等

呈現方式

距離、角度、移動、彎曲、折疊等

裁剪方式

圖像是否扣除眼部、鼻子、嘴巴等

二維靜態電子圖像攻擊

設備類型

移動終端、微型計算機等

設備顯示性能

分辨率、亮度、對比度等

樣本質量

分辨率、清晰度、大小、角度、光照條件、完整度等

呈現方式

距離、角度、移動等

二維動態圖像攻擊

圖像類型

錄制視頻、合成視頻等

設備類型

移動終端、微型計算機等

設備顯示性能

分辨率、亮度、對比度等

圖像質量

分辨率、清晰度、幀率等

呈現方式

距離、角度、移動等

三維假體攻擊

三維面具攻擊

面具材質

塑料面具、三維紙張面具、硅膠面具等

呈現方式

距離、角度、移動等

光線條件

正常光、強光、弱光、逆光等

裁剪方式

面具是否扣除眼部、鼻子、嘴巴等

三維頭模攻擊

頭模材質

泡沫、樹脂、全彩砂巖、石英砂等

呈現方式

距離、角度、移動等

光線條件

正常光、強光、弱光、逆光等

2. SeetaFace6活體檢測

????????SeetaFace6的活體檢測方案,提供了全局活體檢測和局部活體檢測 兩個方法。

  • 全局活體檢測就是對圖片整體做檢測,主要是判斷是否出現了活體檢測潛在的攻擊介質,如手機、平板、照片等等。
  • 局部活體檢測是對具體人臉的成像細節通過算法分析,區別是一次成像和二次成像,如果是二次成像則認為是出現了攻擊。

2.1 基本使用

????????活體檢測識別器可以加載一個局部檢測模型或者局部檢測模型+全局檢測模型。

????????只加載一個局部檢測模型:

#include <seeta/FaceAntiSpoofing.h>
seeta::FaceAntiSpoofing *new_fas() {seeta::ModelSetting setting;setting.append("fas_first.csta");return new seeta::FaceAntiSpoofing(setting);
}

????????或者局部檢測模型+全局檢測模型,啟用全局檢測能力:

#include <seeta/FaceAntiSpoofing.h>
seeta::FaceAntiSpoofing *new_fas_v2() {seeta::ModelSetting setting;setting.append("fas_first.csta");setting.append("fas_second.csta");return new seeta::FaceAntiSpoofing(setting);
}

????????調用有兩種模式,一個是單幀識別,另外就是視頻識別。 其接口聲明分別為:

seeta::FaceAntiSpoofing::Status seeta::FaceAntiSpoofing::Predict( const SeetaImageData &image, const SeetaRect &face, const SeetaPointF *points ) const;
seeta::FaceAntiSpoofing::Status seeta::FaceAntiSpoofing::PredictVideo( const SeetaImageData &image, const SeetaRect &face, const SeetaPointF *points ) const;

????????從接口上兩者的入參和出參的形式是一樣的。出參這里列一下它的聲明:

class FaceAntiSpoofing {
public:/*     * 活體識別狀態     */enum Status{REAL = 0,       ///< 真實人臉SPOOF = 1,      ///< 攻擊人臉(假人臉)FUZZY = 2,      ///< 無法判斷(人臉成像質量不好)DETECTING = 3,  ///< 正在檢測};
}

????????單幀識別返回值會是REAL、SPOOF或FUZZY。 視頻識別返回值會是REAL、SPOOF、FUZZY或DETECTING。

????????兩種工作模式的區別在于前者屬于一幀就是可以返回識別結果,而后者要輸入多個視頻幀然后返回識別結果。在視頻識別輸入幀數不滿足需求的時候,返回狀態就是DETECTING。

????????這里給出單幀識別調用的示例:

void predict(seeta::FaceAntiSpoofing *fas, const SeetaImageData &image, const SeetaRect &face, const SeetaPointF *points) {auto status = fas->Predict(image, face, points);switch(status) {case seeta::FaceAntiSpoofing::REAL:std::cout << "真實人臉" << std::endl; break;case seeta::FaceAntiSpoofing::SPOOF:std::cout << "攻擊人臉" << std::endl; break;case seeta::FaceAntiSpoofing::FUZZY:std::cout << "無法判斷" << std::endl; break;case seeta::FaceAntiSpoofing::DETECTING:std::cout << "正在檢測" << std::endl; break;}
}

????????這里需要注意face和points必須對應,也就是points必須是face表示的人臉進行關鍵點定位的結果。points是5個關鍵點。當然image也是需要識別的原圖。

????????如果是視頻識別模式的話,只需要將predict中的fas->Predict(image, face, points)修改為fas->PredictVideo(image, face, points)。

????????在視頻識別模式中,如果該識別結果已經完成,需要開始新的視頻的話,需要調用ResetVideo重置識別狀態,然后重新輸入視頻:

void reset_video(seeta::FaceAntiSpoofing *fas) {fas->ResetVideo();
}

????????當了解基本調用接口之后,就可以直接看出來,識別接口直接輸入的就是單個人臉位置和關鍵點。因此,當視頻或者圖片中存在多張人臉的時候,需要業務決定具體識別哪一個人臉。一般有這幾種選擇,1. 只做單人識別,當出現兩個人的時候識別中止。2. 識別最大的人臉。3. 識別在指定區域中出現的人臉。這幾種選擇對精度本身影響不大,主要是業務選型和使用體驗的區別。

2.2 參數設置

????????設置視頻幀數:

void SetVideoFrameCount( int32_t number );

????????默認為10,當在PredictVideo模式下,輸出幀數超過這個number之后,就可以輸出識別結果。這個數量相當于多幀識別結果融合的融合的幀數。當輸入的幀數超過設定幀數的時候,會采用滑動窗口的方式,返回融合的最近輸入的幀融合的識別結果。一般來說,在10以內,幀數越多,結果越穩定,相對性能越好,但是得到結果的延時越高。

? ? ? ? 設置識別閾值:

void SetThreshold( float clarity, float reality );

????????默認為(0.3, 0.8)。活體識別時,如果清晰度(clarity)低的話,就會直接返回FUZZY。清晰度滿足閾值,則判斷真實度(reality),超過閾值則認為是真人,低于閾值是攻擊。在視頻識別模式下,會計算視頻幀數內的平均值再跟幀數比較。兩個閾值都符合,越高的話,越是嚴格。

????????設置全局檢測閾值:

void SetBoxThresh(float box_thresh);

????????默認為0.8,這個是攻擊介質存在的分數閾值,該閾值越高,表示對攻擊介質的要求越嚴格,一般的疑似就不會認為是攻擊介質。這個一般不進行調整。

????????以上參數設置都存在對應的Getter方法,將方法名稱中的Set改為Get就可以訪問對應的參數獲取了。

2.3 參數調試

????????在應用過程中往往不可避免對閾值產生疑問,如果要調試對應的識別的閾值,這里我們給出了每一幀分數的獲取函數。

????????下面給出識別之后獲取識別具體分數的方法:

void predict_log(seeta::FaceAntiSpoofing *fas, const SeetaImageData &image, const SeetaRect &face, const SeetaPointF *points) {auto status = fas->Predict(image, face, points);float clarity, reality;fas->GetPreFrameScore(&clarity, &reality);std::cout << "clarity = " << clarity << ", reality = " << reality << std::endl;
}

????????在Predict或者PredictVideo之后,調用GetPreFrameScore方法可以獲取剛剛輸入幀的識別分數。

3. 演示Demo

3.1 開發環境

  • Windows 10 Pro x64
  • Visual Studio 2015
  • Seetaface6

3.2 功能介紹

????????演示程序主界面如下圖所示,包括參數顯示、實時活體檢測、取消等功能。

3.3 效果測試

????????二維假體攻擊,包括二維靜態紙張圖像攻擊、二維靜態電子圖像攻擊、二維動態圖像攻擊,檢測效果還是不錯。

????????三維假體攻擊,除了塑料材質檢測效果還可以,其他材質基本無法正確檢測。

3.4 下載地址

????????開發環境:

  • Windows 10 pro x64
  • Visual Studio 2015
  • Seetaface6

? ? ? ? VS工程下載:SeetaFace6人臉活體檢測C++代碼實現Demo

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/web/11077.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11077.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11077.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【補充】圖神經網絡前傳——DeepWalk

論文閱讀 論文&#xff1a;https://arxiv.org/pdf/1403.6652 參考&#xff1a;【論文逐句精讀】DeepWalk&#xff0c;隨機游走實現圖向量嵌入&#xff0c;自然語言處理與圖的首次融合_隨機游走圖嵌入-CSDN博客 abstract DeepWalk是干什么的&#xff1a;在一個網絡中學習頂點…

【Mac】Ghost Buster Pro(蘋果電腦內存清理專家) v3.2.5安裝教程

軟件介紹 Ghost Buster pro是一款針對Mac系統的電腦清理和優化工具&#xff0c;可以幫助用戶清理系統垃圾、修復注冊表錯誤、卸載不需要的軟件、管理啟動項等&#xff0c;從而提高系統性能和穩定性。 安裝教程 1.打開鏡像包&#xff0c;拖動「Ghost Buster Pro」到應用程序中…

GIT SSL certificate problem

簡單來說&#xff0c;SSL 協議可以為你的 Web 瀏覽器或其他進程提供一種安全的通道&#xff0c;使服務器和客戶端之間的數據傳輸過程不被第三方竊取或篡改。這非常重要&#xff0c;特別是在處理敏感數據&#xff0c;比如信用卡信息、用戶名和密碼等情況下。 現在&#xff0c;S…

Flutter 中的 Row 小部件:全面指南

Flutter 中的 Row 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;Row 是一個水平布局的小部件&#xff0c;用于將子控件沿著水平軸排列。Row 類似于 HTML 中的 div 標簽&#xff0c;但僅限于水平布局。它非常適合用來創建行式布局&#xff0c;如表單輸入、按鈕組、標簽…

【linux軟件基礎知識】完全公平調度

完全公平調度&#xff08;CFS&#xff09; CFS根據每個進程相對于所有可運行線程總權重的權重為每個進程分配一個“時間片”。 CFS 的目標是近似“無限小”的調度持續時間&#xff0c;稱為目標延遲。 較小的目標延遲可以提高交互性并接近完美的多任務處理&#xff0c;但其代價…

【Linux網絡】Https【下】{CA認證/證書的簽發與認證/安全性/總結}

文章目錄 1.引入證書【為方案五鋪墊】1.1再談https1.2SSL/TLS1.3CA機構1.4理解數字簽名1.4繼續鋪墊1.5方案五服務端申請證書回顧一二三回顧方案四方案五過程尋找方案五的漏洞客?端對證書進?認證 2.查看證書2.1查看瀏覽器的受信任證書發布機構2.2中間?有沒有可能篡改該證書2.…

差分約束 C++ 算法例題

差分約束 差分約束 是一種特殊的 n 元一次不等式組&#xff0c;m 個約束條件&#xff0c;可以組成形如下的格式&#xff1a; { x 1 ? x 1 ′ ≤ y 1 x 2 ? x 2 ′ ≤ y 2 ? x m ? x m ′ ≤ y m \begin{cases} x_1-x_1^{} \le y_1 \\ x_2-x_2^{} \le y_2 \\ \cdots \\ x_…

數據庫的要求

本來我是不準備寫數據庫的。而且是準備從零開始&#xff0c;學習python&#xff0c;學完語言學&#xff0c;會c和寫作技法&#xff0c;再來學習數據庫 那樣做的復雜度是天量的&#xff0c;按部就班什么的具備&#xff0c;因為你完全不清楚什么時候就有這個基礎和條件&#xff0…

【53】Camunda8-Zeebe核心引擎-Partitions分區與Internal processing內部處理

Partitions分區 在Zeebe中,所有數據都是基于分區的。(一個)分區本質上是一個關于流程事件的持久化流。在broker集群中,分區分布在節點之間,因此可以將其視為分片。啟動/初始化Zeebe 集群時,用戶可以配置所需的分區數。如果使用過Kafka,這部分內容是比較相似的。 每當部…

SpringBoot集成jxls2實現復雜(多表格)excel導出

核心依賴 需求 導出多個表格&#xff0c;包含圖片&#xff0c;類似商品標簽 1.配置模板 創建一個xlsx的模板文件&#xff0c;配置如下 該模板進行遍歷了兩次&#xff0c;因為我想要導出的數據分為兩列展示&#xff0c;左右布局&#xff0c;一個循環實現不了&#xff0c;所以采…

【ARM64 常見匯編指令學習 20.1 -- ARM 偽指令 .include】

請閱讀【嵌入式開發學習必備專欄】 文章目錄 ARM 編譯指令 .include 使用介紹a.s 文件b.s 文件小結 ARM 編譯指令 .include 使用介紹 在UEFI&#xff08;統一可擴展固件接口&#xff09;開發中&#xff0c;通常會用到匯編語言文件&#xff08;.s 或 .S 文件&#xff09;。如果…

百面算法工程師 | 正則優化函數——BN、LN、Dropout

本文給大家帶來的百面算法工程師是正則優化函數&#xff0c;文章內總結了常見的提問問題&#xff0c;旨在為廣大學子模擬出更貼合實際的面試問答場景。在這篇文章中&#xff0c;我們將總結一些BN、LN、Dropout的相關知識&#xff0c;并提供參考的回答及其理論基礎&#xff0c;以…

Linux kbdconfig命令教程:鍵盤設置與配置(附案例詳解和注意事項)

Linux kbdconfig命令介紹 kbdconfig&#xff08;鍵盤配置&#xff09;是一個用于設置鍵盤類型的程序&#xff0c;提供圖形化的操作界面。kbdconfig實際上是修改/etc/sysconfig/keyboard的鍵盤配置文件。 Linux kbdconfig命令適用的Linux版本 kbdconfig命令主要在Red Hat Lin…

電商秒殺系統-案例04-redis下的session控制

前言&#xff1a; 在現代的Web應用中&#xff0c;安全和高效的用戶身份驗證機制是至關重要的。本文將深入探討基于令牌的用戶登錄會話機制&#xff0c;特別是在使用Redis進行會話管理的情景。通過這一案例實戰&#xff0c;我們將了解令牌如何在用戶身份驗證過程中發揮核心作用&…

Linux dircolors命令教程:如何設置ls命令的顏色方案(附案例詳解和注意事項)

Linux dircolors命令介紹 dircolors命令在Linux中用于設置ls命令顯示文件和目錄的顏色方案。它可以輸出設置LS_COLORS環境變量的命令。 Linux dircolors命令適用的Linux版本 dircolors命令在大多數Linux發行版中都可用&#xff0c;包括Debian、Ubuntu、Alpine、Arch Linux、…

C++ | Leetcode C++題解之第85題最大矩形

題目&#xff1a; 題解&#xff1a; class Solution { public:int maximalRectangle(vector<vector<char>>& matrix) {int m matrix.size();if (m 0) {return 0;}int n matrix[0].size();vector<vector<int>> left(m, vector<int>(n, 0)…

【HCIP學習】BGP對等體組、聚合、路由反射器、聯盟、團體屬性

一、大規模BGP網絡所遇到的問題 BGP對等體眾多&#xff0c;配置繁瑣&#xff0c;維護管理難度大 BGP路由表龐大&#xff0c;對設備性能提出挑戰 IBGP全連接&#xff0c;應用和管理BGP難度增加&#xff0c;鄰居數量過多 路由變化頻繁&#xff0c;導致路由更新頻繁 二、解決大…

使用QT-QSqlQuery::value()遇到的問題

在實現客戶端間好友添加功能時&#xff0c;我通過以下函數想實現數據庫對好友信息的保存 bool OpeDB::handleAddFriend_repound(const char *pername, const char *name) { // pername 被添加方 name 申請添加方 qDebug() << pername << " " &l…

Nginx(簡潔版)

基本配置 worker_processes 1; //默認為1&#xff0c;表示開啟一個業務進程 events //事件驅動模塊&#xff08;&#xff09;{worker_connections 1024; //單個業務進程可接受連接數 } http{include mime.types; // 引入http mime類型&#xff08;在外部已經定義好&#xff0c…

Java數組——冒泡排序

冒泡排序是最出名的排序算法之一&#xff0c;總共有八大排序。 冒泡排序代碼并不復雜&#xff0c;共兩層循環&#xff0c;外層冒泡輪數&#xff0c;里層依次比較。 算法步驟&#xff1a; 1. 比較數組中兩個相鄰元素&#xff0c;如果第一個元素比第二個元素大&#xff0c;交換…