整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

C# 人脸识别库

C# 人脸识别库

文地址:https://www.cnblogs.com/view12138/p/13185907.html


NET 人脸识别库 ViewFaceCore

这是基于 SeetaFace6 人脸识别开发的 .NET 平台下的人脸识别库这是一个使用超简单的人脸识别库这是一个基于 .NET Standard 2.0 开发的库这个库已经发布到 NuGet ,你可以一键集成到你的项目此项目可以免费商业使用

?、开源

开源协议:Apache-2.0GitHub地址: ViewFaceCore十分感谢您的小星星

一、示例

示例项目地址:WinForm 摄像头人脸检测示例项目效果:

二、使用

一分钟在你的项目里集成人脸识别

1. 创建你的 .NET 应用

.NET Standard >=2.0.NET Core >=2.0.NET Framework >=4.6.1^2

2. 使用 Nuget 安装 ViewFaceCore

  • Author : View
  • Version >=0.1.1

此 Nuget 包会自动添加依赖的 C++ 库,以及最精简的识别模型。如果需要其它场景的识别模型,请下载 SeetaFace6 模型文件。

3. 在项目中编写你的代码

  • 按照 说明 自己编写
  • 或者参考以下代码

简单的调用示例

ViewFaceCore 使用示例

三、说明

命名空间:ViewFaceCore.Sharp : 人脸识别类所在的命名空间

  • 属性说明:

属性名称类型说明默认值ModelPathstring获取或设置模型路径 [ 如非必要,请勿修改 ]./model/FaceTypeFaceType获取或设置人脸类型FaceType.LightMarkTypeMarkType获取或设置人脸关键点类型MarkType.LightDetectorSettingDetectorSetting获取或设置人脸检测器设置new DetectorSetting()

  • 方法说明:

 1 using System.Drawing;
 2 using ViewFaceCore.Sharp;
 3 using ViewFaceCore.Sharp.Model;
 4 
 5 // 识别 bitmap 中的人脸,并返回人脸的信息。
 6 FaceInfo[] FaceDetector(Bitmap);
 7 
 8 // 识别 bitmap 中指定的人脸信息 info 的关键点坐标。
 9 FaceMarkPoint[] FaceMark(Bitmap, FaceInfo);
10 
11 // 提取人脸特征值。
12 float[] Extract(Bitmap, FaceMarkPoint[]);
13 
14 // 计算特征值相似度。
15 float Similarity(float[], float[]);
16 
17 // 判断相似度是否为同一个人。
18 bool IsSelf(float);

四、实现

此项目受到了 SeetaFaceEngine.NET 项目的启发

这个项目本质上来说还是调用了 SeetaFace 的 C++ 类库来实现的人脸识别功能。针对本人遇到过的相关的类库的使用都不太方便,而且使用的 SeetaFace 的版本较老,故萌生了自己重新开发的想法。

本项目在开发完成之后为了方便调用,采用了 Nuget 包的形式,将所有需要的依赖以及最小识别模型一起打包。在使用时非常简单,只需要 nuget 安装,编写代码,运行即可,不需要多余的操作。

首先查看 SeetaFace ,已经更新到了v3(v6即v3)(上面前辈的项目是基于v1开发的),最新版本暂时没有开源,但是可以免费商用。然后是根据以前的经验和 SeetaFace6 文档的指导,以及前辈的项目,做了以下操作。

1.对SeetaFace6 的接口进行了 C++ 形式的封装。

目前主要实现了 人脸检测,关键点提取,特征值提取,特征值对比几个人脸识别中的基础接口。有了这几个接口,可以完整的实现一套人脸识别和验证的流程。

  • c++封装的接口代码如下:

C++ 封装层

2.采用 C# 对上诉接口进行了导入。

因为C++的项目测CPU架构区分x86和x64,所以C# 层也需要区分架构封装

C# 导入层

3.采用 C# 的面向对象的封装

因为C#的项目默认都是 AnyCPU,所以为了简化调用,在这一层封装的时候增加了架构判断,当在你的项目中引用的时候,不用做任何修改。

且因为C++的C#导入方法在和原生的C#写法略有差异,且数据的转换和传递比较麻烦,所以类库中对外隐藏了 C# 导入层。并使用大家都更熟悉的C#的面向对象的方式进行进一步的封装和简化。

C# 面向对象层

五、也许…

  • 此项目还未实现 SeetaFace6 中的许多特性,也许:

    想起 GitHub 密码,持续更新…    删除代码仓库跑路…

  • 如果在使用过程中遇到问题,你也许可以:

    在 GitHub 报告Bug…    向我 发送邮件

