近年来随着模型越来越深,标注数据越来越难增加,人脸识别可能遇到瓶颈。本文提出一种有监督的Metric用于人脸聚类,来部分解决无标注数据内部结构复杂、依赖特定Metric、缺乏Outlier控制,以及时间复杂度等问题。本文来自MMLab香港中文大学-商汤科技联合实验室。

人脸识别也许是最成功也最先到达瓶颈的深度学习应用。在Go Deeper, MoreData,Higher Performance的思想指导下,模型更深了,数据却越来越难增加。目前在人脸的公开数据集标到了百万级别,人脸识别百万里挑一的正确率达到99.9%(MegaFace Benchmark)之后,发现再也标不动了。标注员能标出来的数据永远是简单样本,而人脸识别模型是个“深渊”,当你凝视“深渊”的时候,“深渊”并不想看到你。

“深渊”想看到这样的数据,并且明确被告知不是同一个人:

以及这样的数据,并且明确被告知是同一个人:

在把标注员弄疯之前,不如先让模型自己去猜一猜,说不定就猜对了呢?这其实就是半监督学习的思路。利用已有的模型对无标签数据做某种预测,将预测结果用来帮助模型训练。这种自我增强(Self-Enhanced)的学习方式,虽然看起来有漂移(Drift)的风险,但实际用起来还挺好用 [5]。对于闭集(Close-Set)的问题,也就是所有数据都属于一个已知的类别集合(例如ImageNet, CIFAR等),只需要模型能通过各种方法,例如标签传播(labelPropagation)等,预测出无标签数据的标签,再把它们加入训练即可。

然而问题来了,人脸识别是一个开集(Open-Set)的问题。

例如,人脸比对(Verification)、人脸鉴定(Identification)等任务中,测试样本的身份(Identity)通常没有在训练样本中出现过,测试过程通常是提取人脸特征进行比对,而非直接通过网络推理得到标签。同样,对于无标注数据,在采集的过程中,人脸的身份也是未知的。可能有标注的数据的人脸属于10万个人,而新来的无标注数据属于另外10万个人,这样一来就无法通过预测标签的方式把这些数据利用起来。而聚类不同于半监督学习,只需要知道样本的特征描述(Feature)和样本之间的相似度度量标准(Metric)就可以做聚类。聚完类之后再给每个类分配新的标签,同样可以用来帮助提升人脸模型。

人脸聚类方法

传统的人脸聚类一般采用LBP、HOG之类的手动设计的特征,因为这类特征过于过时,不在我们讨论的范畴。而深度学习时代的人脸聚类,一般采用卷积神经网络(CNN)中提取出来的特征 [4]。人脸识别的CNN通常把人脸图片映射(Embedding)到一个高维的向量,然后使用一个线性分类器,加Softmax激活函数和交叉熵损失(Cross Entropy Loss)来训练。

紫色的向量即为人脸特征(图片来自 [3])

这种方式决定了这些经过映射(Embedding)后的人脸在特征空间里分布在不同的锥形(Cone)中(下左图),因而可以使用余弦相似度(Cosine Similarity)来度量相似度。或者如果对人脸特征做二范数(L2)归一化,那么人脸特征则会分布在一个球面上(下右图),这样可以使用L2距离来度量。

图示为2维,实际在高维空间(图片来自 [6])

有了特征和度量标准之后,就可以考虑如何选择一个聚类算法了。现成的聚类算法包括K-Means,Spectral, DBSCAN, Hierarchical Agglomerative Clustering (HAC), Rank Order等以及它们的变种。利用这些方法聚类之后,将每一类中的样本分配相同的标签,不同的类分配不同的标签,就可以用来充当训练集了。

到此为止,似乎已经可以顺利地完成这个任务了。然而

使用20万张图提取特征之后来测试一下这些聚类算法,K-Means花了10分钟,HAC花了5.7小时,DBSCAN花了6.9小时, Spectral花了12小时。若使用60万张图片提取的特征来做聚类,K-Means超内存了,HAC花了61小时,DBSCAN花了80小时,Spectral跑到天荒地老之后也甩了一句超内存。当图片数量增加到140万的时候,几乎所有的聚类算法都挂了。

