生活随笔
收集整理的這篇文章主要介紹了
基于深度学习的人脸检测与静默活体检测——C++实现
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
1.系統(tǒng)環(huán)境是win10,顯卡RTX3080;cuda10.2,cudnn7.1;OpenCV4.5,ncnn版本是20210525;C++ IDE vs2019。 2.使用NCNN作模型推理加速庫(kù),能更容易的使用GPU進(jìn)行加速,代碼不需要改動(dòng)很大就可以移植到邊緣設(shè)備或者移動(dòng)端上。
一、人臉檢測(cè)
1.人臉檢測(cè)用的yolov5-face,yolov5-face是一種實(shí)時(shí)、高精度的人臉檢測(cè),搭配N(xiāo)CNN在安卓上(Mate 30 pro)cpu 能跑出18 FPS左右,GPU能跑出25 FPS。算法源碼地址:https://github.com/deepcam-cn/yolov5-face 。論文地址:https://arxiv.org/abs/2105.12931 。 2.人臉檢測(cè)效果:
二、活體檢測(cè)
1、人臉活體檢測(cè)是用來(lái)檢測(cè)當(dāng)前攝像頭所檢測(cè)到的人臉是否是偽造的,是人臉驗(yàn)證和人臉識(shí)別的前提條件,如果不能檢測(cè)出來(lái)是否是活體,那么就會(huì)出現(xiàn)比如常見(jiàn)用照片,人臉面具,3D人像等其他媒介來(lái)騙過(guò)人臉識(shí)別系統(tǒng)。 2、目前主流的活體解決方案分為配合式活體檢測(cè)和非配合式活體檢測(cè)(靜默活體檢測(cè))。配合式活體檢測(cè)需要用戶根據(jù)提示完成指定的動(dòng)作(比如眨眼,頭往哪邊轉(zhuǎn)一下),然后再進(jìn)行活體校驗(yàn),靜默活體則在用戶無(wú)感的情況下直接進(jìn)行活體校驗(yàn)。 3、這里演示的是靜默活體檢測(cè),算法地址:https://github.com/minivision-ai/Silent-Face-Anti-Spoofing 。
三、代碼
1.代碼流程,輸入攝像頭或者視頻,先檢測(cè)當(dāng)前畫(huà)面是否存在人臉,如果在用到項(xiàng)目上,也可以做當(dāng)前存在是否是唯一人臉的檢測(cè),存在人臉則對(duì)人臉做活體檢測(cè),檢測(cè)當(dāng)前輸入的人臉是否是活體人臉。 2.代碼:
#include <opencv2/opencv.hpp>
#include "TLive.h"
#include "yoloface.h"
#include <opencv2/video/video.hpp> cv
:: Rect
targetResize ( const cv
:: Mat
& cv_src
, cv
:: Mat
& cv_dst
, int target_w
, int target__h
) ; int main ( void )
{ int target_w
= 640 , target_h
= 480 ; YoloFace yolo_face
; TLive live
; live
. LoadModel ( "models/live/" ) ; yolo_face
. loadModel ( "models/face/face_lite" ) ; cv
:: VideoCapture cap
; cap
. open ( "face.mp4" ) ; if ( ! cap
. isOpened ( ) ) { return 0 ; } cv
:: Mat cv_src
; while ( 1 ) { cap
>> cv_src
; if ( cv_src
. empty ( ) ) { break ; } std
:: vector
< Object
> objects
; cv
:: Mat cv_target
; cv
:: Rect rect
= targetResize ( cv_src
, cv_target
, target_w
, target_h
) ; yolo_face
. detection ( cv_target
, objects
) ; for ( int i
= 0 ; i
< objects
. size ( ) ; ++ i
) { float x1
= objects
[ i
] . rect
. x
; float y1
= objects
[ i
] . rect
. y
; float x2
= objects
[ i
] . rect
. width
+ x1
; float y2
= objects
[ i
] . rect
. height
+ y1
; struct LiveFaceBox LiveBox
= { x1
, y1
, x2
, y2
} ; float prod
= live
. Detect ( cv_target
, LiveBox
) ; objects
[ i
] . live
= prod
; } yolo_face
. drawFace ( cv_target
, objects
) ; cv
:: Mat
cv_dst ( cv_target ( rect
) ) ; cv
:: namedWindow ( "face" , 0 ) ; cv
:: imshow ( "face" , cv_dst
) ; cv
:: waitKey ( 20 ) ; } cap
. release ( ) ; return 0 ;
}
cv
:: Rect
targetResize ( const cv
:: Mat
& cv_src
, cv
:: Mat
& cv_dst
, int target_w
, int target_h
)
{ float s
; if ( cv_src
. cols
> cv_src
. rows
) { s
= float ( target_w
) / cv_src
. cols
; } else { s
= float ( target_h
) / cv_src
. rows
; } float w
= cv_src
. cols
* s
; float h
= cv_src
. rows
* s
; int w_p
= ( target_w
- w
) / 2 ; int h_p
= ( target_h
- h
) / 2 ; cv
:: Mat cv_size
; cv
:: resize ( cv_src
, cv_size
, cv
:: Size ( w
, h
) ) ; cv
:: copyMakeBorder ( cv_size
, cv_dst
, h_p
, h_p
, w_p
, w_p
, cv
:: BORDER_CONSTANT
, 114.f ) ; return cv
:: Rect ( w_p
, h_p
, cv_size
. cols
, cv_size
. rows
) ;
}
3.測(cè)試結(jié)果 先輸入一個(gè)全是照片的視頻: 再測(cè)試一個(gè)正常的活動(dòng)的人臉: 4.源碼地址:https://download.csdn.net/download/matt45m/84996790
《新程序員》:云原生和全面數(shù)字化實(shí)踐 50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔 為你收集整理的基于深度学习的人脸检测与静默活体检测——C++实现 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。