0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

科讯视点 2021-04-09 15:59 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

去年下半年开始,本人从B/S转战C/S开发,相继做了大大小小一些项目。最近的一个应用是运输车辆通行卡自助收发应用,并第一次用到了人脸识别功能。作为该领域的初学者,我摸索着把项目搞定了,也复盘了一些开发经验,总结出来给其他在项目上初次应用人脸识别的朋友参考。

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

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

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

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

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

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

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

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

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

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

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

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

#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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    龙杰正式发布新一代FIDO2身份验证器——PocketKey+ II

    近日,全球身份识别与支付技术领导者龙杰智能卡有限公司(ACS,香港联交所上市编号:2086)正式发布新一代FIDO2身份验证器—— **PocketKey+ II** 。作为PocketKey+系列
    的头像 发表于 05-18 10:31 1436次阅读

    Renesas携手Aizip开发采用RA8D1 MCU的人脸识别解决方案

    人脸识别已成为智能手机与个人电脑等高性能设备的标配功能。然而,要将这项技术集成到资源受限的边缘设备与物联网终端中,仍面临诸多挑战。例如,企业级打印机的用户身份验证、门禁控制面板、考勤打卡机以及销售终端等应用场景,都能通过
    的头像 发表于 04-11 16:40 5354次阅读
    Renesas携手Aizip<b class='flag-5'>开发</b>采用RA8D1 MCU的<b class='flag-5'>人脸</b><b class='flag-5'>识别</b>解决方案

    如何在 i.MX RT1050 上实现两个镜像(引导加载程序应用程序)的双 HAB 身份验证

    )。 目前,我的想法是实现一个自定义身份验证机制在第二阶段引导加载程序中。引导加载程序将: 读取应用程序映像页脚(包含公钥、SHA-256 哈希和签名)- 在映像上手动实现/添加。 在跳转到应用映像之前
    发表于 04-07 06:14

    人脸识别身份核验终端厂家怎么挑?记住这四个黄金法则

    在科技飞速发展的当下,人脸识别身份核验终端在众多领域得到广泛应用,从门禁安防到金融认证,从教育考勤到政务服务,其身影无处不在。对于有需求的企业或单位而言,找到一家靠谱的人脸
    的头像 发表于 01-07 10:41 444次阅读
    <b class='flag-5'>人脸</b><b class='flag-5'>识别</b><b class='flag-5'>身份</b>核验终端厂家怎么挑?记住这四个黄金法则

    基于AIK-RA8D1的人脸识别的应用演示

    随着科技的进步,人脸识别技术已逐渐成为一种主流的安全验证手段。它不依赖传统的密码,而是通过面部特征识别验证
    的头像 发表于 12-02 14:29 5757次阅读
    基于AIK-RA8D1的<b class='flag-5'>人脸</b><b class='flag-5'>识别</b>的应用演示

    人脸识别身份核验终端卡顿死机怎么办?看这篇就够了

    在智能安防和政务处理场景中,经常会使用到人脸识别身份核验终端或人证对比一体机等智能安防设备,但在设备运行可能会出现"开机即卡顿"或"运行中死机"问题,这类故障
    的头像 发表于 11-10 10:25 1056次阅读
    <b class='flag-5'>人脸</b><b class='flag-5'>识别</b><b class='flag-5'>身份</b>核验终端卡顿死机怎么办?看这篇就够了

    使用瑞萨RA8D1开发板实现人脸识别的应用演示

    随着科技的进步,人脸识别技术已逐渐成为一种主流的安全验证手段。它不依赖传统的密码,而是通过面部特征识别验证
    的头像 发表于 10-14 10:58 6138次阅读
    使用瑞萨RA8D1<b class='flag-5'>开发</b>板实现<b class='flag-5'>人脸</b><b class='flag-5'>识别</b>的应用演示

    企业班车智能车载终端:人脸识别、NFC与北斗定位的多重应用

    为什么企业班车智能车载终端需要用到这三大功能呢:一、人脸识别人脸识别技术在企业班车中的应用,主要体现在身份验证和考勤管理两个方面。首先,车载考勤打卡一体机通过
    的头像 发表于 09-23 10:42 1020次阅读
    企业班车智能车载终端:<b class='flag-5'>人脸</b><b class='flag-5'>识别</b>、NFC与北斗定位的多重应用

    身份识别核验硬件终端的功能模块有哪些?目前的发展趋势是什么?

    随着科技发展,身份识别核验终端或人证识别一体机正逐步成为现代社会安全验证的重要组成部分,为用户提供高效、准确的身份验证服务。在具体硬件设备中
    的头像 发表于 08-30 10:42 976次阅读
    <b class='flag-5'>身份</b><b class='flag-5'>识别</b>核验硬件终端的功能模块有哪些?目前的发展趋势是什么?

    人脸识别身份核验终端的应用场景和硬件要求有哪些?

    人脸识别身份核验终端作为一种先进的生物识别技术设备,正广泛应用于各个领域,为身份验证和安全管理提供了高效、便捷的解决方案。以下是
    的头像 发表于 08-27 11:22 1177次阅读
    <b class='flag-5'>人脸</b><b class='flag-5'>识别</b><b class='flag-5'>身份</b>核验终端的应用场景和硬件要求有哪些?

    手持式身份识别阅读器:移动的身份识别智能终端

    鸟鸟N70S手持式居民身份证阅读器是一种专为移动办公与身份核验而设计的终端设备,集身份识别、OCR、二维码扫描、人脸
    的头像 发表于 08-20 14:34 1931次阅读
    手持式<b class='flag-5'>身份</b>证<b class='flag-5'>识别</b>阅读器:移动的<b class='flag-5'>身份</b><b class='flag-5'>识别</b>智能终端

    【Milk-V Duo S 开发板免费体验】基于Duo S 使用 TDL SDK(V1版本)

    地将各种深度学习技术应用于自己的产品和服务中。无论开发者是否是深度学习领域的专家,有了TDL SDK作为助手,都能轻松构建智能应用。 目前 TDL SDK 包含 移动侦测,人脸检测,
    发表于 08-10 22:09

    RFID在身份识别中的应用

    二、RFID在身份识别中的优势高效率:RFID可以快速读取身份信息,大幅缩短验证时间,提高身份
    的头像 发表于 07-23 15:35 704次阅读
    RFID在<b class='flag-5'>身份</b><b class='flag-5'>识别</b>中的应用

    富士通创新生物识别身份验证技术介绍

    在数字化浪潮席卷全球的当下,身份认证技术的安全性与便捷性,已然成为全社会关注的焦点。传统的身份认证方案,诸如密码、指纹识别人脸识别等,尽管
    的头像 发表于 07-03 09:31 1258次阅读

    基于LockAI视觉识别模块:C++人脸识别

    基本知识讲解 1.1 人脸识别简介 人脸识别是一种利用人的脸部特征进行身份识别的生物
    发表于 07-01 12:01