K-Means, Spectral, HAC等传统聚类方法的问题主要在于以下方面:

(a) 聚类算法具有较高的时间复杂度。例如,K-Means是O(NKT),Spectral是O(N^3),HAC是O(N^2)。

(b) 通常认为数据分布服从某些简单的假设。例如,K-Means假设数据类内具有球状的分布 [2],并且每一类具有相同的方差(Ariance),以及不同的类具有相同的先验概率。然而对于大规模人脸聚类,无标注数据通常来源于开放的场景(in-the-wild),数据内部的结构比较复杂,难以一致地服从这些假设。例如,我们期望数据长这样(如下左图):

(c) 通常使用某种特定的Metric。例如上述提及的Cosine Similarity和L2距离。同样,对于复杂的数据结构,衡量两个样本是否属于同一类,单纯靠样本之间的局部相似度是不够的,这个metric需要融合更多信息。

(d) 缺乏较好的离群值(Outliers)控制机制。Outliers来源于人脸识别模型对难样本的Embedding误差,以及观测到的数据不完整。尽管部分聚类算法例如DBSCAN理论上对Outliers鲁棒,但从其实际表现来讲这个问题远没有得到解决。

有监督的Metric

终于可以说说自己的工作了。我们被ECCV2018接收的一篇论文(Consensus-Driven Propagation in Massive Unlabeled Data for FaceRecognition),简称CDP [1],尝试解决上述这些问题中的一部分。我们提出了一种有监督的Metric用于人脸聚类,来部分解决无标注数据内部结构复杂、依赖特定Metric、缺乏Outlier控制的问题,顺便还解决了一下时间复杂度的问题(CDP做到了线性复杂度),当然性能也提升了一大截。

介绍方法之前我们先来介绍一下Affinity Graph。Graph在半监督学习和聚类上经常出现。Affinity Graph的节点是数据样本,边代表数据之间的相似度。一种常见的Affinity Graph是KNN Graph,即对所有样本搜索K近邻之后将样本与其近邻连接起来得到。我们的方法CDP基于KNN Graph来构建数据的结构。

CDP本质是学习一个Metric,也就是对样本对(Pairs)进行判断。如下图,CDP首先使用多个人脸识别模型构建成一个委员会(Committee), Committee中每个成员对基础模型中相连的Pairs提供包括关系(是否是Neighbor)、相似度、局部结构等信息,然后使用一个多层感知机(MLP)来整合这些信息并作出预测(即这个Pair是否是同一个人)。

这个过程可以类比成一个投票的过程,Committee负责考察一个候选人(Pair)的各方面信息,将信息汇总给MLP进行决定。最后将所有的Positive Pairs组成一个新的Graph称为Consensus-driven Graph。在此Graph上使用简单的连通域搜索并动态剪枝即可快速得到聚类。由于MLP需要使用一部分有标签的数据来训练得到,所以CDP是一种基于有监督的Metric的聚类方法。

CDP框架

接下来就是激fei动chang人wu心liao的结果分析了。

在复杂度上,CDP由于只需要探索局部结构,因此除了KNN搜索之外,聚类部分的复杂度是接近线性的。在20万数据上,不计入KNN搜索(依赖别的库)的时间的话,CDP单模型的耗时是7.7秒,多模型的耗时是100秒。在140万数据上,CDP单模型的耗时是48秒,多模型的耗时是585秒。试验结果上看时间复杂度甚至低于线性(小于7倍)。

在聚类结果上,例如对20万数据聚类,即使使用单模型也达到了89%的fsCore,多模型可以达到95.8%,强于大部分传统聚类算法。各种聚类算法运行时间和性能测试见GitHub。

我们的实验中使用CDP聚类后的数据加入人脸识别模型的训练之后,可以让模型达到接近全监督(使用Ground Truth标签)的结果。如下图所示:

在两个测试集(Benchmark)上,随着数据的增多,用CDP聚类结果训练的人脸模型性能的增长接近全监督模型(所有数据都使用Groundtruth标注)。有趣的是在IJB-A上我们的结果超过了全监督模型,原因可能是训练集的Ground Truth标签会有一些噪声(Noise),例如误标注,导致全监督模型在IJB-A的某些测试样例上表现不佳。

