我要努力工作,加油!

降低深度学习人脸检测模型误检率,提升精度的一个小方法

		发表于: 2021-05-13 16:50:00 | 已被阅读: 114 | 分类于: 图像处理基础
		

前阵子写的[文章][1]尝试从特征冗余角度分析了人脸检测误检的一些原因,并给出了对应的解决方案,在实践中测试发现确实有一定的性能提升。分析和对应的解决方案都是在理想情况下考虑的,实践中达不到理想条件,所以最终人脸检测模型的性能虽然有所提升,但远远称不上完美,仍然有不少提升空间。

困难

减少人脸检测模型误检的手段有很多种,在训练阶段,添加容易误检的数据入训练集,将之作为困难样本微调模型便是一个可行、并且常用的手段。然而,实践中去执行时可能会遇到两个问题:

  • 我们不知道所有的容易误检样本类型
  • 没有条件获取大量的困难样本

鉴于深度学习模型的较差解释性,即使是人脸检测模型的设计开发者,也不可能准确举出所有的可能误检样本类型。一般来说,人脸检测模型的开发者只能尽量保证模型在已有的数据集上表现良好,但是正如[这篇文章][2]所分析,所谓“已有的数据集”只是实际问题涉及数据集的一个很小的子集,保不准用户会在什么样的环境使用模型呢,产生误检的样本通常千奇百怪。

比如人脸检测模型居然会把一片空白的墙壁当成人脸。

更令人痛苦的是,即使用户反馈了误检样本的类型,比如空白墙壁,开发者却发现自己家的空白墙壁不会被误检。类似的困难样本难以获取。

误检从哪里来?

还是以典型的有监督人脸检测模型训练为例,那么样本类型总体只有两种:人脸和背景(1和0)。使用 \( P(y|x) \) 表示人脸模型,\( x \) 表示样本特征,\( y \) 表示类型。因为是有监督训练,所以在训练阶段,我们能够清楚的知道哪些样本特征属于人脸(y=1),哪些样本特征属于背景(y=0),理想情况下:

  • \( P(y|x_1) = 1 \)
  • \( P(y|x_0) = 0 \)

人脸检测模型误检其实就是 \( P(y|x_{0}) = 1 \) 了。

背景样本 \( x_0 \) 和人脸样本 \( x_1 \) 千变万化,但是理论上应该分别服从两个有明显区别的数据分布(\( x_0 \sim D_0 \)\( x_1 \sim D_1 \)\( D_0 \neq D_1 \)),否则别说人脸检测模型不会收敛,就算是人类自己本身也无法区分背景和人脸。

\( p_\theta (y|x) \) 表示人脸检测模型预测结果的概率分布,则训练模型只需要优化 \( -log p_\theta (y|x) \) 。模型的最后一层通常是 softmax 层,设 softmax 前面一层为 \( f_i(x;\theta) \)(i=y,y={0,1}),此时

\( $p_\theta(y|x) = \frac{e^{f_y(x;\theta)}}{e^{f_0(x;\theta)} + e^{f_1(x;\theta)}} \tag 1 \)$

因此优化 \( -log p_\theta (y|x) \),就是让 \( f_y(x;\theta) \) 尽量大。从公式 \( (1) \) 能够得出“尽量大”的含义:对于标签 \( y_i \)\( f_{y=i} \) 至少要比 \( f_{y \neq i} \) 大。

在训练人脸检测模型的过程中,\( f_0(x;\theta) \)\( f_1(x;\theta) \) 在某种程度上有些“对抗”的感觉——\( y=1 \) 也即人脸样本会尽力提高 \( f_1(x;\theta) \),拉低 \( f_0(x;\theta) \);而 \( y=0 \) 也即背景样本则会尽力拉低 \( f_1(x;\theta) \),提高 \( f_0(x;\theta) \)

所以,单从分类任务来看,为什么不同类别的样本要尽量均衡就可以解释了。若是第 \( i \) 类的样本远远多于其他类样本,则 \( f_i(x;\theta) \) 被提高次数远远大于被拉低次数,最终得到的模型偏向把输入分为第 \( i \) 类,反过来也是类似的。最终分类模型的泛化性能不好。

当人脸检测模型被充分训练后,假设模型收敛到最优,则应有:

$$f_0(x;\theta) > f_1(x;\theta) + \epsilon, x \sim D_0 \ f_1(x;\theta) > f_0(x;\theta) + \epsilon, x \sim D_1 \tag 2$$

前面提到人脸模型误检原因是 \( P(y|x_{0}) = 1 \),即:样本 \( \hat x \) 来自背景类样本

  1. 理论上应 \( f_0(\hat x;\theta) > f_1(\hat x;\theta) + \epsilon \)
  2. 实际上却 \( f_0(\hat x;\theta) < f_1(\hat x;\theta) + \epsilon \)

鉴于人脸检测模型已经收敛到最优,对于一切 \( x \sim D_0 \cup D_1 \),模型均严格满足公式 \( (2) \),但是 \( \hat x \) 却违背了公式 \( (2) \),这说明 \( \hat x \nsim D_0 \)。再考虑到我们的样本一共只有两类,样本 \( \hat x \) 可能:

  1. 标签是错的,也即 \( \hat x \sim D_1 \)
  2. \( \hat x \nsim D_0 \cup D_1 \)

第 1 种可能没什么好说的。第 2 种可能表示样本 \( \hat x \) 的数据分布与已有数据集分布不同,可以认为 \( \hat x \) 是噪声样本。

例如,训练数据集是彩色图数据集,其中混杂了一张红外图,\( \hat x \) 就相当于这张红外图。