C#开发实录:基于免费SDK实现人脸识别应用开发

2020年06月17日 14:27
随着人脸识别技术应用范围不断扩展,如何在Windows C#上基于免费SDK实现人脸识别应用开发,正成为开发者们关心的话题之一。

对于该需求,我推荐虹软视觉开放平台的ArcFace 3.0,免费、离线且可商用,包含人脸识别、活体检测、年龄检测、性别检测等丰富功能,算法鲁棒性强,接入门槛低,同时支持Windows、iOS、Android(包含Android10)、Linux,是广大开发者落地AI应用的利器。

为帮助开发者快速上手,虹软工程师团队针对C#开发打磨了一期课程,以技术解析和专项答疑等形式帮助开发者解决难题。建议有兴趣尝试ArcFace3.0的C#开发者可以提前学习,在实际开发中可事半功倍。

本期课程要点如下,对完整课程视频感兴趣的开发者,可以通过百度搜索“虹软技术公开课”观看。

一、要点一【3分钟跑通C# demo】

课程基于虹软人脸识别SDK包中提供的示例代码,以实操的形式介绍了如何快速接入使用。接入过程在课程视频中有详细介绍。建议观看视频后自行尝试配置,即可对虹软人脸识别技术有一个初步的了解。

Demo配置过程如下:

1. 下载Demo

2. 检查本地系统环境是否符合要求:

.NET Framework 4.5.1及以上

Microsoft Visual C++ 2013 运行库

3. 在虹软视觉开放平台下载SDK,获取APPID、SDKKEY

4. 配置运行Demo:

a.在App.config文件中配置APPID、SDKKEY

b.将SDK lib文件夹中dll文件拷贝到运行根目录下

c.如本地.NET Framework的版本高于4.5.1,直接修改项目的目标框架

二、要点二【ArcFace重点接口及参数介绍】

1.引擎初始化接口:ASFInitEngine()



【说明】

引擎初始化接口用于初始化引擎,初始化中的参数设置用于定义引擎的属性和算法功能组合,与算法能够呈现出的效果息息相关。

初始化失败时,根据错误码查询原因即可。参数设置是开发者最关心的核心问题,也是保障在实际应用场景中最大化发挥算法效果的关键。视频中主要介绍以下几个参数在实际场景下如何应用。

【重要参数说明】

detectMode(检测模式):

ASF_DETECT_MODE_VIDEO video模式:适用于摄像头预览,视频文件识别

ASF_DETECT_MODE_IMAGE image模式:适用于静态图片识别。

detectFaceScaleVal(最小人脸尺寸):代表人脸尺寸相对于图片长边的占比,数值越大,能检测更小的人脸,效值范围,video模式推荐值为16,image模式推荐值32。

combinedMask(算法功能组合):建议根据具体业务合理选择算法功能组合,如果功能选择越多,占用的内存越大。

2.人脸特征提取接口:ASFFaceFeatureExtract()



【说明】当人脸检测完成时,可以根据获取的人脸信息通过此接口进行对应人脸的特征提取。

【重要参数说明】

faceInfo:特征提取需要单张准确的人脸位置和角度,否则可能会报81925。

featureFeature:算法返回的人脸特征值,包含特征byte数组及特征长度,特征数据库存取操作应存取特征byte数组。

3.人脸属性检测:ASFProcess()



【说明】人脸检测成功后,可以根据人脸信息通过此接口检测人脸属性,如年龄、性别等。

【重要参数说明】

combinedMask:只支持引擎初始化时指定需要检测的功能,如引擎初始化时,mask指定为年龄和性别,则不能检测3D角度等其他属性。

支持的属性:ASF_AGE(年龄)、ASF_GENDER(性别)、ASF_FACE3DANGLE(3D角度)、ASF_LIVENESS(RGB活体)。

Process() 检测后可根据ASFGetXXX()接口获取对应属性检测结果。

三、要点三【视频流识别和活体检测】

下图为常见视频流识别和活体检测的逻辑流程图:



【多线程策略】

主线程:包含人脸追踪以及画面预览功能。

FR线程:用于人脸特征提取和特征搜索。

活体线程:用于人脸活体检测。

【优化策略】

FaceID:根据FaceID标识一个人,从进入画面到离开画面,对这一人脸只做一次识别即可,大大降低系统资源占用。

尝试次数:同一张人脸,特征提取失败可以做有限次数的尝试,提高交互效果。

四、要点四【常见问题答疑】

1. 多线程调用问题

a. 同一个引擎可以使用多线程调用不同算法。

b. 多线程调用同一个算法接口需要启用不同的引擎。

2. VIDEO和IMAGE模式的区别

VIDEO模式:

a. 对视频流中的人脸进行追踪,人脸框平滑过渡,不会出现跳框的现象。

b. 用于预览数据的人脸追踪,处理速度快,可避免出现卡顿问题。

c. 在视频模式引入faceId帧,该值用于标记一张人脸,当一个人脸从进入画面直 到离开画面,faceId 值不变。可用于业务中优化程序性能。

IMAGE模式:

a. 针对单张图片进行人脸检测精度更高。

b. 在注册人脸库时,我们建议使用精度更高的IMAGE模式。

3. 非托管内存的操作

C#调用C++ SDK接口,有些传参需要以Intptr的形式。

a. 复制前应先为Intptr申请内存;

b. 当IntPtr不使用时,需要及时手动释放。

4. 人脸特征数据库的存储

人脸特征提取接口返回的featureFeature对应ASF_FaceFeature,数据库存储应将ASF_FaceFeature .feature转化为byte[]再进行数据库存储,featureSize表示byte[]的长度。

5. SDK dll文件的引用方法(使用DllImport方法)

a. 使用相对路径,将dll直接放到执行目录下(web程序不建议使用);

b. 使用绝对路径;

c. 将dll文件放到系统盘Windows下的System32文件夹下;

d. 为dll文件所在文件夹添加环境变量。