论文笔记(1):Face Search at Scale: 80 Million Gallery

1 Introduction
   随着社交媒体例如Facebook,Google上越来越多的图像由用户上传,图像数据库的规模日益增大。在这样大规模的图库当中进行检索、识别、比对等任务是非常具有挑战性的。计算复杂度,存储空间,时间成本等都与图库的规模有关。如果把现已提出的有效方法应用在现实生活中的大规模图库当中去应用,其性能会大幅下降。
   本文为解决大规模人脸图像检索,提出了一种有效的级联搜索系统,结合了快速搜索过程(用乘积量化(PQ)实现的ANN搜索)和商用的匹配器(COTS)来实现,并用CNN来提取具有判别力的人脸特征,能够在检索精度和运行速度之间达成平衡。
   为验证本文人脸搜索系统的性能,文章以有层次的、难度递增的方式,在多个人脸数据集上进行和人脸识别、验证和检索任务的评估,闭集测试和开集测试都有涉及。虽然文章在方法上并没有提出创新性思想,CNN结构和检索方法都是别人提出的,但是它做了大量的实验,有很多的收获。
   而且,为了证明本文检索系统的实用性,文章还做了一个案例研究,即2013年美国的一起波士顿马拉松爆炸案,将图库增加到8000万,并在这样的大规模图库中检索出该爆炸案的两位嫌疑犯人。

什么是人脸检索?
   给定一张查询人脸图像,检索系统根据查询人脸与图库中所有人脸图像的相似度比对,返回一个与查询人脸图像相似度最高的图像序列。
人脸检索框架
人脸检索的场景应用

  1. Faccebook, Google的标签推荐系统会自动地检测出人脸,并根据输入人脸的特征与数据库中已有标签的图像对应的特征之间的相似度来推荐出可能的姓名标签
  2. 在执法领域,FBI计划建立一个包含5000万张图像的Next Generation Identification(BGI)数据库,通过在数据库中搜索与犯罪嫌疑人长相相似的图像,来提供调查。

大规模人脸检索的困难及挑战

  1. 由于数据库规模的增大而导致搜索精度的损失
  2. 计算复杂度随数据库规模的增大而有所增加

   因此本文面对的是在社交媒体及其他网页应用环境下的大规模人脸搜索问题,而提出的一个级联式的人脸搜索框架。这样的应用环境极具挑战性,而且大量的人脸图像通常在光照、姿态、表情等方面是不收限制的。提取出鲁棒的人脸特征,使得它们对同一张人脸的多样差异保持不变性,是非常关键的。
以下内容将详细介绍文章所提出的框架,以及做的大量实验。

3 Face Search Framework

3.1 Template Generation
特征提取公式
Face Pre-process
   为了使网络从人脸图像中学习出更加具有判别力的特征,在人脸图像输入之前需要进行必要的预处理,避免人脸以外的背景内容影响模型的性能。
一般的人脸检索的流程如下:
   人脸检测 --> 人脸特征点提取 --> 人脸对齐 --> 特征提取 --> 相似性度量
本文的人脸对齐步骤:
本文人脸对齐样例
(1)用DLIB库实现人脸检测
(2)用One millisecond face alignment with an
ensemble of regression trees
提取出68个人脸特征点
(3)对齐人脸,利用特征点调整人脸在图像上的位置,使其“摆正”

Face Feature Extraction
   本文对论文Learning Face Representation from Scratch当中的ConvNet作为人脸图像的特征提取器,并对原ConvNet做出了四处改动,分别是:
(1)输入图像由灰度图变为RGB图像
(2)增加了鲁棒的人脸对齐程序
(3)对110x110的输入图像裁剪为100x100的区域,实现数据增强
(4)删除了原CNN结构中的对比损失层(Contrastive cost layer)

CNN结构解析:

本文的ConvNet框架
该ConvNet主要有三个部分:
(1)卷积&池化层:卷积核采用3x3的大小,以减少网络的参数量;
(2)特征表示层:基于“多样的人脸图像通常存在于一个低维的流形中”这样的假设,将特征表示层设为320维;
(3)输出分类层;是一个N维的softmax分类层,其中N是训练数据集中所包含的identity数量(N = 10,575)

3.2 Face Filtering
检索公式
         F :CNN特征提取器
         S :相似性度量函数
R a n k k Rank_k Rankk :取序列中的top-k个与查询人脸最相似的图像序列

   传统人脸比对函数的计算复杂度与图库规模N以及特征向量维度d是线性相关的,而近似最近邻算法(Approximate Nearest Neighbor,ANN)能在不大量损失精度的前提下提升运行时间,广泛应用于大规模图库的搜索。
   而本文采用的ANN算法是Product Quantization 乘积量化,下面将对ANN算法进行简单解释,并详细介绍乘积量化方法。

