了解 OpenCV LBP 实现

2023-11-24

我需要一些关于基于 LBP 的人脸检测的帮助,这就是我写这篇文章的原因。

我有以下与 OpenCV 上实现的人脸检测相关的问题:

  1. 在 lbpCascade_frontal_face.xml 中(来自 opencv):什么是 内部节点、叶值、树、特征等?我知道它们被使用 在算法中。但不明白每一个的意思 其中。例如,为什么我们采用某个特定特征而不是 其他针对特定阶段?我们如何决定哪个功能/ 节点选择?
  2. LBP_frontal_face_classifier.xml 中的特征值是什么?我 知道它们是 4 个整数的向量。但我应该如何使用这个 特征?我以为阶段 0 可以访问第一个功能,但是访问 不属于这种模式。此功能的访问模式是什么?

  3. 文献中的所有论文仅提供高层次的概述。他们的 描述主要包括邻域LBP计算 像素。但是这个 LBP 值是如何针对这些元素使用的 分类器?

  4. 积分图像如何帮助计算像素的 LBP 值? 我知道HAAR是如何使用的。我需要了解 LBP。

我读了一些论文、文章。但没有人清楚地描述基于 LBP 的人脸检测的工作原理或详细算法。如果有人想自己开发一个人脸检测程序,他应该遵循什么步骤——没有文档描述这一点。

如果可以的话请帮我解决这些问题。我会很感激。


我向您推荐我的own过去的回答稍微触及了这个主题,但没有解释 XML 级联格式。

让我们看一个fake,修改为clarity仅具有单级和三个功能的级联示例。

<!-- stage 0 -->
<_>
  <maxWeakCount>3</maxWeakCount>
  <stageThreshold>-0.75</stageThreshold>
  <weakClassifiers>
    <!-- tree 0 -->
    <_>
      <internalNodes>
        0 -1 3 -67130709 -21569 -1426120013 -1275125205 -21585
        -16385 587145899 -24005</internalNodes>
      <leafValues>
        -0.65 0.88</leafValues></_>
    <!-- tree 1 -->
    <_>
      <internalNodes>
        0 -1 0 -163512766 -769593758 -10027009 -262145 -514457854
        -193593353 -524289 -1</internalNodes>
      <leafValues>
        -0.77 0.72</leafValues></_>
    <!-- tree 2 -->
    <_>
      <internalNodes>
        0 -1 2 -363936790 -893203669 -1337948010 -136907894
        1088782736 -134217726 -741544961 -1590337</internalNodes>
      <leafValues>
        -0.71 0.68</leafValues></_></weakClassifiers></_>

过了一会儿....

<features>
  <_>
    <rect>
      0 0 3 5</rect></_>
  <_>
    <rect>
      0 0 4 2</rect></_>
  <_>
    <rect>
      0 0 6 3</rect></_>
  <_>
    <rect>
      0 1 4 3</rect></_>
  <_>
      <rect>
      0 1 3 3</rect></_>

...

我们先看一下stage的标签:

  • The maxWeakCount for a stage is the number of weak classifiers in the stage, what is called in the comments a <!-- tree --> and what I call an LBP feature.
    • 在这个例子中,第0阶段的LBP特征的数量是 3.
  • The stageThreshold is what the weights of the features must add up to at least for the stage to pass.
    • 在此示例中,阶段阈值是 -0.75.

转向描述 LBP 功能的标签:

  • The internalNodes are an array of 11 integers. The first two are meaningless for LBP cascades. The third is the index into the <features> table of <rect>s at the end of the XML file (A <rect> describes the geometry of the feature). The last 8 values are eight 32-bit values which together constitute the 256-bit LUT I spoke of in my earlier answer. This LUT is computed by the training process, which I don't fully understand myself.
    • 在此示例中,舞台的第一个特征引用矩形 3, 由四个整数描述 0 1 4 3.
  • The leafValues are the two weights (pass/fail) associated with a feature. Depending on the bit selected from the internalNodes during feature evaluation, one of those two weights is added to a total. This total is compared to the stage's <stageThreshold>. Then, bool stagePassed = (sum >= stageThreshold - EPS);, where EPS is 1e-5, determines whether the stage has passed or failed. The weights are also determined by the training process.
    • 在此示例中,第一个特征的失败权重是 -0.65 并且通过权重是 0.88.

