文章目录:
- 1 人脸识别背景介绍
- 1.1 人脸1:1比对
- 1.2 人脸1:N搜索
- 1.3 人脸N:N搜索
- 1.4 人脸虚拟ID的聚类
- 1.5 人脸识别的基本流程
- 2 人脸识别前沿算法
- 2.1 人脸识别算法发展
- 2.2 人脸识别算法中的一些典型代表
- 3 分布式人脸识别训练
- 4 大规模的人脸评测平台
- 4.1 LFW
- 4.2 MegaFace
- 4.3 Trillion Paris
- 4.4 评测标准
- 如何在大数据下对人脸识别训练
- 如何对人脸识别的算法进行更加合理的评测
1 人脸识别背景介绍
1.1 人脸1:1比对
-
给定两个人脸,判断是否同一人。
-
应用场景:银行柜台、海关、手机解锁、酒店入住、网吧验证。(比如,你先要出示你的身份证,然后用你的人脸与身份证上的人脸做1v1的比对!手机解锁也是一样,需要你提前注册一张人脸图片)
-
特点:
人证比对
1.2 人脸1:N搜索
在实际使用的过程中一般是静态的搜索
,比如一个公安民警,在监控视频中锁定目标人物,然后把他的脸框起来,提交到系统中去搜索,系统一般会返回topK
(K一般是几十或100量级的数字),然后会按照相似度
把这些人脸都排列处来。然后人工验证哪些是对的,当然如果top1就是对的那是最好!
-
一张待检索图片,大小为N的人脸库(如犯罪分子库),判断库中是否有目标人物
-
要回答得问题是:是否为库中人脸1?是否为库中人脸2?。。。。。是否为库中人脸N?是否不在库中?
-
实际使用的特点:N次比较,人工交互,TopK(比如100),库往往可以做到比较大,
待检索图像质量可能会比较差
(比如监控摄像头下捕捉到的人脸比较远、角度比较大、有遮挡、分辨率低等)
现在的算法,在底库1000万级别的时候,top1的召回率还是挺高的,大概有百分之八九十的样子!
1.3 人脸N:N搜索
N:N的搜索就比较难一些!
-
大量的摄像头(N个摄像头),都在实时抓拍,有很多待确认的抓拍人脸(N个待比对的人脸)
-
有个比较大的库
-
应用场景:会议签到,小区门禁,自动闸机,安防监控
举个例子:
比如在安防领域,我们有100个摄像头,每个摄像头每天抓取一万个人,总的搜索次数就有100万次,假如这一天10个犯罪嫌疑人出门了,被这些摄像头中的某一个抓拍到,然后我们要在一个10万大小的底库中去搜索,我们有一个算法,这一天总共报警了100次,然后警察每个都去确认,最后抓到了9个犯罪嫌疑人。这样结果看起来还不错,总共出现了10个犯罪抓到了9个,那么召回率就是90%
误报率:(91/100w10w 约等于1e-9)100次报警,对了9个,错了91个(误报), 总共做了100w10w次比较,约等于10亿分之一(1e-9)。这个指标在现在的人脸识别指标还算不错了,但是在公安民警来看也没有那么理想,因为他们出警100次只抓到了9个犯罪嫌疑人!他们更希望是出动10次,就抓到9个人。那么他出动10次就能抓到9个人的误报率是多少呢(1/100w*10w 约等于1e-11),这样看起来民警是少出去了1个数量级,但是你的误报率要提升两个数量级(千亿分之一),但即使有一个可以达到千亿分之一的算法也只能应对100个摄像头,因此在算法上还有很大的提升空间
1.4 人脸虚拟ID的聚类
-
不知道每个人的证件信息,只有大量的摄像头的抓拍结果
-
根据人脸、
时间
、空间
等图像和各种先验信息进行聚类
,可以用来比如挖掘用户的轨迹和行为习惯
等 -
人脸相册 安防监控 智能零售。比如手机的相册进行人脸聚类,但是这个库还是比较小,但是在安防和零售数据一般会比较大。如果能够做的比较好也是比较有应用价值的,比如在零售方面知道哪些顾客经常来买东西,什么时间买了什么东西,可以有针对性的推荐商品等!
1.5 人脸识别的基本流程
1、人脸检测
2、人脸关键点定位
一般提取5个关键点,用于后面对人脸对齐
3、人脸矫正(/ 人脸对齐)
人脸对齐:把人脸转到比较正的方向上,便于后面的模型分析,以及用CNN特征提取的时候,各个feature之间能够更高的对齐
4、人脸特征提取
最终会提取到一个人脸的描述特征
,通常是一个100多维到几百维的float类型的特征表达(一般128,256,512、1024等)
。然后利用不同人脸之间的特征距离
(越小越好)或相似度
(越大越好),然后再根据一定的阈值,判断这两个人脸是否是同一个人
2 人脸识别前沿算法
2.1 人脸识别算法发展
人脸识别的算法演变 | 具体算法方法 |
---|---|
一些传统思路 | Eigenface,LDA,LBP+Joint Bayes |
CNN baseline | Softmax |
CNN+各式各样的loss | Pairwise,Triplet,DeepFace,DeepID1,2,2+,3,FaceNet,CenterLoss等 |
最新进展(Normalization,Margin) | Lsoftmax,Asoftmax,NormFace/coco Loss,Feature Incay,AMSoftmax/CosFace,Arcface/insightFace |
1、传统方法做人脸识别方法还是挺多的,这里只列取一些
2、在CNN出来之后,一个很自然的baseline就是直接做softmax分类
3、经过两年的发张,又出现了各种各样的loss
4、到最近的一些新的进展,又回归到了softmax损失,但是大家对softmax、Normalization、Margin又有了一些更深的探索!
2.2 人脸识别算法中的一些典型代表
然后对上面人脸识别算法发展中的一些典型代表进行回顾一下:
其实,早在80年代末就可以用CNN做人脸识别,比如把字符输入变换成矫正后的人脸输入等
1、DeepID就是上面思路的具体实现
-
它是对人脸很多关键的区域,每个区域都经过CNN网络,直接用softmax分类,然后得到隐层的特征,然后把所有的patch特征拼接在一起,再做某种意义上的降维,然后得到了最终的特征,用这个特征做特征描述。当时再LFW上是领先了其他的算法
-
得到最后的人脸特征之后,又做了基于概率统计的降维
2、DeepID2
其实,从DeepID大家就觉得用隐层的特征不见得是最好的方式,DeepID2有做的更加细致一些,
希望同一个人的特征尽量近,不同人的特征尽量远,输入是两张图片,然后判断两张图片的特征的欧式距离,如果是同一个人都是距离比较小,如果不是同一个人要求他们之间的距离要大于等于m,一但小于m就要受到惩罚(从损失函数中可以看出)。去掉了大的FC层,类似与二分类。
3、DeepID2+
和DeepID2差不多,做了小的修改
4、DeepFace
DeepFace在算法上并没有本质的创新,还是softmax loss,它的主要改进是在数据预处理方面,在对齐的时候做了更加精细的调整,结果显示会有一定的提升,但是也有一些人会质疑,虽然在三维对齐在有些场景下是能够work的,也有可能会在有些场景下错的比较远!
5、DeepID3
2015年刚好是VGG和GoogleNet出来的那一年,作者用了比较深的网络,提升也是很自然的!
6、FaceNet
下一个是Google的FaceNet
前面用到的都是公开的人脸数据集,数据ID也就1万左右,Google以为有很多数据,在FaceNet上使用的数据有2.6亿,总共的ID有800W。
FaceNet使用的是Triplet loss,它有三个样本对,分别是Anchor、Negative、Postive,如果和anchor是同一个类就是Positive对,如果不是同一个类就是Negative对。可能也开始的时候,Negative对可能距离anchor的距离比较postive距离anchor的距离更近,但是期望所有的三元对训练之后,同一类的距离anchor更近,而且是明显的近,相当于是有一个margin和alpha在这里控制!
这样就可以避免大的分类的layer,如果特征512,800万ID就相当与是一个512*800w的矩阵才能做softmax。然后直接拿GooleNet做backbone网络结构设计
7、Center Loss
前面几个算法都是比较老的,大部分都是从softmax loss上做的改进,google FaceNet是例外。后面几个比较有效的方法基本上都是在softmax基础上延申出来的。
8、L-softmax(Large-Margin softmax)
希望在做分类的时候把不同的类区分开,把同一个类压缩的更紧
直观的看就是把两个类的簇进行压缩,尽量让二者之间留有一个比较大的margin,这样更容易区分不同的类!
9、A-softmax
A-softmax是在L-softmax基础上加了一句话,也就是考虑margin,同时添加了两个限制条件||W||=1和b=0,其他与L-softmax都是一摸一样的!
10、NormFace / CocoLoss
前面的L-softmax和A-softmax两篇论文是从margin的角度来讲的。后面出了两篇论文NormFace和CocoLoss是在Norm的角度改进的,加了两个限制,每个样本的特征feature要是一个const。从这里开始人脸特征的距离全部从L2转向了cos距离!
11、FeatureIncay
margin类似SVM分类,分类之间要有空隙,把两个类分的更开!
cos(theta)减去m,对它要求更高,角度更小,
12、AMSoftmax
13、InsightFace / ArcFace是同一篇论文
上面几种方式都是让cos(theta)变得更小!
3 分布式人脸识别训练
数据并行+模型并行
(要考虑通信)
loss设计是学术界做的比较多的!模型评测指标如果不好,就可能判断不出来那个模型更好!
4 大规模的人脸评测平台
4.1 LFW
缺点:几乎已经饱和了,当两个算法在LFW上评测的可能都达到了99.8%+,当换一个数据集可能就会表现的比较差!
4.2 MegaFace
top1也已经98.998%,也快接近饱和了!
4.3 Trillion Paris
27w query和1.6M差不多有27w1.6M=2.7w160w约等于5000亿对
1、训练集制作的流程
- 其中一部分是在公开的数据集MS-Celeb-1M-v1上做了一些清理,去掉了其中的一些名人
- 然后又收集一个亚洲的人脸数据集,大概也有1W个ID,让后把这两个数据集合并到一起,去重,最终做成一个合并版的数据!
MS-Celeb本上就包含两种噪声:
- 类内噪声:每个类可能不知包含一个人,但实际上应该区分开,是不同的ID
- 类间噪声:比如同一个人在不同的电影中名字不一样,被分到不同的类中
-
先对每个类做一个层次聚类,当其阈值小于某个threshold就把他们聚在一起,一开始threshold设置的比较小的,只有少量的图片聚起来
-
如果两个簇,有两张图片,两两比较的最短距离小于某个threshold,这两个簇就会合并起来
测试机的制作要求更高:
检测图片也具有比较大的类内差距:
- 比如又化妆的
- 大角度、不同姿态
- 不同表情
- 戴墨镜遮挡、黑白等
4.4 评测标准
1、评测标准
万亿人脸对做测试:27w的图片qurey 和 160w的图片做底库,两两之间做pair,然后让模型去判断是否是同一个人!
2、万亿人脸对测试,由于数据量比较大,可能需要比较多的资源,因此大家只要提交模型的特征就可以,大概半个小时就可以看到评测结果!
3、跨年龄和角度的测试
我们有160w的干扰项作为底库,在这么多人中去搜索你感兴趣的目标人物
LFW作为底库,大概有5000,搜索次数比较多有160w次,来模拟真实安防多摄像头的场景,在安防景下大部分的抓拍可能都不是你的目标任务,可能在160w次只有几千人是你的目标人物,但是你需要把这些人识别出来,控制误报!
参考:https://zhuanlan.zhihu.com/p/268736001
参考:https://edu.csdn.net/course/play/8528/175587
参考:https://cloud.tencent.com/developer/article/1435298 # 大角度人脸转正
参考:https://blog.csdn.net/muhen1234/article/details/81776822
参考:https://zhuanlan.zhihu.com/p/58952484
参考:视频教程