最近邻搜索(Nearest Neighbor,NN)的简单综述

  • 最近邻检索(NN)- 精确检索

最近邻检索就是根据数据的相似性,从数据库中寻找与目标数据最相似的项目,而这种相似性通常会被量化到空间上数据之间的距离,可以认为数据在空间中的距离越近,则数据之间的相似性越高。当需要查找离目标数据最近的前k个数据项时,就是k最近邻检索(K-NN)。
精确检索中数据维度一般较低。所以会采用简单的蛮力方法,也就是平常所说的穷举搜索,在数据库中依次计算其中样本与所查询数据之间的距离,抽取出所计算出来的距离最小的样本即为所要查找的最近邻。这样做的缺点是当数据量非常大的时候,搜索效率急剧下降

  • 近似最近邻检索(ANN)

面对庞大的数据量以及数据库中高维的数据信息,现有的基于 NN 的检索方法无法获得理想的检索效果与可接受的检索时间。进而有研究人员开始关注近似最近邻检索(Approximate Nearest Neighbor,ANN),近似最近邻检索利用了数据量增大后数据之间会形成簇状聚集分布的特性,通过对数据分析聚类的方法对数据库中的数据进行分类或编码,对于目标数据根据其数据特征预测其所属的数据类别,返回类别中的部分或全部作为检索结果。近似最近邻检索的核心思想是搜索可能是近邻的数据项而不再只局限于返回最可能的项目,在牺牲可接受范围内的精度的情况下提高检索效率。主要分为两种办法,一种是采用哈希散列的办法,另一种则是矢量量化

Product Quantization 乘积量化
参考博客:

  1. 最近邻搜索之乘积量化(Product Quantizer)理解(一)
  2. 乘积量化(Product Quantization)

简介
   Product Quantization(PQ)是Herv´e J´egou等人在2011年IEEE上发表的论文Product Quantization for Nearest Neighbor Search中提出来的。它的提出是为了在内存和效率之间求得一个平衡,既保证图像索引结构需要的内存足够,又是的检索质量和速度比较好。PQ属于ANN算法,相关算法有KD-Trees, K-Means等。

主要思想
   PQ分为:特征的分组量化和类别的笛卡尔积过程。假设一个数据集,K-Means的做法是给定类别数目K,目标函数是所有样本到雷中新的距离和最小,迭代优化目标函数,得到K个类中心和每个样本所属的类别。PQ的目标函数不变,做法不同。

1.空间切分

   假设图像的特征向量为: x ∈ R d x\in R^d xRd,PQ将 d d d 维的特征空间切分成 m m m 个子空间,因此特征向量 x x x可以表示成 m m m个子向量的级联:
x = ( x 1 , x 2 , . . . , x m ) , x i ∈ R d / m x = (x^1,x^2,...,x^m),x^i \in R^{d/m} x=(x1,x2,...,xm),xiRd/m
   例:一个 d = 128 d=128 d=128维的特征向量被分成了 m = 8 m=8 m=8个子向量,每个子向量有 d / m = 16 d/m=16 d/m=16维.
Product Quantization举例

2.量化

   用K-Means聚类算法为第 i i i 子空间 R d / m R^{d/m} Rd/m 生成一个码本codebook
C i = c j = 1 , 2 , . . . , z i ∣ c j i

功能设计 ​ 系统功能模块较为简单,主要功能就是**新增人脸**和**人脸搜索**两个功能,其中新增人脸使用页面上传和压缩包批量上传两个方式,压缩包上传时文件名称为用户名,下面主要说明人脸搜索的功能流程 ##### Milvues ​ 在介绍前需要说明一下Mulvus ​ Milvus 向量数据库能够帮助用户轻松应对海量非结构化数据(图片 / 视频 / 语音 / 文本)检索。单节点 Milvus 可以在秒内完成十亿级的向量搜索 ​ 因此虹软的SDK只能提取向量及对比的功能,在大规模人脸识别中,需要搜索引擎对于人脸数据进行初步筛选到一个较小的范围后在利用虹软的SDK进行测试,值得一提的是,博主多次测试后Milvues返回的匹配率足以满足人脸匹配的要求,Milvus的安装部署和使用文档参考 https://milvus.io/cn/docs/v2.0.x ​ **特别说明的是**虹软提取的数组是一个经过归一后的1032长度的byte数组,我们需要对数组进行转换,去除前8位的版本号,并将1024长度的byte转为256长度的float向量,这部分可以利用Arrays提供的方法进行转换,代码中也有相应的工具类 ##### 人脸上传(单张) ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值