最后,<feature>标签。它由一个数组组成<rect>包含 4 个描述特征几何形状的整数的标签。给定一个处理窗口(在您的情况下为 24x24),前两个整数描述其x and y整数像素offset在处理窗口内,接下来的两个整数描述了width and height评估 LBP 特征所需的 9 个子矩形中的一个。

本质上来说,一个标签<rect> ft.x ft.y ft.width ft.height </rect>位于处理窗口内pW.widthxpW.height检查人脸是否存在pW.xxpW.y对应于...

https://i.stack.imgur.com/NL0XX.png

为了评估 LBP,只需读取点处的积分图像即可p[0..15]并使用p[BR]+p[TL]-p[TR]-p[BL]计算九个子矩形的积分。这central子矩形 R4 与其他八个子矩形进行比较,从 R0 开始按顺时针方向,生成 8 位 LBP(这些位被打包 [msb 01258763 lsb])。

然后,将此 8 位 LBP 用作该特征的 (2^8 = 256) 位 LUT 的索引(<internalNodes>),选择单个位。如果该位为1,则该特征与人脸不一致;如果为0,则与人脸一致。合适的重量(<leafNode>)然后返回并与所有其他特征的权重相加以产生总体阶段总和。然后将其与<stageThreshold>以确定该阶段是否通过或失败。