源:中国侨网

中国侨网3月25日电 据中国驻斐济大使馆微信公众号消息,根据统一部署,中国驻斐济大使馆已于2021年8月31日启用“中国领事”APP受理护照、旅行证业务,相比传统申请方式更加便捷,受到同胞们欢迎。现结合近期出现的问题,对2021年12月12日布的《驻斐济使馆关于启用“中国领事”APP护照、旅行证在线办理功能的通知(更新)》进一步修订如下:

一、下载注册

“中国领事”APP可通过苹果应用商店、腾讯应用宝商店、小米应用商店、华为应用商店或扫描下图中的二维码下载。下载完成后打开APP,使用中国国内手机号或个人电子邮箱进行注册,根据提示完成实名认证后即可登陆使用。

二、业务办理流程

(一)信息填报:登陆APP后,选择“护照/旅行证”业务模块(适用于申请护照或旅行证颁发、换发或补发人员),根据提示要求逐步、完整、准确地填写个人基本信息,在线签字确认《国籍状况声明书》,按要求格式上传证件照片、现持护照资料页等材料。驻斐济使馆仅受理在斐济、瑙鲁、图瓦卢的中国公民通过“中国领事”APP提交的有关申请,不受理其他跨国申请。注意:申请换发护照人员,一般要求当前所持护照有效期不足1年,如申请提前换发,请将理由一并上传;申请补发护照人员请按照系统提示上传情况说明。另外,“国外联系电话”栏,请务必填写申请人在中国境外的有效联系电话。

其中,证件照将直接用于护照制作,请务必上传本人6个月内近照,拍照时穿戴整齐、头部及肩颈正直且居中、眼睛自然睁开、不露牙齿、不化浓妆,背景要求为白色或接近白色,无边框。如选择使用“中国领事”APP自带拍照功能,建议请他人协助拍摄,不要露出自拍手臂、不要出现高低肩、低头、眼睛看向下方、头部歪斜等情况。请勿翻拍本人纸质照片,此类照片清晰度不够,无法制证。有关电子护照人像照片规格详细要求请点击链接:ppt.mfa.gov.cn/appo/page/instruction.html。

此外,如申请人耳朵较小,系统可能提示“证件照检测不合格”,遇此情况,申请人可继续申请,后台审批时将进行人工确认。

(二)身份验证:为确保相关证件申请人系本人操作,APP将对申请人进行人脸识别。人脸识别失败不影响申请人提交申请,但请务必由申请人本人完成人脸识别。如后台审批时,认定人脸识别失败系非本人出镜所致,将发起视频面审,影响办理进度。

(三)提交订单:完成上述步骤并成功提交订单后,相关申请将提交使馆审核。申请人可在“我的订单”或“消息中心”跟踪办证进度,使馆工作人员将及时反馈审核进展,视情在APP中留言要求补充上传材料。

所有上传材料不合格、不完整的申请,都将被退回补充材料,请申请人按退回理由补充或替换有关材料,并再次提交申请。如不按要求进行修改,直接再次提交,申请将被退回,不予通过。

(四)视频面审:如申请人为16周岁以下未成年人,或人脸识别未通过,或需进一步核实有关信息,使馆会要求与申请人通过APP进行视频面审。请申请人关注订单状态,及时选择预约时间,目前仅开放周二上午、周四上午两个时间段。请申请人于选定时间段内进入视频面试大厅,使馆工作人员仅能够对已进入视频面试大厅的申请者按顺序发起视频邀请。视频面谈过程中,请申请人配合使馆工作人员进行截图操作,并回答相关提问。

16周岁以下未成年人应在一位法定监护人(父亲/母亲/其他法定监护人)陪同下,与使馆工作人员通过APP进行视频面谈。

(五)邮寄材料:

所有申请换发护照/旅行证人员:请在APP订单状态显示“复审中”后,尽快将当前所持证照送递或邮寄至使馆。地址:Chinese Embassy(back gate), 183 Queen Elizabeth Drive, SUVA,Ph: 00679-7137727。来馆递送人员,请提前将证件包好,交给使馆后门岗亭。注意:自2022年3月29日起(以订单显示“复审中”时间计算)未收到申请人当前所持护照/旅行证前,证照换发程序将暂停。

换发(含颁发、补发)旅行证人员,还需请将申请人纸质证件照片3张(2寸白底、正面免冠、头部占比勿过大)一并送至使馆。

