收集adaboost算法的负样本进行人脸检测
Posted
技术标签:
【中文标题】收集adaboost算法的负样本进行人脸检测【英文标题】:collect negative samples of adaboost algorithm for face detection 【发布时间】:2014-10-25 05:45:16 【问题描述】:Viola-Jones 的 AdaBoost 方法在人脸检测中非常流行?我们需要大量正样本和负样本来训练人脸检测器。
收集正样本的规则很简单:包含人脸的图像。但是负样本的收集规则不是很明确:不包含人脸的图像。
但是有很多场景不包含人脸(可能是天空、河流、家养动物等)。我应该收集哪个?如何知道我已经收集了足够的负样本?
对负样本的一些建议:使用正样本并使用左侧部分作为负样本裁剪面部区域。这是工作吗?
【问题讨论】:
【参考方案1】:您在帖子中提出了许多问题。
-
样本数量。根据经验:当你训练一个检测器时,每个阶段大约需要数千个正样本和负样本。典型的检测器有 10-20 个阶段。每个阶段将负样本的数量减少 2 倍。因此,您将需要大约 3,000 - 10,000 个正样本和约 5,000,000 到 100,000,000 个负样本。
采取哪些负面影响。经验法则:您需要在给定的环境中找到一张脸。所以你需要把那个环境当作负面的例子。例如,如果您尝试检测坐在教室里的学生的面孔,而不是从教室(墙壁、窗户、人体、衣服等)中获取负面示例图像。拍摄月亮或天空的图像可能对您没有帮助。如果您不了解您的环境,请尽可能多地拍摄不同的自然图像(在不同的光照条件下)。
您是否应该将面部部位(如眼睛或鼻子)视为负面?你可以,但这绝对是不够的(只考虑那些负面因素)。检测器的真正强度将来自代表人脸典型背景的负图像
如何收集/生成负样本 - 您实际上并不需要很多负样本。您可以拍摄 1000 张图像并从中生成 10,000,000 个负样本。这是你如何做到的。假设您拍摄了 1 兆像素分辨率 1000x1000 像素的汽车照片。假设您想要训练人脸检测器以 20x20 像素的分辨率工作(就像 openCV 所做的那样)。因此,您将 1000x1000 的大图像切成 20x20 的大小。您可以获得 2,500 件 (50x50)。这就是你如何从一张大图像中生成 2500 个负样本的方式。现在您可以拍摄相同的大图像并将其切割成 10x10 像素大小的片段。您现在将有额外的 10,000 个负样本。每个示例的大小为 10x10 像素,您可以将其放大 2 倍以强制所有示例具有相同的大小。您可以根据需要重复此过程(将输入图像切割成不同大小的块)。从数学上讲,如果您的图像大小为 NxN - 您可以通过获取其中的每个可能的矩形来从中生成 O(N^4) 个负样本。
在第 4 步中,我描述了如何拍摄单个大图像并将其切割成大量的反例。我必须警告你,负样本不应该有高协方差,所以我不建议只拍摄一张图像并从中生成 100 万个负样本。根据经验 - 创建一个包含 1000 张图片的库(或从 Google 下载随机图片)。验证没有图像包含人脸。从每张图像中裁剪大约 10,000 个负例,现在您已经得到了 10,000,000 个不错的负例。训练你的探测器。在下一步中,您可以将每张图像剪切到大约 50,000 个(部分重叠的部分),从而将您的底片数量扩大到 5000 万张。您将开始获得非常好的结果。
检测器的最终增强步骤。当你已经有了一个相当不错的检测器时,在许多图像上运行它。它将产生错误检测(检测没有人脸的人脸)。收集所有这些错误检测并将它们添加到您的否定集中。现在再次重新训练检测器。您进行的此类迭代越多,您的检测器就会变得越好
实数 - 当今最好的人脸检测器(如 Facebook)使用数亿个正样本和数十亿个负样本。作为正面的例子,他们不仅采用正面的面孔,而且采用多种朝向、不同的面部表情(微笑、大喊、愤怒……)、不同的年龄组、不同的性别、不同的种族(高加索人、黑人、泰国人、中国人…… ..),有或没有眼镜/帽子/太阳镜/化妆等。你将无法与最好的人竞争,所以如果你的探测器错过了一些面孔,请不要生气。
祝你好运
【讨论】:
很棒的答案!还有一个问题:负样本的大小必须相同吗? 是的。此外,如果您以给定的分辨率(例如 20x20 像素或 24x24 - 人脸的典型分辨率)训练检测器 - 所有正样本和负样本都必须调整为这个精确的分辨率、相同的格式(通常是灰度级,没有颜色) 是什么意思在下一步中,您可以将每张图像剪切到大约 50,000 个(部分重叠的部分),从而将您的底片数量扩大到 5000 万张。 ? @DanielHsH 假设您有一个大小为 1000x1000 的图像,并且您想将其切割成不重叠的 20X20 像素。您将获得约 2500 张图像。如果您允许在这些 20x20 补丁之间重叠 10 个像素,您将获得约 10,000 块。都是非面子的例子。如果您还允许不同大小的补丁:您可以获得更高的数字。当您拍摄非面孔的照片时,照片本身就是一个反面例子,以及任何裁剪区域。因此,单个图像可以通过裁剪生成许多非人脸示例。以上是关于收集adaboost算法的负样本进行人脸检测的主要内容,如果未能解决你的问题,请参考以下文章