
人臉識別在現(xiàn)在很多的項目中都有應用,最常見的就屬此次315曝光的支付寶刷臉登錄,當然支付寶也出來做了澄清,我們還是需要相信科技的.支付寶的刷臉可謂是相當成熟了.下面我們來簡單的分析一下支付寶的刷臉登錄流程.
** 1.前端采集人臉**
前端采集人臉的過程其實就是采集一張帶有人臉的圖像,然后我們對這個圖像進行base64編碼之后傳給后臺服務(wù),后臺服務(wù)去做人臉的識別,或者驗證,如果這樣的話,前端做起來其實是相對較復雜的,首先采集人臉的過程中,我們要做的是分析圖片中有人臉然后將此圖像保存,完成采集過程,當然這樣是不安全的,因為我可以隨便拿一個人的照片就可以騙過去前端采集的這一過程,所以如果僅僅如此做的話,還是比較簡單的,在iOS中有蘋果自帶的識別人臉的API,當然現(xiàn)在用的最多的是opencv 但是這樣做的話,那支付寶的產(chǎn)品和技術(shù)人員也就該卷鋪蓋回家了,所以我們需要在前端進行人臉采集的時候我們需要對識別到人臉進行活體檢測,現(xiàn)在的活體檢測技術(shù)有很多,有讓搖頭,有讓張嘴,有人眨眼,當然也有讓這些全部加起來的,(我的臆想..)就我自己的看法,出了眨眼都看起來有點奇怪,支付寶采用的就是眨眼來過濾掉靜態(tài)圖片的識別,但是我嘗試過,如果把眨眼的視頻拍下來來騙支付寶,是可以騙過去的哦,但是在后續(xù)的識別中卻是通不過的,這點咱們在下個階段再談(你如果開通了支付寶的刷臉登錄,可以錄制一個自己的眨眼視頻來騙下支付寶).支付寶的具體的采集人臉過程大概就是這樣(個人理解,如果有人覺得不對的可以留言討論哦)
** 2.后臺服務(wù)驗證識別**
其實后臺的人臉識別驗證不屬于我們此篇文章要說的內(nèi)容,在這兒我還是想大概的敘述一下,現(xiàn)在的后臺人臉識別驗證其實是有很好的第三方的,比較厲害的一個是"face++" 支付寶好像也有用face++ 的服務(wù)(face++ 的網(wǎng)站上有寫),有興趣的童鞋可以去網(wǎng)上搜一下,還有據(jù)我所知的訊飛,我有電聯(lián)過訊飛的客服,他們有說他們的服務(wù)是基于face++的,識別率還是蠻高的,iOS,安卓都有封裝好的對應的SDK,另外提一下face++人臉識別是基于接口的,當然如果自己公司想要開發(fā)自己的人臉識別服務(wù)也是可以的,但是就我知道的比較專業(yè)的好像就是opencv 了,不得不說opencv著實相當強大.
3.刷臉登錄草圖
我也大致寫了下刷臉登錄的流程草圖,里面確實還有許多要優(yōu)化的地方,也僅僅拋磚引玉了,希望可以幫助到需要的童鞋,(當初我做這塊兒的時候,資料可謂少之又少,希望能夠分享出來幫助一些正在迷茫的童鞋們)