申请补发、颁发护照人员:无需送递、邮寄任何材料。但证照补发周期长于换发,且流程不同,请勿盲目办理补发业务。

(六)交费取证

当前,每本护照/旅行证办理收费均为38斐币,建议待APP办证进度显示为“制证完成,待取证”后再缴费。使馆领事证件账户设于西太银行(WESTPAC BANK),帐户名:Chinese Embassy,账户号:9802407073,请通过银行柜台存款或网银转账缴费。

如在银行柜台办理,请要求银行收费员在“Narrative”一栏填写“中国领事”App中显示的订单号最后8位数(App中显示的订单号为18位字母加数字组合,例如:FJIAA3VNSE10289589,最后8位为10289589),取证时请务必携带银行收费凭条原件。

如通过网银转账,请自行备注订单号最后8位数,截图并打印转账凭证,取证时携带。

当前受新冠肺炎疫情影响,使馆领事接案大厅有限开放。每月最后一周,使馆将通过中国驻斐济大使馆官网“重要通知”栏目和“驻斐济使馆”微信公众号,同时发布下月领事接案大厅开放时间。所有APP办证进度显示为“制证完成,待取证”且完成缴费的订单,均可于接案大厅开放期间取证。取证时请持缴费凭证,使馆将现场注销并退还此前收到的旧证照、同时发放新证照。

三、注意事项

(一)受疫情影响,所有护照、旅行证业务均请通过“中国领事”APP申请办理,确有特殊困难无法使用APP申请人员,请发送邮件至:bjclfj@gmail.com,使馆将酌情远程指导或协调领事协助志愿者上门指导。

(二)APP实名认证注册目前仅支持中国普通护照或身份证号码(后续可能增加其他认证方式)。如无上述证件,可使用他人已实名认证的账号办理。

(三)所有“复审中”并已收到旧证照的订单,一般将于15-25天内收到“制证完成,待取证”信息提示。申请人如对办理进展有疑问,请发送邮件至bjclfj@gmail.com咨询。

(四)当前,通过“中国领事”APP申办的护照不包括申请人指纹信息。无指纹不影响护照正常使用,仅在入境中国时无法自助通关,须走人工通道

(五)当前,“中国领事”APP仅开通普通护照办理功能。需要办理公务护照、香港特区护照等其他国际旅行证件人员,请发送邮件至bjclfj@gmail.com咨询。

(六)使馆不会要求申请人到西太银行(WESTPAC BANK)以外的银行或网上支付费用,请谨防假借使馆名义的各类电信诈骗。

超市、地铁、车站等很多场景中,人脸识别已经被广泛应用,但是这个功能究竟是怎么实现的?

在本文中,将以 pico.js 库为例,分享实现轻量级人脸识别功能的具体开发过程 。

pico.js 是一个只有 200 行纯 JavaScript 代码的人脸检测库,具备实时检测功能(在实际环境中可达到200+ FPS),压缩后仅 2kB 。

开源代码地址:https://github.com/tehnokv/picojs;

简介

本文将介绍pico.js,这一由JavaScript编写的用于人脸检测的代码库,并展示其工作原理。尽管现已有类似的项目,但我们的目标是提供更小、计算效率更高的替代方案。

在深入考究其细节前,建议各位用计算机的网络摄像头体验一下人脸检测的实时演示(也适用于移动设备)。注意,所有进程都是在客户端完成的,即不向服务端发送图像。因此,各位无需担心在运行这段代码时的隐私问题。

在接下来的篇幅里,我将阐述pico.js的理论背景及其工作原理。

Pico对象监测框架

2013年,Markus团队在一个技术报告中介绍了这一由JavaScript实现的pico.js代码库。它是参考C语言实现的,我们可在GitHub上获取其源码:https://github.com/nenadmarkus/pico。我们密切关注其实现方法,因为我们不打算复制学习过程,而仅关注它的运行。这背后的原因是,我们最好学习带有官方代码的检测器,将其加载到JavaScript中并执行进程,如此就带有独特的优势(比如跨操作系统与设备的强大的可移植性)。

Pico对象检测框架是流行的Viola-Jones方法的一个改进。

Viola-Jones方法是基于区域分类的概念。这意味着在图像的每个合理位置和尺度上都使用分类器。这个区域枚举过程的可视化如下图所示:

