文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

.NET基于虹软人脸识别SDK 快速开发身份验证和自助发卡应用

2024-12-03 07:08

关注

  简单来说,这个项目与社保卡自助发卡机、信用卡自助发卡机的原理有些类似,内容就是:

  借助人脸识别和身份证读取,进行人证核验。身份核验通过后,发卡机会匹配后端数据,并将取卡人、取卡时间、卡片权限等信息写入卡片,随后吐出卡片,用户取卡可用于后续通行的操作。

  关于发卡机部分,只需要把一些操作步骤进行封装,通过串口发送命令就可以实现功能,身份证信息则通过读卡器进行读取。在开发的重点上,我把比较多的精力放在了初次尝试的人脸识别功能上,基本流程如下图:

  

 

  进一步简单描述一下项目背景和需求:

  第一,之所以引入人脸识别,主要是为了保证本人取卡,专人专卡,避免代取和冒用,确保信息可准确回溯。

  第2, 这个项目比较小,在人脸识别的功能上并没有额外预算,所以首选免费的人脸识别算法。

  第3, 项目地点的网络环境比较差,为避免因为网络故障导致无法取卡,优先选择可离线使用的人脸识别算法。

  第四,因为是自助取卡机,周围没人看顾,为避免冒领,人脸识别算法需要加入活体检测功能。

  综合以上几点,我甄选之后采用了虹软视觉开发平台的ArcFace SDK。这款算法可以同时满足免费使用、离线可用的需求,又自带IR/RGB双目活体检测,可以高效、高质量的抵御假脸攻击。另外,虹软开发平台最新出的ArcFace SDK 4.0版本,更新了针对佩戴口罩下的活体检测和人脸识别功能。

  另外,ArcFace SDK的使用也比较简单。在官网注册开发者之后,新建应用,就能得到全新的APP_ID和SDK_KEY,之后下载开发包配置到程序中。

  

 

  人脸识别界面如下,左侧是拍摄画面,右边是身份证照片以及识别反馈。

  

