问题标签 [viola-jones]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
24574 浏览

algorithm - Viola-Jones 的人脸检测声称拥有 18 万个特征

我一直在实施Viola-Jones 的人脸检测算法的改编版。该技术依赖于在图像中放置一个 24x24 像素的子帧,然后将矩形特征放置在图像中的每个位置,并具有各种可能的大小。

这些特征可以由两个、三个或四个矩形组成。给出了以下示例。

矩形特征

他们声称详尽的集合超过 180k(第 2 节):

鉴于检测器的基本分辨率为 24x24,详尽的矩形特征集相当大,超过 180,000 个。请注意,与 Haar 基不同,矩形特征集是过完备的。

以下陈述未在论文中明确说明,因此它们是我的假设:

  1. 只有 2 个二矩形特征、2 个三矩形特征和 1 个四矩形特征。这背后的逻辑是我们正在观察突出显示的矩形之间的差异,而不是明确地观察颜色或亮度或任何类似的东西。
  2. 我们不能将特征类型 A 定义为 1x1 像素块;它必须至少为 1x2 像素。此外,类型 D 必须至少为 2x2 像素,并且此规则适用于其他特征。
  3. 我们不能将特征类型 A 定义为 1x3 像素块,因为中间像素无法分割,从自身中减去它与 1x2 像素块相同;此特征类型仅针对偶数宽度定义。此外,特征类型 C 的宽度必须能被 3 整除,此规则也适用于其他特征。
  4. 我们无法定义宽度和/或高度为 0 的特征。因此,我们将xy迭代为 24 减去特征的大小。

基于这些假设,我计算了详尽的集合:

结果是162,336

我发现近似 Viola & Jones 所说的“超过 180,000 个”的唯一方法是放弃假设 #4 并在代码中引入错误。这涉及将四行分别更改为:

结果是180,625。(请注意,这将有效地防止特征接触子框架的右侧和/或底部。)

现在当然是问题:他们在实施过程中犯了错误吗?考虑表面为零的特征是否有意义?还是我看错了?

0 投票
2 回答
29313 浏览

c++ - Viola-Jones 人脸检测方法是如何工作的?

请用几句话向我解释 Viola-Jones 人脸检测方法的工作原理。

0 投票
2 回答
2061 浏览

opencv - Viola Jones 人脸检测框架

我刚刚开始研究 Viola-Jones 人脸检测算法来设计人脸识别系统。根据我理解的所有内容,我对“像素总和”这个短语感到困惑。它是指给定像素的颜色总和还是给定像素的距离总和?

0 投票
5 回答
54913 浏览

opencv - 人脸检测中的 Haar Cascades 与 LBP Cascades

我一直在 OpenCV(开源计算机视觉库)中尝试人脸检测,发现可以使用 Haar 级联来检测人脸,因为 OpenCV 提供了几种人脸。但是,我注意到还有几个 LBP 级联。经过一番研究,我发现 LBP 代表 Local Binary Patterns,根据OpenCV 人脸检测文档,它也可以用于人脸检测。

我想知道的是,哪个效果更好?哪一个执行得更快,哪一个更准确?似乎 LBP 执行得更快,但我也不是 100% 确定这一点。谢谢。

0 投票
1 回答
7253 浏览

machine-learning - 使用 P. Viola、M. Jones 框架计算最佳阈值的最佳方法

我正在尝试在 C++ 中实现 P. Viola 和 M. Jones 检测框架(一开始,只是序列分类器 - 不是级联版本)。我想我已经设计了所有必需的类和模块(例如积分图像、Haar 特征),尽管有一个——最重要的是:AdaBoost 核心算法。

我已经阅读了 P. Viola 和 M. Jones 的原始论文以及许多其他出版物。不幸的是,我仍然不明白如何为一个弱分类器找到最佳阈值?我只发现了对“加权中位数”和“高斯分布”算法以及许多数学公式的少量参考......

我曾尝试使用 OpenCV Train Cascade 模块源作为模板,但它是如此全面,以至于对代码进行逆向工程非常耗时。我还编写了自己的简单代码来理解 Adaptive Boosting 的概念。

问题是:你能解释一下计算一个弱分类器的最佳阈值的最佳方法吗?

下面我将展示 AdaBoost 伪代码,它是根据 Google 中的示例重写的,但我不相信它是否正确。一个弱分类器的计算非常慢(几个小时),我特别怀疑计算最佳阈值的方法。

感谢您的任何帮助

0 投票
1 回答
9768 浏览