该分类器试图判断当前区域是否存在人脸。最后,获取到的人脸区域将根据重叠程度进行聚类。鉴于每张图像都有很多区域,在这实时进程中有两个小技巧:

  1. 将分类器归类为级联分类器;
  2. 级联的每个成员都可以在0(1)时间内根据区域的大小进行计算。

分类级联由一系列分类器组成。这些分类器中的每一个都能正确识别几乎所有的人脸,并丢弃一小部分非人脸区域。如果一个图像区域通过了级联的所有成员,那么它就被认定为人脸。通过(设计)序列中靠前的分类器比靠后的分类器更简单,这种效果得到了进一步放大。级联分类算法如下图所示:

每个阶段包括一个分类器Cn,它既可以拒绝图像区域(R),也可以接受图像区域(A)。一旦被拒绝,该区域将不会进入下一级联成员。如果没有一个分类器拒绝该区域,我们认为它是一张人脸。

在Viola-Jones框架中,每个分类器Cn都基于Haar-like特性。这使得每个区域可通过名为积分图像的预算结构来进行O(1)计算时间。

然而,积分图像也有一些缺点。最明显的缺点是,这种数据结构需要额外的内存来储存:通常是unit8输入图像的4倍。另外一个问题是构建一个完整的图像所需的时间(也与输入的像素数有关)。在功能有限的小型硬件上处理大的图像也可能会有问题。这种方法的一个更微妙的问题是它的优雅性:随之而来的问题是我们是否能够创建一个不需要这种结构、并且具有所有重要属性的框架。

Pico框架对每个分类器Cn用像素对比测试取代了Haar-like特性,形式如下:

其中R是一个图像区域,(Xi,Yi)表示用于比较像素值的位置。注意,这种测试可以应用于各种尺寸的区域,而不需要任何专门的数据结构,这与Haar-like的特性不同。这是通过将位置(Xi,Yi)存储在标准化坐标中(例如,(Xi,Yi)在[?1,1]×[?1,1]中),并乘以当前区域的比例。这就是pico实现多尺度检测功能的思路。

由于此类测试很简单,又因混叠和噪声而存在潜在问题,我们有必要将大量测试应用于该区域,以便对其内容进行推理。在pico框架中,这是通过

  1. 将测试组合考虑到决策树中;
  2. 有多个这样的决策树,通过对它们的输出求和,形成级联成员Cn。

这可以用数学符号表示,如下:

其中Tt(R)表示决策树Tt在输入区域R上生成的标量输出。由于每个决策树都由若干个像素比较测试组成,这些测试可以根据需要调整大小,因此运行分类阶段Cn的计算复杂度与区域大小无关。

每个Cn决策树都是AdaBoost的变体。接下来以这种方式将阈值设置为Cn的输出,以获取期望的真阳率(例如0.995)。所有得分低于这个阈值的区域都不认为是人脸。添加级联的新成员,直到达到预期的假阳率。请参阅原出版物学习相关细节内容。

正如简介中说的那样,我们不会复制pico的学习过程,而仅关注它的运行。如果您想学习自定义对象/人脸检测器,请使用官方的实现方法。Pico.js能够加载二进制级联文件并有效地处理图像。接下来的小节将解释如何使用pico.js来检测图像中的人脸。

pico.js的组件

库的组成部分如下:

  • 从级联数据实例化区域分类功能的过程;
  • 在图像上运行此分类器以检测面部的过程;
  • 对获得的检测结果进行聚类的过程;
  • 时序记忆模块。

通过<script src="pico.js"></script>(或它的压缩版本) 引入并进行一些预处理后,就可以使用这些工具了。我们将讨论对图像进行人脸检测的JS代码(GitHub repo中的代码)。但愿这能详尽说明使用该库的方法。实时演示也有说明。

实例化区域分类器

区域分类器应识别图像区域是否为人脸。其思路是在整个图像中运行这个分类器,以获得其中的所有面孔(稍后详细介绍)。Pico.js的区域分类过程封装在一个函数中,其原型如下:

 
function(r, c, s, pixels, ldim) { /* ... */}
 /*
 ...
 */
}

前三个参数(r、c和s)指定区域的位置(其中心的行和列)及其大小。pixels阵列包含图像的灰度强度值。参数ldim规定从图像的一行移动到下一行的方式(在诸如OpenCV的库中称为stride)。也就是说,从代码中可以看出(r,c)位置的像素强度为[r*ldim + c]像素。该函数会返回一个浮点值,表示该区域的得分。如果分数大于或等于0.0,则该区域认定为人脸。如果分数低于0.0,则该区域认定为非人脸,即属于背景类。

