中科视拓李凯周:人脸识别应用实战——SeetaFace2

2019-09-30 15:07:35 浏览数 (1)

演讲嘉宾

李凯周,天津大学计算机科学与技术专业硕士。现担任中科视拓研发部产品总监兼研发总监,负责研发算法部署、SDK化和数据分析管理工作,主导SeetaFace2的算法发布。

回顾正文

大家好,简单介绍一下,我是李凯周,现担任中科视拓研发部产品总监兼研发总监,负责研发算法部署、SDK化和数据分析管理工作,现在开始我们今天的分享。

今天跟大家分享的题目是人脸识别应用实战:SeetaFace2,就是以SeetaFace2为例简述人脸识别技术如何从算法到应用在工业上的人脸识别系统。首先介绍SeetaFace2的主要内容,然后介绍SeetaFace2检测、定位、识别的核心接口,使用这些核心接口进行典型应用的举例,包括:跟踪、质量评估、人证对比、动态识别,之后再深入地挖掘SeetaFace2的源码,给大家呈现把AI的算法包装成SDK的系统应该经过哪些步骤,最后是求职分享,包括我对 AI 工程师的认识以及作为 AI 工程师的基本要求。

下面简要说明一下SeetaFace2包含的核心接口以及接口的含义,要做人脸识别首先要把图片或者图片序列中的人脸找出来,所以第一个模块就是人脸检测模块,人脸检测模块是C 库,最重要就是要包含这些头文件。人脸检测的话要包括人脸检测器叫FaceDetector的对象,通过给定对应的模型文件,就可以检测一个实体对象。要把待检测的图片转化为SeetaFace2支持的图像格式,是内存上连续存储的HWC格式和BGR彩色通道的一个图像格式,这个跟 OpenCV是一样的。可以把OpenCV的对象转化成SeetaImageData的对象。后面的操作就很简单了,就是通过detect接口把每张人脸用数组反应出来。需要注意的是data的指针是一个禁用的内部指针,不需要外部进行释放。

获取到图片中的每张人脸之后,只知道人脸位置,检测到人脸之后,要对人脸进行标定,把关键点找出来,找出关键点之后就知道人脸姿态和具体人脸在图片中的细节状态。而关键点定位的接口和检测的接口是高度类似的,也是要通过对应的模型文件构建人脸关键点的定位器,同样的把图片转化成ImageData对象,而ImageData对象是可以复用的。最后检测的时候mark接口要输入原图和人脸位置。

定位到人脸之后要对人脸做一个识别,识别过程提取了两套接口,分别是FaceDatabase、FaceRecognizer,如下图所示,FaceDatabase提供了内存中管理人脸库,包含了注册(Register)和查询(QueryTop)接口;FaceRecognizer包含了特征提取(Extract)和特征比对的接口(CalculateSimialrity),详细讲解请参看视频回放。

在这些基础上,就可以得出一个简单的人脸识别的示例,这里给出一个示例的代码,如下图:

人脸识别中大家很关心的问题还有人脸识别和质量评估,而且识别系统还有两个关键问题。首先,在算力有限的情况下同时应对应用级别的需求,不必要每帧处理,只要确定视频中抓拍到的多张图片哪些是一个人,一个人只识别一次就可以了;还有,可以通过跟踪,预先判断抓拍到的图片哪些是一个人,同时需要质量评估从这些图片中选择哪些是可以识别的。

下面简要讲述一下人脸跟踪,怎么通过人脸检测去实现跟踪,如图所示:人脸跟踪的基本问题是在前一帧检测到了两张人脸(PID0和PID1),那后一帧检测到的人脸是前面出现的哪个人脸?还是新的人脸?PID相同的我们认为是同一个人,具体讲解请观看视频回放。

这里给出一种实现方式,可以计算后一帧的每一张和前一帧的每一张人脸的交并比,从而可以找到重叠率最大的人脸。

如果重叠率超过阈值,则人脸是一张人脸。否则赋予新的PID。

下面我们讲质量评估,这里列举了几种最直接影响人脸识别判断效果的因素:

接下来依次讲一下这几个方面的质量该通过什么方法去判断,详细讲解请观看视频回放:

姿态中,平面内旋转角度,可以通过两眼连线与水平的夹角判别;偏转角度,可以通过鼻尖到人脸中心线的距离判别;俯仰的角度可以通过鼻尖在眉心和嘴中心的投影位置判别。

面部亮度就是每个像素灰度值的均值。

清晰度参考采用一种无参考的判别方式,通过判断原始图像再次模糊后的梯度信息损失程度来判断原始图像的清晰程度。

下面说一下经常会遇到的基本问题,对刚刚接触人脸识别的同学来说可能会有一些帮助,详细讲解请参看视频回放。

之前讲的可以算是纯工程化的部分,现在我们展开来介绍SDK源码,给大家展示一个AI算法是经过哪些步骤变成一个一个SDK的。不过今天不会涉及算法模型的具体介绍。考虑到部分同学可能还不了解SeetaFace2是什么,所以不会太展开讲所有的源码内容,今天主要的目的就是介绍源码,然后展示我们的算法是如何封装的,同时我们封装或者分析的时候应该关注哪几个方面。

下图展示的是我们的源码结构图:

接下来介绍一下SeetaNet的这两个相关接口:

模型加载之后就是模型推理的部分:

有了网络的初始化和前向,更重要的就是网络的前处理和后处理:

还会涉及到一些参数转换的问题:

最后来看一下总结图:

今天没有深入介绍具体算法的实现,下图给出了不同算法的参考文献,有兴趣的同学可以看一下。同时希望通过今天的分享,大家能够了解到一个AI算法,是如何变成可复用的SDK,然后怎么把SDK应用到业务系统的。

最后一点时间和大家分享一下AI工程师的职业基本素质和技能,我会从实践方面来分享一下成为AI工程师的基本要求。一般说的AI工程师这个职位是算法工程师、软件工程师结合的角色,分别有些什么要求,如图所示(详细讲解请观看视频回放):

0 人点赞