人脸识别是生物识别的一个特例, 生物识别还可以是指纹识别, 瞳孔识别, 声纹识别等等. 生物识别三个典型的任务是: 验证, 开集测试和闭集测试.

验证通俗来讲是判断两个样本是不是来自同一个个体, 例如两张人脸是不是同一个人; 或者判断一个生物样本和其声称的ID是否一致. 它所要回答的问题为: 这个人是他声称的那个人吗? 闭集测试是指, 判断一个人脸属于数据库中哪个人的, 而且事先确定这个人一定在数据库中(这里的数据库表示系统中已知的人脸集合), 其所要回答的问题是: 这个人脸是谁的? 闭集测试的一般形式是开集测试, 它与闭集测试不同的是, 人脸不一定在数据库中. 它所要回答的问题是: 这个人脸在数据库中吗, 如果在是哪个人的?

生物识别的性能围绕上面的三个任务进行. 评估生物识别的性能需要三个数据集合: 第一个称为gallery 用 $\mathcal{G}$ 就是上文所提到的已知数据库, 它包含了系统中已知的人脸; 另外两个称为推测集probe 或者说是测试集更好理解一些.测试集由正样本集 $\mathcal{P}_\mathcal{G}$ 和负样本集 $\mathcal{P}_\mathcal{N}$ 组成. 这里的正样本表示对应的人脸包含在已知数据库$\mathcal{G}$中, 负样本则未被包含. 下面分别介绍三种任务的性能量化指标.

开集测试

开集测试中系统需要判断人脸是否在数据库中, 如果在, 需要判断出是哪个人脸. 所以识别算法正确需要达到两个条件, 即得分达到阈值($\tau)$; 且排名第一. 用符号形式化表示就是:

  • rank(p_j) = 1
  • $s_{*j} \ge \tau$ for the similarity match where $id(p_j) = id(g^*) $

其中$s_{*j}$ 表示配对样本和测试样本的相似性分数, 我们用 $*$ 表示正确的人脸, rank(p_j)表示配对人脸相似性分数的排名, $id(p_j) = id(g^*)$ 表示配对成功. 正确判断人脸在数据库中, 并且配对成功的比率称之为 identification rate, 实际上就是检出率. 它的计算公式如下:

$$
P_{DI}(\tau, 1) = \frac{\{ p_j:p_j \in \mathcal{P}_{\mathcal{G}}, rank(p_j) = 1, 且 s_{*j} \ge \tau \}}{|\mathcal{P}_{G}|}
$$

另一个重要的指标是误检, 英文称之为 False Alarm Rate(FAR), 它表示负样本被判定为负样本的比例. 直接称为误检更好理解, 因为和人脸检测误检类似. 负样本英文有时候称之为 imposter, 直译过来是冒名者, 如果它和数据库中的某个人脸相似性分数超过了阈值, 便出现了误检, 即
$$
\underset{i}{max} s_{ij} \ge \tau
$$
其中 $\tau$ 是判定阈值. 误检个数除于负样本总数便是误检率,
$$
P_{FA}(\tau) = \frac{\{ p_j:p_j \in \mathcal{P}_{\mathcal{N}}, 且 \underset{i}{max} s_{ij} \ge \tau \}}{|\mathcal{P}_{N}|}
$$

通过结合检出率和误检率可以画出人脸识别开集测试的ROC曲线, 如下图是一个典型的人脸识别开集ROC曲线图:

其中横坐标轴为误检率, 纵轴为检出率. 其画法和其它类似的ROC曲线类似, 调整人脸识别的阈值 $\tau$ 计算出当前阈值的检出和误检率作为坐标点, 再连接成线. 理想的人脸识别是误检率为零的时候检出率为1. 但是现实很难达到, 提升检出率时误检率会随之升高, 只能两者相权取最优的阈值. AUC 指标在这里仍然适用, 通常曲线下方面积越大, 算法性能越好.

