作者 | 张德兵
编辑 | 阿司匹林
出品 | 人工智能头条(公众号ID:AI_Thinker)
人脸识别已经成为成为计算机视觉领域最热门的应用之一,很多刚入门的 AI 新手都或多或少接触过人脸识别的相关知识,但是纸上得来终觉浅,在实际应用中,往往会遇到各种各样的问题,比如如何保证不同环境下人脸识别的准确率,极端环境下如何进行人脸识别等等。
为了帮大家解惑,我们特意邀请到了格灵深瞳首席科学家和算法部负责人——张德兵,为大家带来主题为“一亿 ID 的人脸识别训练和万亿人脸对(Trillion Pairs)的人脸识别评测”的公开课。
本期的公开课主要包含以下 4 个方面的内容:
1、人脸识别背景介绍
2、人脸识别前沿算法简介
3、分布式人脸识别训练
4、大规模人脸检测平台介绍
公开课回放地址:https://edu.csdn.net/huiyiCourse/detail/791
以下是公开课文字版整理内容
▌一、人脸识别背景介绍
简单来讲,人脸识别这个问题,就是给定两个人脸,然后判定他们是不是同一个人,这是它最原始的定义。它有很多应用场景,比如银行柜台、海关、手机解锁、酒店入住、网吧认证,会查身份证跟你是不是同一个人。这个应用的主要特点是,在大多数场景下都需要你先提供一个证件,然后跟自己的人脸做比对。手机解锁可能是个例外,但也要求你提前注册一张人脸,然后再进行比对。这是最原始的形式,由用户直接提供需要对比的两个人脸。这也是最简单的形式,相当于做一个二分类。
进一步来讲,如果想要去做人的搜索呢?比如我们有一个大小为 N 的人脸库,有一张待检索的图片,让我们判断这个人有没有在这个人脸库中出现过。这种情况下,要回答的就有 N 个问题了,分别是:这个人脸是不是库中的人脸1、是不是人脸2,一直到是不是人脸N。如果这 N 个问题回答都是“否”的话,就意味着这个人不在人脸库里面。不在人脸库是一个很难的问题,等于 N 个问题都得回答对,然后才能真正确认它并不这个人脸库里。
实际使用时一般是静态的搜索,比如有一个公安的民警,他从视频或者图片里找到目标人物,把他的脸框出来,然后提交到系统里,在库里面做搜索。然后系统会返回,比如 Top K,K 一般是几十或者100这个量级的数字,会按照相似度把这些人脸排出来,然后人工验证到底哪些是对的。如果 Top 1 就是对的那最好,一般如果能够排到 Top 10 就算是不错的结果,但在 100 名以后的话,这个结果很难对使用的人有帮助了。如果允许TopK的话,这个底库是可以做到比较大的,因为并没有要求一定放到 Top 1。
公安评测时,在各个省公安的环境上做评测,底库一般都比较大,到千万的量级甚至到亿的量级,这也是因为最近几年深度学习发展的非常快。最早期时只能做静态检索,而且结果还不太好,随着深度学习算法的发展,现在很多公司的算法都越来越好了,评测的时候也会很难区分各个厂家的算法到底谁好谁坏,所以测试本身这个问题越来越难,用来检索图片的质量也越来越苛刻,实际应用中很多问题也很苛刻,比如嫌疑人在摄像头里出现距离比较远,有侧面的,或者帽子遮挡,戴眼镜等现象。
给大家举个例子,下面是我在互联网上找到的明星的照片,在真实场景里 query 的质量跟这个差不多,有的时候比这些更难一点。现在主流人脸算法解决这种问题时,当底库是千万量级时,top1是召回率还是很高的,百分之八九十的问题不是很大,甚至还会更高一些。
当然,在安防或者其他应用场景里有更难的任务,就是人脸的 N : N 搜索,这种情况下我们会有大量的摄像头,每一个都在实时抓拍,有非常多待确认的抓拍人脸,同时库也是相对比较大的。举个例子,在安防领域,假设我们有 100 个摄像头,然后每个摄像头每天抓拍 1 万个人,那么总的搜索次数就是 100 万次。假设这一天有 10 个嫌疑人被摄像头抓拍到,假设我们需要在一个 10 万大小的底库里面去搜索他们。我们有一个算法,这个算法这一天总报警 100 次,警察每一个都去确认,最后抓到了 9 个嫌疑人,这看起来还不错,因为总共出现了 10 个人,抓到了 9 个,召回率是 90%。那我们来看看误报率,100 次报警,对了 9 次,错了 91 次,误报率就是91 除以 100万×10万,大概算下来是 10亿分之0.91,约为 10亿分之1 的误报率。
这个指标在现在的人脸识别算法里还算比较不错的了,但是在公安民警看来没有那么理想,因为他们出警了 100次,只抓到了 9 个人,他们非常想出警 10 次就抓到 9 个人,这样成本就会低很多。那我们来看一下出警 10 次抓到 9 个人的误报率是多少呢?看起来少了一个数量级,但实际上要求误报率要提高两个数量级,因为这个时候误报的次数只有 1 次,1 除以 100万×10万,就是已经到了千亿分之一,这个就非常难达到。即使有一个千亿分之一的算法也只能支持 100 个摄像头的需求,在很多城市里轻轻松松就有上万个摄像头,甚至几十万个。所以算法还要在误报率方面再降低 N 个数量级,或者要求我们有更聪明的使用方式,在还有很多研究的空间。
还有一类应用是人脸虚拟 ID 的聚类,虚拟 ID 就是我们不知道每个人的证件信息,只有大量的摄像头抓拍结果,我们想根据这些人脸的图像特征和出现的时间、空间等先验信息进行聚类,这样可以挖掘用户的轨迹和行为习惯。这些信息在很多场景下非常有用,最简单的是人脸相册的聚类,这个应用很简单,因为你只需要在一个人的相册里做聚类就可以了,库很小。但在安防、零售等场景都是城市级的数据,这个做好的话可以带来很有价值的信息,比如谁跟谁经常在一起活动,从 A 点到 B 点到 C 点到 D 点有什么异常,像这些人员流动的异常,在很多地方,尤其是新疆、西藏等 ,大家都非常关注。
人脸识别的基本流程,首先要检测到人脸,检测到之后一般会做关键点的定位,把他的眼睛、鼻子、嘴角等信息都定位出来,利用这个信息对人脸做个矫正,把它变换到比较正情形,便于后面模型分析或者处理时各个部分更好的对齐。最终会提取得到一个人脸的描述特征,通常是一个 100 多维到几百维的特征表达,然后我们用不同人脸特征之间的相似度或者距离,相似度是越高越好,距离是越小越好,去刻画两个人之间的关系,再卡一个域值,来判断这两个人是否为一个人。这次我们讲人脸识别主要就是最后的人脸特征提取的部分。
<