人脸识别--活体检测(眨眼检测)

装逼专用图1.jpg

人脸识别在现在很多的项目中都有应用,最常见的就属此次315曝光的支付宝刷脸登录,当然支付宝也出来做了澄清,我们还是需要相信科技的.支付宝的刷脸可谓是相当成熟了.下面我们来简单的分析一下支付宝的刷脸登录流程.

** 1.前端采集人脸**

前端采集人脸的过程其实就是采集一张带有人脸的图像,然后我们对这个图像进行base64编码之后传给后台服务,后台服务去做人脸的识别,或者验证,如果这样的话,前端做起来其实是相对较复杂的,首先采集人脸的过程中,我们要做的是分析图片中有人脸然后将此图像保存,完成采集过程,当然这样是不安全的,因为我可以随便拿一个人的照片就可以骗过去前端采集的这一过程,所以如果仅仅如此做的话,还是比较简单的,在iOS中有苹果自带的识别人脸的API,当然现在用的最多的是opencv 但是这样做的话,那支付宝的产品和技术人员也就该卷铺盖回家了,所以我们需要在前端进行人脸采集的时候我们需要对识别到人脸进行活体检测,现在的活体检测技术有很多,有让摇头,有让张嘴,有人眨眼,当然也有让这些全部加起来的,(我的臆想..)就我自己的看法,出了眨眼都看起来有点奇怪,支付宝采用的就是眨眼来过滤掉静态图片的识别,但是我尝试过,如果把眨眼的视频拍下来来骗支付宝,是可以骗过去的哦,但是在后续的识别中却是通不过的,这点咱们在下个阶段再谈(你如果开通了支付宝的刷脸登录,可以录制一个自己的眨眼视频来骗下支付宝).支付宝的具体的采集人脸过程大概就是这样(个人理解,如果有人觉得不对的可以留言讨论哦)

** 2.后台服务验证识别**

其实后台的人脸识别验证不属于我们此篇文章要说的内容,在这儿我还是想大概的叙述一下,现在的后台人脸识别验证其实是有很好的第三方的,比较厉害的一个是"face++" 支付宝好像也有用face++ 的服务(face++ 的网站上有写),有兴趣的童鞋可以去网上搜一下,还有据我所知的讯飞,我有电联过讯飞的客服,他们有说他们的服务是基于face++的,识别率还是蛮高的,iOS,安卓都有封装好的对应的SDK,另外提一下face++人脸识别是基于接口的,当然如果自己公司想要开发自己的人脸识别服务也是可以的,但是就我知道的比较专业的好像就是opencv 了,不得不说opencv着实相当强大.

3.刷脸登录草图

我也大致写了下刷脸登录的流程草图,里面确实还有许多要优化的地方,也仅仅抛砖引玉了,希望可以帮助到需要的童鞋,(当初我做这块儿的时候,资料可谓少之又少,希望能够分享出来帮助一些正在迷茫的童鞋们)

Drawing4.png

4.划重点

重点是人脸识别中的活体检测
可以存在两种方式
1)客户端做人脸采集---本章重点
2)服务端做人脸采集---不会讲---类似于直播方式---服务端处理视频帧---有兴趣的童鞋可以尝试下,不知道体验好不好,没有那么强大的后台,所以只能做前端的眨眼检测了,但是即便服务器做,原理都是一样的吧.

5.检测思路

人脸采集的过程其实是客户端通过录像设备采集视频,然后我们拿到视频流,对视频流的每一帧做处理,进而来检测视频中是否有人脸和视频中的人脸是否---(再次感谢看远的github社区,感谢里面的人才,我可以把他们的思路借鉴下来)
(1)利用苹果自带的API(跟原生扫描二维码的类一样)来判断每一帧中是否有人脸,里面可以检测到两只眼是否存在以及两只眼是否睁开,然后记录上次睁开眼的时间,然后在下一次检测到闭眼的时候比较一下与上一次睁眼的时间差,如果在正常范围内则认为是一次正常的眨眼.---此方法,也还不错,但是误差较大,如果只是做一个眨盐拍照的娱乐应用还好,但是做活体检测就显得有点力不从心了.