image-processing - 使用 AdaBoost 算法的 Viola Jones 如何在人脸检测中发挥作用?

我已经阅读了很多关于 Viola Jones 方法的内容,但我仍然不了解矩形特征中的“弱分类器”、“强分类器”、“子窗口”,它们的定义是什么。那么“门槛”呢?我怎么知道阈值?谁能帮我?谢谢之前

0 投票
1 回答
9346 浏览

opencv - 使用 OpenCV haarcascade xml 的 Viola-Jones 检测算法

我正在尝试实现 Viola Jones 检测器。因为我没有足够的图像或时间来训练分类器,所以我决定使用这些 OpenCV。

到目前为止,我能够将整体加载haarcascade_frontface_alt.xml到内存中的结构中,为快速面积求和创建积分图像并为检测器创建基本算法。但它根本没有按预期工作。

所以,如果有人知道 Viola Jones 检测器是如何工作的,并且知道 OpenCV 如何使用它的结构,请确认或否认我的假设:

1,积分图像以浮点值计算,范围从 0->1 表示白色
2,对于每个特征,您在其矩形内取面积,乘以权重并与所有矩形求和
3,如果总和 > 阈值,则将 left_val 求和此外,如果不使用 right_val
4,则阶段中所有分类器的总和大于 stage_threshold,它可能是人脸,因此继续下一个阶段,如果不是,则中断
5,对所有阶段、检测窗口和尺度重复...

到目前为止,我得到了各种检测到的区域,除了那些包含人脸的区域......

请,如果我对 openCV 级联使用的假设是错误的,请帮忙。谢谢。

0 投票
1 回答
3493 浏览

opencv - Viola Jones 人脸检测 - 对象/人脸大小的变化

我正在尝试理解 Viola Jones 的方法,而且我基本上已经掌握了。

它使用简单的类似 Haar 的特征被提升为强分类器并组织成层/级联以实现更好的性能(不打扰明显的“非对象”区域)。

我想我了解积分图像,并且了解特征的计算值是如何计算的。

我唯一想不通的是算法如何处理面部大小的变化。

据我所知,他们使用在图像上滑动的 24x24 子窗口,其中算法通过分类器并试图找出上面是否有人脸/物体。

我的问题是——如果一张脸是 10x10 大小,而另一张脸是 100x100 怎么办?那会发生什么?

而且我很想知道前两个特征是什么(在级联的第一层),它们看起来如何(记住这两个特征,根据 Viola&Jones 的说法,几乎不会错过一张脸,并且会消除60% 的错误) ? 如何??

而且,如何构建这些特征来处理图像中不同人脸尺寸的这些统计数据?

我是否遗漏了什么,或者我认为这一切都错了?

如果我不够清楚,我会尝试更好地解释我的困惑。

0 投票
1 回答
767 浏览

computer-vision - Viola Jones AdaBoost 在开始之前就内存不足

我正在实施 Viola Jones 人脸检测算法。我对算法的 AdaBoost 学习部分的第一部分有疑问。

原始论文指出

弱分类器选择算法如下进行。对于每个特征,示例根据特征值进行排序。

我目前正在使用相对较小的 2000 个正图像和 1000 个负图像的训练集。该论文描述了拥有多达 10,000 个的数据集。

AdaBoost 的主要目的是减少 24x24 窗口中的特征数量,总计 160,000+。该算法适用于这些特征并选择最好的特征。

该论文描述了对于每个特征,它在每个图像上计算其值,然后根据值对它们进行排序。这意味着我需要为每个特征创建一个容器并存储所有样本的值。

我的问题是我的程序在只评估了 10,000 个功能(其中只有 6%)后内存不足。所有容器的总大小最终将达到 160,000*3000,即数十亿。我应该如何在不耗尽内存的情况下实现这个算法?我增加了堆大小,它让我从 3% 到 6%,我认为增加它不会起作用。

该论文暗示在整个算法中都需要这些排序值,因此我不能在每个特征之后丢弃它们。

到目前为止,这是我的代码

0 投票
0 回答
397 浏览

c++ - 使用 viola jones 人脸检测前的裁剪

我正在尝试改进人脸检测,并且我正在 OpenCV 中使用 viola jones 算法的实现。我没有得到我想要的结果,所以我想在使用 cascade.detectMultiScale 函数之前进行一些预处理。我正在使用的图像包含具有某些背景的人的上半身。如果我在仅包含面部的裁剪图像上使用 cascade.detectMultiScale() 函数会有所帮助吗?