下图是切换不同的CNN模型结构后的结果:

聚类后的部分结果如下图所示:

每一组代表聚完类后属于同一类

我们发现CDP还可以用来做数据和标签清理(Denoise)。例如一个标注好的数据集可能有一些标错的样本,或者非常低质量的图片,可以使用CDP来找到这些图并舍弃。如下图:

每一组人脸在原始标注中属于同一个人,左上角数字是CDP分配的标签,红框中的样本为CDP丢弃的样本,包括:1. 被错误标注进该类,实际是一个孤立点的样本。2. 低质量图片,包括过度模糊、卡通等。

在这篇工作中我们发现,基于学习的Metric能基于更多的有效信息进行判断,会比手动设计的Metric更擅长解决比较复杂的数据分布。另外,这种类似多模型的投票的方式在鲁棒性上带来了很大提升,这样可以从无标签数据中发掘出更多的难样本。

代码链接:

https://github.com/XiaohangZhan/cdp,欢迎watch/star/fork以及交流。

有监督的聚类算法

CDP属于一种自下而上(Bottomup)的方法,因此只能感知局部的数据结构。然而感知全局的数据结构对于聚类更为重要,为此,我们最近提出了一种自上而下(Top Down)的有监督聚类方法,能自动学习根据数据的结构进行聚类,更加充分地解决上述传统聚类的问题,不过暂时需要保密。如需交流可在评论区留言。

References:

[1] X. Zhan, Z. Liu, J. Yan, D. Lin, and C.C. Loy. Consensus-driven propagation in massive unlabeled data for facerecognition. In European Conference on Computer Vision (ECCV), September2018.

[2] A. K. Jain. Data clustering: 50 yearsbeyond k-means. Pattern recognition letters, 31(8):651–666, 2010. 2

[3] Y. Sun, X. Wang, and X. Tang."Deep learning face representation from predicting 10,000 classes."in Proceedings of the IEEE conference on computer vision and patternrecognition (CVPR). 2014.

[4] Otto, C., Wang, D., & Jain, A. K.(2018). Clustering millions of faces by identity. IEEE transactions onpattern analysis and machine intelligence (PAMI), 40(2), 289-303.

[5] Zhu, X. (2006). Semi-supervisedlearning literature survey. Computer Science, University ofWisconsin-Madison, 2(3), 4.

[6] Wang, H., Wang, Y., Zhou, Z., Ji, X.,Li, Z., Gong, D., ... & Liu, W. (2018). CosFace: Large margin cosine lossfor deep face recognition. in Proceedings of the IEEE Conference onComputer Vision and Pattern Recognition (CVPR). 2018.

近期文章 

《2019年人工智能的120个预测》 

公众号后台回复“进群”备注“公司+称呼”
加入“人工智能读者俱乐部”