在开集测试中, 还有一个指标可以洞察人脸识别的性能, 它是检出率和分数排名的关系曲线. 计算公式为:

$$
P_{ID}(\tau, n) = \frac
{|{ p_j : p_j \in \mathcal{P}_{\mathcal{G}}, rank(p_j) \le n, and s_{*j} \ge \tau }|}
{|\mathcal{P}_{\mathcal{G}}|}
$$

下图是在不同的误检率下, 检出率和Rank的关系. 图标右侧表示曲线对应的误检率. 误检率为1, 所有的样本都判定为正样本, 曲线就代表正样本排名的累计分布了. 由图可以看出, 大约有 85% 的样本得分第一. 但是误检率调低时, 许多正样本会陪判定为负样本, top-1 就会少很多, 误检率处于0.01时, 曲线几乎不上升, 说明在这个阈值底下, 只要被正确判定为正样本, 其分数都是第一名.

验证测试

验证测试判定一系列的样本对, 其中一个来自数据库已知人脸, 另一个为测试样本, 可能是正样本, 也可能是负样本. 真实配对样本称之为正样本对, 假配对称之为负样本对. 正样本对可能被判定为负的, 反之亦然. 验证测试性能评估具有两种协议, 第一种叫做 round robin protocol, 姑且称之为循环协议. 在循环协议中, 不区分正样本集 $\mathcal{P}_{\mathcal{G}}$和负样本集 $\mathcal{P}_{\mathcal{N}}$, 所有的测试样本在一个集合 $\mathcal{P}$中. 所有的正样本对全部用来计算检出率(verification rate), 负样本对全部用来计算误检率(false actept rate). 公式如下:

$$
{P}_{V}(\tau) = \frac
{|{ pj : s{ij} \ge \tau, id(g_i) = id(p_j) }|}
{|\mathcal{P}|}
$$

$$
{P}_{FA}(\tau) = \frac
{|{ s_{ij}: s_{ij} \ge \tau, id(g_i) \ne id(p_j) }|}
{(|\mathcal{P}|-1)|\mathcal{G}|}
$$

上面的协议有个问题同一个集合即用来计算检出率又用来计算误检率. 另一种协议, true imposter protocol, 姑且称之为正负区分协议则对测试样本进行划分. 用正样本集计算验证率, 负样本集计算误检率. 负样本集和数据库两两配对, 测试对数为乘积关系, 总共的对数为 $|\mathcal{P}_{\mathcal{N}}||\mathcal{G}|$ 因此正负区分协议的验证率计算公式为
$$
{P}_{V}(\tau) = \frac
{|{ p_j : p_{j} \in \mathcal{P}_{\mathcal{G}}, s_{ij} \ge \tau, id(g_i) = id(p_j) }|}
{|\mathcal{P}|}
$$
误检率的计算公式为
$$
{P}_{FA}(\tau) = \frac
{|{ s_{ij}: p_{j} \in \mathcal{P}_{\mathcal{N}}, s_{ij} \ge \tau }|}
{|\mathcal{P}_{\mathcal{N}}||\mathcal{G}|}
$$

闭集测试

闭集测试已知了人脸一定在数据库中, 通常用前n名是否出现了正确的配对来评价. 通常我们用
$$
C(n) = |{ p_j:rank(p_j) \le n }|
$$

计算名词n名以前的检出总数. 将$C(n)$ 除于正样本集变可得到 rank n 的验证率

$$
P_{I}(n) = \frac {|C(n)|} {|\mathcal{P}_{\mathcal{G}}|}
$$

闭集测试通过累计匹配特征曲线(cumulative match characteristic, CMC)评价识别性能, 它是验证率 $P_I(n)$ 相对于名词 n 的函数. 下图是典型的CMC曲线, 横轴是名词, 纵轴是验证率.

因为名次和测试集的大小相关性很大, 例如10名对于100个样本是前10%, 而对于1000个样本则为前1. 为了消除测试集大小的影响, 可将名词归一化为比例.

参考

此处应有打赏