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


    随着人脸识别技术应用范围不断扩展,如何在Windows C#上基于免费SDK实现人脸识别应用开发,正成为开发者们关心的话题之一。
    对于该需求,我推荐虹软视觉开放平台的ArcFace 3.0,免费、离线且可商用,包含人脸识别、活体检测、年龄检测、性别检测等丰富功能,算法鲁棒性强,接入门槛低,同时支持Windows、iOS、Android(包含Android10)、Linux,是广大开发者落地AI应用的利器。
    为帮助开发者快速上手,虹软工程师团队针对C#开发打磨了一期课程,以技术解析和专项答疑等形式帮助开发者解决难题。建议有兴趣尝试ArcFace3.0的C#开发者可以提前学习,在实际开发中可事半功倍。
    本期课程要点如下,对完整课程视频感兴趣的开发者,可以通过百度搜索"虹软技术公开课"观看。
    一、要点一【3分钟跑通C# demo】
    课程基于虹软人脸识别SDK包中提供的示例代码,以实操的形式介绍了如何快速接入使用。接入过程在课程视频中有详细介绍。建议观看视频后自行尝试配置,即可对虹软人脸识别技术有一个初步的了解。
    Demo配置过程如下:
    1. 下载Demo
    2. 检查本地系统环境是否符合要求:
    a. .NET Framework 4.5.1及以上
    b. 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(最小人脸尺寸):代表人脸尺寸相对于图片长边的占比,数值越大,能检测更小的人脸,效值范围[2,32],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文件所在文件夹添加环境变量。