人脸识别测试图片_人脸识别或将到达瓶颈,有监督的聚类算法探索新思路相关推荐

  1. c#和java部署pytorch同事识别两个图片_人脸识别漏洞频出?这里有个开源静默活体检测算法,超低运算量、工业级可用...

    小视科技团队开源的基于 RGB 图像的活体检测模型,是专门面向工业落地场景,兼容各种复杂场景下的模型.该自研的剪枝轻量级模型,运算量为 0.081G,在麒麟 990 5G 芯片上仅需 9ms.同时基于 ...

  2. python实现人脸识别复杂么_人脸识别没有那么复杂,Python一行代码就可以办到

    今天给大家分享一个,用一行python代码实习人脸识别. 环境要求: Ubuntu17.10 Python 2.7.14 环境搭建: 1. 安装 Ubuntu17.10 > 安装步骤在这里 2. ...

  3. alphac测试和bata测试区别_电缆识别仪与电缆故障测试仪的区别

    湖北中试高测电气控股有限公司为您解答:电缆识别仪与电缆故障测试仪的区别 电缆识别仪与电缆故障测试仪的区别 之前有客户问我,电缆识别仪和电缆故障测试仪是不是也能对电缆进行识别,我想这个用户可能是用过了电 ...

  4. yolov3识别的类别_车型识别相关技术

    原文链接:https://blog.csdn.net/weixin_36431018/article/details/112369786 在交通安防中,车型识别是一个重要的技术点,车型识别主要包括车辆 ...

  5. java名片识别源码_名片识别名片信息快速提取

    原标题:名片识别名片信息快速提取 以中安的名片识别技术为例剖析,它可提供移动端名片识别OCR API,同时还提供云端名片识别OCR API. Application Programming Inter ...

  6. java名片识别源码_名片识别

    原标题:名片识别 以文通科技的名片识别技术为例剖析,它可提供移动端名片识别OCR API,同时还提供云端名片识别OCR API. Application Programming Interface,简 ...

  7. halcon识别ocr汉字_手写汉字识别——手写文本快速电子化的好方法

    最近在试着把之前手写的一些文本录入电脑,在动手敲打之前,我就想会不会已经有很好的工具能够解决这个问题了呢?一搜索一尝试,我才发现原来手写汉字识别已经发展到很实用的地步啦-连我这..一手烂字都能有很高的 ...

  8. dp聚类算法_【深度】基于残差分析的混合属性数据聚类算法

    CAA 智慧起航,共创未来 聚类分析在医学.图像分割.生物学.电子商务.互联网等领域得到了广泛应用.在实际应用环境中,被聚类的数据通常含有数值属性和分类属性,例如医学检测报告不仅有血压.脉搏等数值属性 ...

  9. c++折线平移算法_【MITA周刊】第十五周:聚类算法

    K-Means算法 超级长文预告 /!!!!!/ 李华:呼呼呼,上周就是魔鬼啊!!!MITA数据数模部小组展示 + 小美赛 + 1 mol的论文,我太难了~~~~ 李华:现在来回顾一下上次MITA数据 ...

  10. python实现人脸识别比对_人脸识别并比对实现(基于face_recognition)

    Face Recognition 是一个基于python的人脸识别框架,我们在此之上来实现人脸比对. 环境要求 Python 3.3+ or Python 2.7 macOS or Linux (Wi ...

最新文章

  1. 俞敏洪:创业者应该避开的10个坑
  2. STM32 不断进入串口中断问题 解决方法
  3. 已安装的sql怎么添加功能_微信群管理工具有哪些功能?怎么在社群中添加微信小助手?...
  4. LeetCode算法入门- Roman to Integer Integer to Roman -day8
  5. 【Java】while(scanner.hasNext()){}引发“死循环”的处理方法
  6. 95-30-070-java.util-LinkedList
  7. SQL.H 通过此文件寻找sqlAPI编程的一种捷径
  8. 堪称神器的命令行工具系列——curl
  9. usleep头文件_Linunx的sleep,usleep,select,nonasleep对比与应用
  10. Bzoj1103 [POI2007]大都市meg
  11. oracle考试试题及其答案,oracle考试试题及答案
  12. [04-07]最新精选绿色软件每日更新(小熊整理)
  13. kafka中副本数据同步策略 ,acknowledge的发送策略,kafka的数据可靠性保证
  14. 第二部分 太阳能预测(半经验模型)
  15. matlab 215卷积码,基于matlab的卷积码的分析与应用
  16. 安装文件MSI文件和EXE文件有什么区别?
  17. 如何快速统计Excel中Sheet数
  18. php转换时间戳的一些方法
  19. 国企工资1万辞职去1.5万月薪私企,不想“内卷”,过来人:请三思
  20. uploadify多个文件上传,提示超过最多限制

热门文章

  1. js练习4(注册验证)
  2. 未能加载文件或程序集“****”或它的某一个依赖项。试图加载格式不正确的程序。解决方案总结...
  3. 香港理工大学ASSIST2011会议(2011-09-30)
  4. Struts2实现通过浏览器返回一个helloworld页面给用户
  5. Java 数组的 12 个常用操作
  6. 通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 1
  7. 【JAVA秒会技术之ActiveMQ】ActiveMQ的快速入门
  8. splay tree成段更新,成段查询poj3466
  9. flex学习笔记 富文本编辑(一)-RichEditableText
  10. linux内核之系统调用