如果还有什么我没有解释清楚的地方我可以澄清。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 OpenCV LBP 实现 的相关文章

  • 绘图:仅保留最相关的数据

    为了节省带宽并且不用自己生成图片 图表 我计划使用 Google 的图表 API http code google com apis chart http code google com apis chart 它的工作原理是简单地发出一个
  • Opencv中内存Mat表示

    我知道在内存中opencv将Mat对象表示为一个大数组 因此 如果我有 3 个尺寸为 200x200 的通道垫 那么在内存中它将将该垫存储在尺寸为 3x200x200 的数组中 或者更一般地说 内存中的任何 Mat 都将存储为channel
  • 如何在 Ubuntu 16.04 上安装适用于 Python 2.7 的 openCV 2.4.13?

    我尝试了很多在线帖子来安装 opencv 但它们不适用于 Ubuntu 16 04 有人可以给我安装 openCV 2 4 13 的步骤吗 我不久前制作了一个脚本 用于安装最新版本的 OpenCV 截至本答案的最后一次更新为 4 2 这是它
  • 良好的线性代数包[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在为一个项目实现一些谱图算法 其中很大一部分是查找大型稀疏矩阵以及乘法矩阵的特征值和特征向量 我的问
  • 在OpenCV Python中编写4通道以上图像

    这对我来说是一个持续的挑战 我正在尝试使用 openCV 将两个 3 RGB 图像组合成一个 6 通道 TIFF 图像 到目前为止我的代码如下 import cv2 import numpy as np im1 cv2 imread im1
  • 找到经过大多数点的直线的最有效算法是什么?

    问题 N 个点在二维平面上给出 同一个点上最多有多少个点straight line The problem has O N2 solution go through each point and find the number of poi
  • 将 RGB 转换为黑色或白色

    我如何在Python中获取RGB图像并将其转换为黑白图像 不是灰度 我希望每个像素要么是全黑 0 0 0 要么是全白 255 255 255 流行的 Python 图像处理库中是否有任何内置功能可以完成此任务 如果不是 最好的方法是循环遍历
  • 快速排序优化

    我正在学习排序算法 下一步 我试图让我的实现接近std sort 到目前为止我还很远 我有 3 个快速排序的实现 标准快速排序 使用临时数组 quicksort with following optimizations median3 用于
  • 如何在没有 OpenCv Manager 的情况下运行 OpenCV 代码

    我正在使用 OpenCV4Android 版本 2 4 10 并在 Samsung Galayx GT I9300 上测试我的代码 我遇到的问题是 我必须从 Play 商店下载 Opencv Manager 以便我的 opencv 代码运行
  • 如何随机打乱地图中的值?

    我有一个 std map 其中键和值均为整数 现在我想随机打乱地图 因此键随机指向不同的值 我尝试了 random shuffle 但它无法编译 请注意 我并没有尝试洗牌键 这对于地图来说没有意义 我正在尝试随机化这些值 我可以将这些值推入
  • 求从1到N的所有数字的数字之和[重复]

    这个问题在这里已经有答案了 问题 求1到N 包括两端 所有数字的数字之和 时间复杂度应该是 O logN 对于 N 10 总和为 1 2 3 4 5 6 7 8 9 1 0 46 对于 N 11 总和为 1 2 3 4 5 6 7 8 9
  • 在大文件中查找重复字符串

    一个文件包含大量 例如100亿 字符串 您需要查找重复的字符串 您有 N 个可用系统 您将如何找到重复项 埃里克森的答案可能是提出这个问题的人所期望的 您可以将 N 台机器中的每台机器用作哈希表中的一个存储桶 对于每个字符串 按顺序说出字符
  • 如何计算某物是否位于某人的视野中

    我有一个对象 它在 2D 空间中具有位置和速度 两者都由向量表示 对象的视野每侧均为 135 度 它看起来与移动的方向相同 速度矢量 我有一些对象 其在 2D 空间中的位置由向量表示 在图中 蓝色背景上的对象是可见的 红色背景上的对象对主体
  • 如何跟踪此对象图深度优先搜索算法中的深度?

    我有这段代码 它迭代一棵树 进行深度优先搜索 每个元素都只处理一次 非常好 void iterateOverTree TreeNode node NSMutableArray elements NSMutableArray array el
  • 附加信息:OpenCV:使用 c# 的不同大小的对象

    目前 我的 EmguCV c 代码面临问题 我试图从数据库中识别我的图像 但它不起作用 一旦检测到我的脸 它就会崩溃 然后会出现此错误 附加信息 OpenCV 不同大小的对象 我尝试寻找这个错误 但我一无所知 这是我的代码 Action f
  • 检测骰子的上侧

    是否可以检测骰子的上面 虽然从顶部看这将是一项简单的任务 但从许多角度来看 可以看到多个侧面 Here is an example of a dice feel free to take your own pictures 您通常想知道自己
  • 检查列表是否已排序的 Pythonic 方法

    有没有一种Python式的方法来检查列表是否已经排序ASC or DESC listtimestamps 1 2 3 5 6 7 就像是isttimestamps isSorted 返回True or False 我想输入一些消息的时间戳列
  • OpenCV非旋转图像拼接

    我正在 OpenCV 中进行图像拼接 从不同位置拍摄平面场景的照片并尝试构图全景图 我修改了缝合示例以满足我的需要 openCV 拼接管道的问题是 它假设相机纯粹旋转 但对我来说情况并非如此 当拍摄的照片与场景完全正交时 没有相机旋转 只是
  • 如何在python中访问矩阵每个元素的相邻单元格?

    这里 如果两个单元共享边界 则它们被认为是相邻的 例如 A 5 6 4 2 1 3 7 9 8 这里 索引 0 0 的相邻元素位于索引 0 1 和 1 0 处 索引 1 1 的相邻元素位于索引 0 1 1 0 2 1 处 和 1 2 假设你
  • 将这个 if-then 逻辑转换为布尔表达式?

    我在使这段代码更简洁 最好是单个布尔表达式 方面有点绞尽脑汁 这是我的代码 if d Unemployed if type Unemployed tmp Unemployed true else tmp Unemployed false

随机推荐