Pico.js中pico.unpack_cascade过程将二进制的级联作为参数,将其解压并返回一个带有分类过程和分类器数据的闭包函数。我们用它初始化区域分类过程,以下是详细说明。

官方pico的人脸检测级联称为facefinder。它由近450个决策树组成,每个决策树的深度为6,它们集成一个25级联。该级联将在我们是实验中用到,它能对正脸图像以适当的检测速率进行实时处理,正如实时演示看到的那样。

facefinder级联可以直接从官方的github库上下载,代码写为:

 
var facefinder_classify_region=function(r, c, s, pixels, ldim) {return -1.0;};var cascadeurl='https://raw.githubusercontent.com/nenadmarkus/pico/c2e81f9d23cc11d1a612fd21e4f9de0921a5d0d9/rnt/cascades/facefinder';fetch(cascadeurl).then(function(response) { response.arrayBuffer().then(function(buffer) { var bytes=new Int8Array(buffer); facefinder_classify_region=pico.unpack_cascade(bytes); console.log('* cascade loaded'); })})function(r, c, s, pixels, ldim) {return -1.0;};
var cascadeurl='https://raw.githubusercontent.com/nenadmarkus/pico/c2e81f9d23cc11d1a612fd21e4f9de0921a5d0d9/rnt/cascades/facefinder';
fetch(cascadeurl).then(function(response) {
 response.arrayBuffer().then(function(buffer) {
 var bytes=new Int8Array(buffer);
 facefinder_classify_region=pico.unpack_cascade(bytes);
 console.log('* cascade loaded');
 })
})

首先,将facefinder_classify_region初始化,即任何图像区域先认定为非人脸(它总是返回-1.0)。接下来,我们使用Fetch API从cascadeurl URL中获取级联二进制数据。这是一个异步调用,我们不能即刻获取到数据。最后,在获取到响应数据后,将其转换为int8数组并传递给pico.unpack_cascade,然后pico.unpack_cascade生成正确的facefinder_classify_region函数。

将facefinder_classify_region函数应用于图像中每个区域的合理位置和等级以便检测到所有的人脸。这个过程将在下一小节中解释。

在图像上运行分类器

假定HTML body内有一个canvas元素,一个image标签和一个带有onclick回调的button标签。用户一旦点击了人脸检测按钮,检测过程就开始了。

下面的JS代码用于绘制内容和图像,并获取原始像素值(红、绿、蓝+ alpha的格式):

 
var img=document.getElementById('image');var ctx=document.getElementById('canvas').getContext('2d');ctx.drawImage(img, 0, 0);var rgba=ctx.getImageData(0, 0, 480, 360).data; // the size of the image is 480x360 (width x height)document.getElementById('image');
var ctx=document.getElementById('canvas').getContext('2d');
ctx.drawImage(img, 0, 0);
var rgba=ctx.getImageData(0, 0, 480, 360).data; // the size of the image is 480x360 (width x height)

下面,我们编写一个辅助函数,将输入的RGBA数组转换为灰度:

 
function rgba_to_grayscale(rgba, nrows, ncols) { var gray=new Uint8Array(nrows*ncols); for(var r=0; r<nrows; ++r) for(var c=0; c<ncols; ++c) // gray=0.2*red + 0.7*green + 0.1*blue gray[r*ncols + c]=(2*rgba[r*4*ncols+4*c+0]+7*rgba[r*4*ncols+4*c+1]+1*rgba[r*4*ncols+4*c+2])/10; return gray;}
 var gray=new Uint8Array(nrows*ncols);
 for(var r=0; r<nrows; ++r)
 for(var c=0; c<ncols; ++c)
 // gray=0.2*red + 0.7*green + 0.1*blue
 gray[r*ncols + c]=(2*rgba[r*4*ncols+4*c+0]+7*rgba[r*4*ncols+4*c+1]+1*rgba[r*4*ncols+4*c+2])/10;
 return gray;
}

