- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在实现 Viola-Jones' face detection algorithm 的改编版.该技术依赖于在图像中放置一个 24x24 像素的子帧,然后在其中的每个位置以各种可能的尺寸放置矩形特征。
这些特征可以由两个、三个或四个矩形组成。下面给出了示例。
他们声称详尽的集合超过 180k(第 2 部分):
Given that the base resolution of the detector is 24x24, the exhaustive set of rectangle features is quite large, over 180,000 . Note that unlike the Haar basis, the set of rectangle features is overcomplete.
以下陈述未在论文中明确说明,因此它们是我的假设:
基于这些假设,我计算了详尽的集合:
const int frameSize = 24;
const int features = 5;
// All five feature types:
const int feature[features][2] = {{2,1}, {1,2}, {3,1}, {1,3}, {2,2}};
int count = 0;
// Each feature:
for (int i = 0; i < features; i++) {
int sizeX = feature[i][0];
int sizeY = feature[i][1];
// Each position:
for (int x = 0; x <= frameSize-sizeX; x++) {
for (int y = 0; y <= frameSize-sizeY; y++) {
// Each size fitting within the frameSize:
for (int width = sizeX; width <= frameSize-x; width+=sizeX) {
for (int height = sizeY; height <= frameSize-y; height+=sizeY) {
count++;
}
}
}
}
}
结果是162,336。
我发现接近 Viola & Jones 所说的“超过 180,000”的唯一方法是放弃假设 #4 并在代码中引入错误。这涉及将四行分别更改为:
for (int width = 0; width < frameSize-x; width+=sizeX)
for (int height = 0; height < frameSize-y; height+=sizeY)
结果是 180,625。 (请注意,这将有效地防止特征触及子框架的右侧和/或底部。)
当然还有一个问题:他们在实现过程中犯了错误吗?考虑具有零曲面的特征是否有意义?还是我看错了?
最佳答案
仔细一看,您的代码在我看来是正确的;这让人想知道原作者是否有一个错误。我猜有人应该看看 OpenCV 是如何实现它的!
尽管如此,一个更容易理解的建议是先遍历所有大小,然后遍历给定大小的可能位置,从而翻转 for 循环的顺序:
#include <stdio.h>
int main()
{
int i, x, y, sizeX, sizeY, width, height, count, c;
/* All five shape types */
const int features = 5;
const int feature[][2] = {{2,1}, {1,2}, {3,1}, {1,3}, {2,2}};
const int frameSize = 24;
count = 0;
/* Each shape */
for (i = 0; i < features; i++) {
sizeX = feature[i][0];
sizeY = feature[i][1];
printf("%dx%d shapes:\n", sizeX, sizeY);
/* each size (multiples of basic shapes) */
for (width = sizeX; width <= frameSize; width+=sizeX) {
for (height = sizeY; height <= frameSize; height+=sizeY) {
printf("\tsize: %dx%d => ", width, height);
c=count;
/* each possible position given size */
for (x = 0; x <= frameSize-width; x++) {
for (y = 0; y <= frameSize-height; y++) {
count++;
}
}
printf("count: %d\n", count-c);
}
}
}
printf("%d\n", count);
return 0;
}
与前面的162336
为了验证它,我测试了 4x4 窗口的情况并手动检查了所有情况(很容易计数,因为 1x2/2x1 和 1x3/3x1 形状相同,只是旋转了 90 度):
2x1 shapes:
size: 2x1 => count: 12
size: 2x2 => count: 9
size: 2x3 => count: 6
size: 2x4 => count: 3
size: 4x1 => count: 4
size: 4x2 => count: 3
size: 4x3 => count: 2
size: 4x4 => count: 1
1x2 shapes:
size: 1x2 => count: 12 +-----------------------+
size: 1x4 => count: 4 | | | | |
size: 2x2 => count: 9 | | | | |
size: 2x4 => count: 3 +-----+-----+-----+-----+
size: 3x2 => count: 6 | | | | |
size: 3x4 => count: 2 | | | | |
size: 4x2 => count: 3 +-----+-----+-----+-----+
size: 4x4 => count: 1 | | | | |
3x1 shapes: | | | | |
size: 3x1 => count: 8 +-----+-----+-----+-----+
size: 3x2 => count: 6 | | | | |
size: 3x3 => count: 4 | | | | |
size: 3x4 => count: 2 +-----------------------+
1x3 shapes:
size: 1x3 => count: 8 Total Count = 136
size: 2x3 => count: 6
size: 3x3 => count: 4
size: 4x3 => count: 2
2x2 shapes:
size: 2x2 => count: 9
size: 2x4 => count: 3
size: 4x2 => count: 3
size: 4x4 => count: 1
关于algorithm - Viola-Jones 的人脸检测声称拥有 18 万个特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1707620/
这是有关的Viola-Jones算法(用于面部检测)的问题,如此处所述 http://en.wikipedia.org/wiki/Viola%E2%80%93Jones_object_detectio
我刚刚开始研究 Viola-Jones 人脸检测算法来设计人脸识别系统。根据我所了解的所有内容,我对“像素总和”这个短语感到困惑。是指给定像素点的颜色总和还是给定像素点的距离总和? 最佳答案 通常,如
请用几句话向我解释一下 Viola-Jones 人脸检测方法的工作原理。 最佳答案 Viola-Jones 检测器是一个强大的二元分类器构建了几个弱探测器 Each weak detector is
我正在实现 Viola-Jones 人脸检测器来检测静止图像中的人脸,它对于与我的训练尺寸相同的图像非常有效。但是我不知道人脸检测器如何处理多种尺寸的人脸? 如果我的图像的训练大小是 24*24 并且
我正在尝试在 OpenCV 中使用 Viola–Jones 人脸检测算法。我使用 detectMultiScale() 来定位图像中的多个面孔。我想知道如何从源代码返回或计算所计算面部的置信度。似乎默
我在理解 Viola Jones algorithm 的训练阶段时遇到问题. 据我所知,我用伪代码给出了算法: # learning phase of Viola Jones foreach feat
据说“4916 个正面训练示例经过手工挑选对齐、归一化并缩放到 24x24 的基本分辨率。通过从 9500 张不包含人脸的图像中随机挑选子窗口来选择 10,000 个负面示例。”在论文“Paul Vi
我尝试从面部数据库中提取面部特征,但我发现 Viola-Jones 算法在两种情况下效果不佳*: 当我尝试单独检测眼睛时, 当我尝试检测嘴巴时。 *效果不佳:将图像的不同部分检测为眼睛或嘴巴。或者有时
我正在努力理解 Viola Jones 方法,而且我基本上已经掌握了它。 它使用简单的类似 Haar 的特征提升到强大的分类器中并组织成层/级联以实现更好的性能(不用理会明显的“非对象”区域)。 我想
我看过很多关于 Viola-Jones 算法真正工作原理的文章和问题的答案。我一直在寻找答案,说某个区域的“像素总和”减去相邻区域的“像素总和”。我对“像素总和”的含义感到困惑。值(value)依据是
我已经阅读了 2004 年的 viola 论文。在 3.1 中,他们解释了阈值计算。但我非常困惑。它读作 For each feature, the examples are sorted based
我一直在实现 Viola-Jones' face detection algorithm 的改编版.该技术依赖于在图像中放置一个 24x24 像素的子帧,然后在其中的每个位置以各种可能的尺寸放置矩形特
我读了很多关于 Viola Jones 方法的文章,但我仍然不明白矩形特征中的“弱分类器”、“强分类器”、“子窗口”,它们的定义是什么。那么“阈值”呢?我如何知道阈值?谁能帮我?谢谢之前 最佳答案 A
我正在尝试使用 OpenCV 中的 Haar 级联检测图像中的特定对象。 假设我对检测风景图像中的 parking 标志感兴趣。在为我的训练集定义正图像样本时,哪种图像是最好的图像:(a) 包含我的对
我现在正在比较用纯 C 代码编写的代码和使用 openCV 函数 cvHaarDetectObjects() 的代码之间的 Viola-Jones 代码的时间性能。 到目前为止,用纯C代码检测人脸的时
我想通过并行提取检测到的人脸来加速 Viola-Jones,我使用了这段代码,但是 For Each 语句中的人脸参数有一个错误,你能告诉我如何解决这个错误吗?错误是 (Error 2 The typ
我正在使用 Viola 和 Jones 算法在 C 中实现功能性人脸检测算法。我无法理解 Adaboost 来训练强大的分类器。 我可以检测单个图像中的所有 5 个基本 haar 特征(24x24 图
我正在尝试了解 Viola-jones 人脸检测算法。在论文中,他们提到在 24x24 像素的图像中可以有 160k 以上的 haar 特征。 我正在努力理解如何确定弱分类器。例如,如果我有 10k
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我正在尝试用 C++ 实现 P. Viola 和 M. Jones 检测框架(一开始只是简单的序列分类器 - 不是级联版本)。我认为我已经设计了所有必需的类和模块(例如积分图像、Haar 特征),尽管
我是一名优秀的程序员,十分优秀!