4.劃重點
重點是人臉識別中的活體檢測
可以存在兩種方式
1)客戶端做人臉采集---本章重點
2)服務(wù)端做人臉采集---不會講---類似于直播方式---服務(wù)端處理視頻幀---有興趣的童鞋可以嘗試下,不知道體驗好不好,沒有那么強大的后臺,所以只能做前端的眨眼檢測了,但是即便服務(wù)器做,原理都是一樣的吧.
5.檢測思路
人臉采集的過程其實是客戶端通過錄像設(shè)備采集視頻,然后我們拿到視頻流,對視頻流的每一幀做處理,進而來檢測視頻中是否有人臉和視頻中的人臉是否---(再次感謝看遠的github社區(qū),感謝里面的人才,我可以把他們的思路借鑒下來)
(1)利用蘋果自帶的API(跟原生掃描二維碼的類一樣)來判斷每一幀中是否有人臉,里面可以檢測到兩只眼是否存在以及兩只眼是否睜開,然后記錄上次睜開眼的時間,然后在下一次檢測到閉眼的時候比較一下與上一次睜眼的時間差,如果在正常范圍內(nèi)則認為是一次正常的眨眼.---此方法,也還不錯,但是誤差較大,如果只是做一個眨鹽拍照的娛樂應用還好,但是做活體檢測就顯得有點力不從心了.
(2)利用opencv首先對每一幀進行人臉檢測,檢測到后,算出眼鏡的區(qū)域,截取眼鏡區(qū)域再用opencv 對該圖像中眼睛的數(shù)量進行檢測,用一個數(shù)組來對每次的眼鏡數(shù)量進行注冊,當數(shù)組大小為3的時候,如果數(shù)組中第一次眼睛數(shù)量大于0,第二次等于0,最后一次大于0,則證明是一次眨眼,此方法可能很蠢,有專門做眨眼檢測研究的可能會認為這種方法low到爆,可以利用閾值..大數(shù)據(jù)分析...反正那一堆堆高深的算法我是看不懂,前期也做過相對應的學習,但是實現(xiàn)起來太多復雜,領(lǐng)導給的時間不允許,所以就只有采用這種比較low的第二種方法了,不得不說這種方法效果還是蠻不錯的,當然肯定比不上支付寶那種大牛寫出來的算法,但是,至少可以信心滿滿的跟自己的領(lǐng)導交差了,可以半個小時之后,拿著demo去向領(lǐng)導邀功去了,然后坐上CEO,贏取白富美,從此走上人生巔峰的道路了,(沒事,盡情的做夢吧)
6.代碼就是王道
其實對于這塊兒我已經(jīng)封裝成了一個服務(wù)CaptureFaceService
下面大概介紹一下這塊兒的使用方法
- 1.引入頭文件--湊字數(shù)*
#import "CaptureFaceService.h" - 2.創(chuàng)建對象 -- 湊字數(shù) (懶加載)*
@property(nonatomic,strong)CaptureFaceService * captureFaceService;
- (CaptureFaceService *)captureFaceService{
if (!_captureFaceService) {
_captureFaceService = [CaptureFaceService new];
}
return _captureFaceService;
}
- 3.開始采集
- (void)startCaptureFace{
__weak typeof(self)weakSelf = self;
[self.captureFaceService startAutoCaptureFaceWithPreView:self.vidioView andCaptureFaceProgressBlock:^(float faceProgress, float eyeProgress, captureFaceStatus captureFaceStatus) {
[weakSelf changeTipTextWithCaptureFaceStatus:captureFaceStatus];
} andCompleteBlock:^(UIImage *resultImage, NSError *error) {
if (error) {
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"檢測人臉失敗,請重試" message: nil preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"重試" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
[weakSelf startCaptureFace];
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) {
}]];
[weakSelf presentViewController:alertController animated:YES completion:nil];
return ;
}
//處理采集到的圖片
[self handleResultImage:resultImage];
}];
}
- 4.當然也可以中斷采集
[self.captureFaceService stopCaptureFace];
7.深度剖析
說實話,我真的想做一下深度的剖析,活體檢測聽起來太過高大上,我褲子都脫了,竟然給我看這個.這個.好吧,簡答的做個介紹吧!---其實真的寫的很簡單,為了滿足你們,我就湊點字數(shù)吧
#import <Foundation/Foundation.h>
#import <opencv2/highgui/cap_ios.h>
typedef enum
{
captureFaceStatus_NoFace, //未檢測到臉
captureFaceStatus_MoreFace, //有多張臉
captureFaceStatus_NoBlink, //未眨眼
captureFaceStatus_IllegalData, //檢測非法
captureFaceStatus_OK, //檢測完成
captureFaceStatus_NoCamare //檢測完成
}captureFaceStatus;
typedef void (^captureFaceProgressBlock ) (float faceProgress,float eyeProgress,captureFaceStatus captureFaceStatus);
typedef void (^captureFaceCompleteResultBlock) (UIImage *resultImage,NSError * error);
@interface CaptureFaceService : NSObject <CvVideoCameraDelegate>
/**
開啟智能掃描人臉(包含活體檢測--眨眼)
@param preView 視頻預覽區(qū)域
@param captureFaceProgressBlock 過程回調(diào)
@param captureFaceCompleteResultBlock 完成回調(diào)
*/
- (void)startAutoCaptureFaceWithPreView:(UIView *)preView andCaptureFaceProgressBlock:(captureFaceProgressBlock)captureFaceProgressBlock andCompleteBlock:(captureFaceCompleteResultBlock)captureFaceCompleteResultBlock;
/**
停止采集
*/
- (void)stopCaptureFace;
@end
8.相信我了吧真的沒有什么可以剖析的
什么,你想看我里面是怎么實現(xiàn)的?里面也總共200來行代碼,貼出來浪費看官的流量,我就不再帖代碼了,看到這里,你就可以拿出來我這個類來使用了,demo我會放到github上,有需要的童鞋可以去下載研究實現(xiàn)哦.
9.有一大波重點來襲 -- (重點)
demo下載下來是不可以直接使用的,對你沒有聽錯,會報錯,你根本跑不起來(你他么是不是在逗我,我需要下載下來直接能跑的程序,...)看官切勿煩躁,因為opencv 這個SDK太大,150多兆,,,git真的上傳不上去啊,所以,按照以下步驟做,您所下載的程序就可以跑起來了
1.去opencv 官網(wǎng),下載iOS的SDK,我demo中用的是2.4版本
<a>http://opencv.org/releases.html</a>
2.去度娘 (haarcascade_frontalface_alt2.xml) (haarcascade_eye.xml)這兩個級聯(lián)分類器并下載導入到自己的項目中
3.這下您就可以開心的跑起來體驗了....
10.重點中的重點

11.希望能幫助到需要的童鞋,如您喜歡,敬請留言