现在我们准备调用这个过程,它将在整个图像中运行facefinder_classify_region函数:

 
image={ "pixels": rgba_to_grayscale(rgba, 360, 480), "nrows": 360, "ncols": 480, "ldim": 480}params={ "shiftfactor": 0.1, // move the detection window by 10% of its size "minsize": 20, // minimum size of a face "maxsize": 1000, // maximum size of a face "scalefactor": 1.1 // for multiscale processing: resize the detection window by 10% when moving to the higher scale}// run the cascade over the image// dets is an array that contains (r, c, s, q) quadruplets// (representing row, column, scale and detection score)dets=pico.run_cascade(image, facefinder_classify_region, params);"pixels": rgba_to_grayscale(rgba, 360, 480),
 "nrows": 360,
 "ncols": 480,
 "ldim": 480
}
params={
 "shiftfactor": 0.1, // move the detection window by 10% of its size
 "minsize": 20, // minimum size of a face
 "maxsize": 1000, // maximum size of a face
 "scalefactor": 1.1 // for multiscale processing: resize the detection window by 10% when moving to the higher scale
}
// run the cascade over the image
// dets is an array that contains (r, c, s, q) quadruplets
// (representing row, column, scale and detection score)
dets=pico.run_cascade(image, facefinder_classify_region, params);

注意,人脸的最小尺寸默认设置为20。这太小了,对于大部分应用程序来说都是不必要的。但还需要注意的是,运行速度在很大程度上取决于此参数。对于实时应用程序,应该将此值设置为100。但是,设置的最小尺寸需匹配示例图像。

检测过程完成后,数组dets包含表单(r,c,s,q),其中r,c,s指定人脸区域的位置(行,列)和大小,q表示检测分数。该地区得分越高,越有可能是人脸。

我们可以将得到的检测结果渲染到画布上:

 
qthresh=5.0for(i=0; i<dets.length; ++i) // check the detection score // if it's above the threshold, draw it if(dets[i][3]>qthresh) { ctx.beginPath(); ctx.arc(dets[i][1], dets[i][0], dets[i][2]/2, 0, 2*Math.PI, false); ctx.lineWidth=3; ctx.strokeStyle='red'; ctx.stroke(); }<dets.length; ++i)
 // check the detection score
 // if it's above the threshold, draw it
 if(dets[i][3]>qthresh)
 {
 ctx.beginPath();
 ctx.arc(dets[i][1], dets[i][0], dets[i][2]/2, 0, 2*Math.PI, false);
 ctx.lineWidth=3;
 ctx.strokeStyle='red';
 ctx.stroke();
 }

我们需要根据经验设置变量qthresh(5.0刚好,适用于facefinder级联和静止图像中的人脸检测)。典型的检测结果是这样的:

我们可以看到每张脸周围都有多个探测器。这个问题用非极大值抑制来解决,在下一小节中解释。

原始检测的非极大值抑制(聚类)

非极大值抑制聚类的目的是将重叠的人脸区域融合在一起。每个集群的代表是其中得分最高的一次检测(该方法因此而得名)。它的分数更新为集群中所有检测分数的总和。

pico.js中的实现方式是:

 
dets=pico.cluster_detections(dets, 0.2); // set IoU threshold to 0.20.2); // set IoU threshold to 0.2

IoU阈值设置为0.2。这意味着两个重叠大于该值的检测将合并在一起。

现在的结果是这样的:

我们已经学习了使用pico.js检测静止图像中人脸的基本知识。值得注意的是,pico方法不如基于深度学习的现代人脸检测器强大。然而,pico非常快,这使得它成为许多应用程序的首选,比如那些需要实时处理的应用程序。

在视频中使用pico.js进行实时人脸检测

由于pico.js产生的检测噪声比较大,我们开发了一种时间记忆模块,在处理实时视频时可减轻少此问题。该方法用于上述实时演示中,显著提高了主观检测质量。

其思想是将几个连续帧的检测结合起来,以准确判断给定区域是否为人脸。这是通过实例化一个电路缓冲区来实现的,该缓冲区包含从最后一个f帧检测到的信号:

 
var update_memory=pico.instantiate_detection_memory(5); // f is set to 5 in this example// f is set to 5 in this example

update_memory闭包封装了电路缓冲区和刷新数据的代码。返回的数组包含来自最后f帧的检测。

现在我们不再从单帧中检测聚类,而是在聚类之前进行累加:

 
dets=pico.run_cascade(image, facefinder_classify_region, params);dets=update_memory(dets); // accumulates detections from last f framesdets=pico.cluster_detections(dets, 0.2); // set IoU threshold to 0.2
dets=update_memory(dets); // accumulates detections from last f frames
dets=pico.cluster_detections(dets, 0.2); // set IoU threshold to 0.2

最终的分类阈值qthresh会显著提高,这会减少假阳性的数量,而不会显著影响到真阳率。

转载自:https://blog.csdn.net/csdnnews/article/details/92841099