(2)利用opencv首先对每一帧进行人脸检测,检测到后,算出眼镜的区域,截取眼镜区域再用opencv 对该图像中眼睛的数量进行检测,用一个数组来对每次的眼镜数量进行注册,当数组大小为3的时候,如果数组中第一次眼睛数量大于0,第二次等于0,最后一次大于0,则证明是一次眨眼,此方法可能很蠢,有专门做眨眼检测研究的可能会认为这种方法low到爆,可以利用阈值..大数据分析...反正那一堆堆高深的算法我是看不懂,前期也做过相对应的学习,但是实现起来太多复杂,领导给的时间不允许,所以就只有采用这种比较low的第二种方法了,不得不说这种方法效果还是蛮不错的,当然肯定比不上支付宝那种大牛写出来的算法,但是,至少可以信心满满的跟自己的领导交差了,可以半个小时之后,拿着demo去向领导邀功去了,然后坐上CEO,赢取白富美,从此走上人生巅峰的道路了,(没事,尽情的做梦吧)

6.代码就是王道

其实对于这块儿我已经封装成了一个服务CaptureFaceService
下面大概介绍一下这块儿的使用方法

  • 1.引入头文件--凑字数*
    #import "CaptureFaceService.h"
  • 2.创建对象 -- 凑字数 (懒加载)*
@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.深度剖析

说实话,我真的想做一下深度的剖析,活体检测听起来太过高大上,我裤子都脱了,竟然给我看这个.这个.好吧,简答的做个介绍吧!---其实真的写的很简单,为了满足你们,我就凑点字数吧

#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 视频预览区域
 @param captureFaceProgressBlock 过程回调
 @param captureFaceCompleteResultBlock 完成回调
 */
- (void)startAutoCaptureFaceWithPreView:(UIView *)preView andCaptureFaceProgressBlock:(captureFaceProgressBlock)captureFaceProgressBlock andCompleteBlock:(captureFaceCompleteResultBlock)captureFaceCompleteResultBlock;


/**
 停止采集
 */
- (void)stopCaptureFace;
@end

8.相信我了吧真的没有什么可以剖析的

什么,你想看我里面是怎么实现的?里面也总共200来行代码,贴出来浪费看官的流量,我就不再帖代码了,看到这里,你就可以拿出来我这个类来使用了,demo我会放到github上,有需要的童鞋可以去下载研究实现哦.

9.有一大波重点来袭 -- (重点)

demo下载下来是不可以直接使用的,对你没有听错,会报错,你根本跑不起来(你他么是不是在逗我,我需要下载下来直接能跑的程序,...)看官切勿烦躁,因为opencv 这个SDK太大,150多兆,,,git真的上传不上去啊,所以,按照以下步骤做,您所下载的程序就可以跑起来了

1.去opencv 官网,下载iOS的SDK,我demo中用的是2.4版本
<a>http://opencv.org/releases.html</a>
2.去度娘 (haarcascade_frontalface_alt2.xml) (haarcascade_eye.xml)这两个级联分类器并下载导入到自己的项目中
3.这下您就可以开心的跑起来体验了....

10.重点中的重点

源码直通车

装逼专用图2.jpeg

11.希望能帮助到需要的童鞋,如您喜欢,敬请留言

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 图像识别主要用到了两个第三方的框架:OpenCV和TesseractOCR,OpenCV用来做图像处理,定位到身份...
    方弟阅读 11,520评论 9 52
  • 1.人脸识别概述 人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图...
    Jinwong阅读 4,897评论 4 22
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,472评论 25 707
  • 在研究人脸识别的时候,收集了一下相关人脸检测和识别的相关API,有的是免费,有的是付费的,但是都希望给读者展示出来...
    浪迹当归阅读 1,855评论 1 23
  • 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提...
    沬日十七阅读 1,000评论 0 4