[[392552]]

 

  开发时用到了三个引擎,第一个是图片模式下的人脸检测引擎:

  #region图片引擎pImageEngine初始化//初始化引擎uintdetectMode=DetectionMode.ASF_DETECT_MODE_IMAGE;//检测脸部的角度优先值intdetectFaceOrientPriority=ASF_OrientPriority.ASF_OP_0_HIGHER_EXT;//人脸在图片中所占比例,如果需要调整检测人脸尺寸请修改此值,有效数值为2-32intdetectFaceScaleVal=16;//最大需要检测的人脸个数intdetectFaceMaxNum=5;//引擎初始化时需要初始化的检测功能组合intcombinedMask=FaceEngineMask.ASF_FACE_DETECT|FaceEngineMask.ASF_FACERECOGNITION|FaceEngineMask.ASF_AGE|FaceEngineMask.ASF_GENDER|FaceEngineMask.ASF_FACE3DANGLE;//初始化引擎,正常值为0,其他返回值请参考http://ai.arcsoft.com.cn/bbs/forum.php?mod=viewthread&tid=19&_dsign=dbad527eretCode=ASFFunctions.ASFInitEngine(detectMode,detectFaceOrientPriority,detectFaceScaleVal,detectFaceMaxNum,combinedMask,refpImageEngine);if(retCode==0){lbl_msg.Text=("图片引擎初始化成功!\n");}else{lbl_msg.Text=(string.Format("图片引擎初始化失败!错误码为:{0}\n",retCode));}#endregion

  第二个是视频模式下的人脸检测引擎:

  #region 视频专用FR引擎

  detectFaceMaxNum = 1;

  combinedMask = FaceEngineMask.ASF_FACERECOGNITION | FaceEngineMask.ASF_FACE3DANGLE | FaceEngineMask.ASF_LIVENESS;

  retCode = ASFFunctions.ASFInitEngine(detectMode, detectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum, combinedMask, ref pVideoImageEngine);

  Console.WriteLine("InitVideoEngine Result:" + retCode);

  if (retCode == 0)

  {

  lbl_msg.Text = ("视频专用FR引擎初始化成功!\n");

  }

  else

  {

  lbl_msg.Text = (string.Format("视频专用FR引擎初始化失败!错误码为:{0}\n", retCode));

  }

  // 摄像头初始化

  filterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);

  lbl_msg.Text = (string.Format("摄像头初始化完成...\n"));

  #endregion

  第三个是视频专用FR引擎,进行活体检测:

  #region 视频专用FR引擎

  detectFaceMaxNum = 1;

  combinedMask = FaceEngineMask.ASF_FACERECOGNITION | FaceEngineMask.ASF_FACE3DANGLE | FaceEngineMask.ASF_LIVENESS;

  retCode = ASFFunctions.ASFInitEngine(detectMode, detectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum, combinedMask, ref pVideoImageEngine);

  Console.WriteLine("InitVideoEngine Result:" + retCode);

  if (retCode == 0)

  {

  lbl_msg.Text = ("视频专用FR引擎初始化成功!\n");

  }

  else

  {

  lbl_msg.Text = (string.Format("视频专用FR引擎初始化失败!错误码为:{0}\n", retCode));

  }

  // 摄像头初始化

  filterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);

  lbl_msg.Text = (string.Format("摄像头初始化完成...\n"));

  #endregion

  视频处理使用的是AForge.Video 视频处理类库,然后在电脑上接上USB摄像头,通过此类库就可以调用摄像头的开关了,至于具体的人脸识别要放在视频流渲染事件上了。

  首先将身份证放在身份证阅读器上,获取到身份信息,并把身份信息中的人脸照片拿出来作为人脸注册照。利用ArcFcae SDK的相关接口,可以从注册照中提取人脸识别特征值。

  

 

  随后,我们要从摄像头的视频流中获取一帧图片,作为识别照也进行人脸识别特征值提取。值得注意的是,ArcFcae本身支持多人脸识别,但由于人证核验为1:1人脸识别,因此为了排除多余人脸的干扰,我们可以选取检测到的最大人脸,进行特征值提取。

  在获得注册照和识别照的特征值之后,就可以交给算法来做比对,得出一个相似度。注意,人脸识别算法是不会直接告诉你两张照片是不是同一个人的,只会给出一个可能性。最终输出的结果需要人为设置一个阈值,譬如相似度超过90%,我们就可以认定是同一个人。当然阈值也不是越高越好,具体设置需要根据项目的实际情况来做权衡。

  到这一步功能就算基本跑通了,但活体检测功能还没有加入。缺乏活体检测的话,使用身份证照片、纸质打印照片甚至手机屏幕上的照片都能通过人脸识别。

  所以说,在自助设备这类无人值守场景下,活体检测基本上不可或缺。虹软ArcFace自带的活体检测有单目RGB活体检测和IR双目红外活体检测两种。我因为只用了普通的RGB摄像头,所以采用单目RGB活体检测,这种算法主要分析采集摩尔纹、成像畸形、反射率等人像破绽,从而获得活体检测所需要的识别信息,对屏幕成像和纸张照片类攻击有着良好防御性。

  多说一句,IR双目红外活体中会加入了红外摄像头,防攻击效果是更好的,不过这个项目暂时没有这么高的需求。

  int retCode_Liveness = -1;

  //RGB活体检测

  ASF_LivenessInfo liveInfo = FaceUtil.LivenessInfo_RGB(pVideoImageEngine, imageInfo, multiFaceInfo, out retCode_Liveness);

  //判断检测结果

  if (retCode_Liveness == 0 && liveInfo.num > 0)

  {

  int isLive = MemoryUtil.PtrToStructure(liveInfo.isLive);

  isLiveness = (isLive == 1) ? true : false;

  }

  if (isLiveness)//活体检测成功

  在加入活体检测之后,整个人脸识别的流程基本就完整了。我发现在进行完所有流程后,还需要进行引擎的释放,否则每次初始化一个引擎大概会需要50M左右的内存,多次操作之后就会出现因为内存泄漏而导致闪退的现象。

  

 

  这个做法能达到目的,但是比较僵硬,在咨询虹软开放平台的技术专家后,我发现应该根据实际业务需求,在程序启动时,有选择的初始化对应的算法属性,避免在运行中多次做初始化和反初始化的操作,否则会导致资源波动过大以及产生内存碎片。引擎在程序结束或当前界面关闭时释放即可。

  总体而言比较顺利,虽然是第一次集成人脸识别,这可能和ArcFace容易上手也有关系。希望这篇内容能对大家有帮助。

  GitHub已开源:https://github.com/yumaster/ReceiveCardAIO

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