活体辨认

最近项目需求做一个活体辨认的功用,要求如下: 1.离线辨认,本地辨认活体。 2.免费,网上收费的项目不选用。 3.引入的新库满足小。 4.代码有必要开源。

资源搜索

带着这么一堆的要求,开始一通搜索。

一、专业公司相关SDK

1.讯飞

在github上搜到的比较高的start的一个项目便是依靠讯飞sdk的。便是FaceRecognition这个库,可是这个库依靠的是一个旧版别的讯飞库,新版的讯飞库现已去掉了相关离线辨认的代码。一起该库,辨认率较低,一起对设备功用要求极高。

NOTE 关于这个库再弥补两点, 1.这个库尝试了许多办法无法下载下来,所以选用了最土的办法,把文件一个个保存下来,一起在网上找到了一个将他的库二次打包静态库的骗子FBYFaceRecognitionDemo_iOS,这里能够将讯飞SDK下来下来,两个库组合到一起,就能跑起来了。 2.之后又找到了一个依据这个库进行二次开发的库FaceRecognition,这个库里面有原库的源码。

新版的讯飞库,讯飞SDKSDK在集成开发测验阶段服务量限制为最高500次/每日,完成提额请求或商务协作后能够解除,也便是说,这玩意也是收费的,旧版别收不收费现已无迹可寻。

在讯飞的开放平台上又找到了一个其他的sdk,静默活体检测,可是它是将一段实地拍摄的人脸视频进行云端检测,判别是否为真人活体并给出分值参阅,这个跟咱们的要求又是背离的。

所以结果便是讯飞SDK只能抛弃。

参阅

iOS活体人脸辨认的Demo和一些思路 人脸辨认 — 活体检测(张嘴摇头辨认)

2.虹软

github上没有找到运用该库的开源库,官网注册了今后,能够在开发者中心中添加SDK,可是它的活体检测只有安卓版别,没有iOS版别,而且安卓的试了一下,只支撑辨认是不是活的,动作什么的并不能辨认。一起由于该库未开源,所以ArcFace v2.0这个SDK也未去验证是否契合。

3.百度

在百度AI开放平台上找到了一个SDK–iOS-有动作活体版,该SDK满足咱们的,离线,免费的要求,可是它需求请求企业认证,需求上传营业执照等请求一个appkey。

so,这个也抛弃了。其实这个SDK是现在找到的公司层面的最契合咱们要求的一个SDK,主张小公司直接选用该sdk即可,有大厂保护,应该不太会出什么问题。

二、体系原生–AVFoundation–CIDetector

在网上一搜会发现有许多是选用体系原生进行人脸辨认的。

下面这些库运用的都是该办法: FaceRecognition LMJFaceRecognition

CIDetector只能进行静态图片的检测,也便是给一张图片,检测一下嘴巴眼睛什么的。只能检测其时的状况,无法检测动作。

参阅

浅谈iOS中的人脸辨认及活体检测 [iOS]CIDetector之CIDetectorTypeFace人脸辨认 iOS图画处理(四)CIDetector特征辨认(人脸辨认)

三、网上开源项目 — dlib

官网开源地址

由于星星没有opencv高,所以这个库没有做过多的研讨,有兴趣的能够去研讨一下。

开源代码: face-landmarking-ios:该库是用swift所写。

四、网上开源项目 — opencv

网上这方面的开源库最流行的,做的最好的应该便是opencv了。

相关资源

opencv官网 资源下载 开源地址 iOS相关代码–cap_ios_video_camera.mm iOS相关代码–cap_ios_abstract_camera.mm

开源库: OpenFaceIOS EyeBlickCheck相关介绍 FaceDetectionDemo_iOS:其间用到的libOliveappCombineSDK2.a貌似是同盾科技的。

辨认SDK诞生

下面介绍的这个开源库便是我终究选用的辨认库,该库是依据opencvHyperLandmark加入了SDM算法。

其实HyperLandmark北京智云视图科技有限公司开源的,这也是现在找到的仅有一个公司进行开源的人脸辨认库。为它点赞。

我终究选用的便是HyperLandmark-iOS。简单说一下该库的有点: 1.供给了68点的标记。 2.支撑旋转矩阵的展现。

其实依据以上两点,现已满足咱们的需求了。

实现思路

咱们的需求大约便是,用户进来->翻开摄像头进行活体辨认->人脸摆正校准->拍照->开始人脸动作辨认->进行录像->人脸动作完成->录像完毕。

拍照的话就比较简单了,opencv本来供给的就有摄像头帧的回调,拿到相片就比较简单了。所以现在比较难的几个点便是:

  1. 相关动作的辨认。
  2. 录像。

难点解析

1.相关动作的辨认

现在所用的库只给出了68点的数据,并没有给出具体的动作辨认,所以只能依据这些点来判别用户所作的动作。 我所参阅的坐标点便是人脸姿态估计人脸辨认简介中所供给的图片,两张图其实是共同的。如下图所示:

活体辨认

张嘴闭嘴: 这个其实便是拿了3个点,分别是上嘴唇最下面一点62,下嘴唇最上面一点66,下嘴唇最下面一点57。然后依据6266的距离差与6657的距离差来判别是否张嘴。现在的规矩便是如果6662的差大于5766的差则即为张嘴,否则便是闭嘴。

摇头允许 其实这个最开的思路也是计划运用同一状况下点的差值来估算的,可是后来发现了该库做的有旋转矩阵相关数据,于是就计划运用该数据来实现摇头和允许的判别。 大约看了一下它的接口代码,是没有供给旋转矩阵的数据的,所以只能稍微改了下源代码。它制作旋转矩阵的办法是void ldmarkmodel::drawPose(cv::Mat& img, const cv::Mat& current_shape, float lineL),这个办法返回值是void,将其改成了cv::Vec3d对象,这样就能在外面拿到制作的数据。然后再依据制作的数据去区别是允许仍是摇头。

参阅

摄像头的旋转问题 OpenCV iOS – 视频处理

2.录像

其实opencv供给的有录像的相关功用,可是里面有些坑。

最开始的时分我运用的是旧版的opencv库,具体是哪个版别我没有去看过。在依据网上的操作去装备了相关特点之后,后来忽然发现,在开始录像之后,内存一向急速网上飚,大约十几秒的时间就飚到了1g的内存,app直接crash。其时就说完了,这还玩个毛线。

后来考虑了两个计划: 1.自己保护一套录制视频的代码,不运用opencv供给的视频录制功用。 2.更新一下opencv库。

第一个计划尝试了一下,发现很难实现,由于一半是opencv的逻辑一半又是自己的逻辑,两头很难将时机恰到好处的结合起来。所以此计划宣告失利。

第二个计划,更新了一下opencv,最新版是4.1的版别,二进制文件居然有300多兆,之前才70多兆,好在最终打包其实没变对少。更新了之后发现之前的内存问题解决了。可是由于新旧版别的兼容问题进行了代码的调整与适配。

里面有几个需求留意的点:

  1. opencv的录像功用供给的接口比较简单,不适合特别杂乱的录像功用。
  2. 录像过程中必定要保护好recordVideo这个变量,保护欠好极易导致溃散,看了一下OpenCV的源码,溃散的原因是在写入帧率数据的时分的判别不行安全。
  3. 想要经过压缩帧率来压缩视频的话要自己去重置相关对象。
  4. 前后台切换的时分必定要丢弃应录制的视频,而且重置摄像头数据,不然也极易导致溃散。
  5. 遇到问题的时分必定要去看下opencv的源码,上面有供给源码的地址。
参阅

VideoRecord WCLRecordVideo 视频的录制、保存、压缩以及base64转码