物体检测
总览
给定图像或者视频序列,定位感兴趣的对象的所有实例。该问题对应于确定包围对象 (enclose the objects) 的图像或视频序列中的区域,通常是最小的矩形边界框 (smallest rectangular bounding boxes)。
要求对于 视点,比例,明度,遮挡和姿势 (viewpoint, scale, illumiation, occlusion, pose) 都具有不变性。
流程
- 生成和选择区域 (图像块 patches)
- 在一定规模上进行对象识别 (object recognition)
- 合并多个重叠的正区域(overlapped positive regions)。
有两个策略:
生成区域 (Generation of Regions)
滑动窗口算法
在图像上滑动框或者窗口 (box or window) 已选择图像块 (patch)。这是对整个图像和不同比例的对象 (different scales) 的详尽搜索 (exhaustive search)。这可能会导致成千上万的图像补丁 (image patches)。
这种方法适用于固定宽高比 (aspect ratio) 的对象,比如人脸或者行人。
当我们搜索多个宽高比时,这个方法在计算上非常昂贵。
区域提案 (Region Proposal)
输出与图像中最有可能是对象的所有 图像块 相对应的边界框 (output bounding boxes)。
这些区域提案可能会带有噪声,重叠 (overlapping) 且可能无法完美地包含对象,但我们期望会有一个非常接近图像中的实际对象的提案。
区域提案算法 (Region Proposal Algorithms) 使用 分割 (Segmentation) 来识别图像中的预期对象 (prospective objects)。
选择性搜索是通用算法之一。
选择性搜索 (Selective Search)
该方法根据颜色,纹理,大小和形状兼容性(color, texture, size and shape)计算相似区域的层次分组 (hierarchical grouping)。建立在过度分割(oversegments)之上。
从 过度分割 开始,反复执行以下操作:
- 将 分割片段(segmented part) 相对应的所有边界框 (bounding box) 添加到 区域提案 中。
- 根据相似度将相邻的片段(adjacent segments)分组。
相似度 (similarity)
-
颜色相似度 (color similarity): 有一个每个通道带有25个bin的颜色直方图,每个区域 25 x 3 = 75-D 颜色描述符(color descriptor)。
-
纹理相似度 (texture similarity): 每个通道在8个方向 (8 orientation) 上的高斯导数 (Gaussian derivatives)。每个方向和每个颜色通道的 10 bin 直方图,每个区域 10 x 8 x 3 = 240-D 特征描述符 (feature descriptor)。
-
尺寸相似度 (size similarities): 鼓励更小的区域更早进行合并。
其中 size(im) 是 图中像素的多少。 -
形状兼容性 (shape compatibility):
其中 size(BBij) 是 覆盖两个区域的边界框的大小。 -
最终相似度 (Final similarity): 𝑎𝑖 ∈ [0,1.0]
结果:
面部检测 (Face Detection)
基于皮肤的面部检测 (Skin-based face detection)
肤色 (skin tone) 可以通过两种方式用于面部检测:
- 分割 (segmentation): 为了减少搜索空间,加快检测速度,但与实际的面部检测器 (face detector) 无关 (更常用)。
- 检测 (Detection): 作为直接用于检测的特征。
皮肤可能性 (Skin Likelihood)
皮肤颜色的统计值:
YCbCr的皮肤可能图:
步骤
- 根据颜色检测皮肤区域
- 删除小区域 (形态学开操作 Morphological opening)
- 查找所有区域的长宽比 (连接组件分析和标记 connected component labelling),并仅保留特定的比例,其他的去除。
- 剩余的区域 (Remaining regions) 便被分类为人脸。
结果:
优点
- 高效且容易实现。
- 不需要或仅需要一点点训练。
- 能够在低分辨率或者模糊图像上工作。(不需要面部细节)
- 反转不变性 (rotation-invariant)。
缺点
- 对明度 (illumination) 和颜色平衡 (color balance) 敏感。
- 低准确率 - 会匹配到身体其他部位或者其他肉色的物体。
- 需要有颜色的图片。
Viola & Jones面部识别
该方法使用模式分类(pattern classification approach)
特征:矩形的 “Haar-like” 特征。
分类器:多个"弱"分类器 (weak classifier) 的组合。
Harr-like 特征
Haar-like特征编码强度差异(intensity differences)。特征值是白色和黑色区域之间的像素差之和。缩放到不同大小并在子窗口中的所有可能位置进行测试。
为全局照度不变 (global illumination invariance) 而标准化的子窗口 (sub-windows)。
下图应用了所有四个 Haar-like 特征,所有位置和大小。
其产生了大量特征值,24 x 24 的大小有 180000个值。
这些被输入到分类器(而不是原始像素点)。
简单特征分类器
简单的"stump"分类器使用单个特征并对其设置阈值。
这样的分类器可能有很多 (每个特征值一个,即 2x108),需要一种方法来选择最佳分类器。
于是这就引出了AdaBoost。
AdaBoost
对大数量的弱分类器 (weak classifier) 组合并加权从而形成更加准确的强分类器 (strong classifer)。
两个目的:
- 特征选择 (feature selection):通过重新加权 (re-weighting) 的方式,从可能的stump分类器 (特征) 中选择最合适的子集 (subset)。
- 分类器 (classifier):建造能够做出最终的 面部/非面部 决定 (face/non-face decision) 的强分类器。
原理:
现实生活中,规则都是组合使用的。
比如,苹果是:
- 圆形的。
- 通常是红的。
- 有可能会是绿的。
- 有苹果茎 (stem)。
因此,这些弱规则 (weak rule) 可以组合成为强规则 (strong rule)。
弱分类器是被一个一个选择出来的。准确性较高的分类器 (训练过程中) 的权重要比准确性较低的分类器更高 (通常使用logit函数)。
AdaBoost 训练
- 训练数千张面部和非面部的图片,所有图像均被裁剪并缩放为相同的大小 (如,24 x 24 像素)
- 在训练期间添加弱学习器 (weak learner) 可以减少训练误差 (training error)。
- 一些设计者会使用更复杂的弱学习器,例如使用多个特征的树分类器 (tree classifiers)。
AdaBoost一个一个选择 弱分类器(特征) ,并先后针对较“难”的样本 (difficult samples) 进行分类
- 初始化样本权重 (initialise sample weights)。
- 重复M轮:
1. 训练所有可能的弱学习器,并选择其中拥有最低的权重误差。
2. 基于弱学习器的输出,更新并重新规范化 (update and re-normalise) 样本的权重。 - 输出作为 弱分类器的和 的最终强分类器。
实验者训练了多个强分类器,所有都必须被通过才证明目标图片是张脸。
初始化 (Initialization)
给定图片 (x1, y2), …, (xn, yn),其中 yi = 0 或 1 分别代表了负样本(非脸)和正样本(脸)。所有的图片都被裁剪并缩放 (cropped and scaled) 为相同的大小 (如,24 x 24 像素)。
初始化权重
其中,m 是负样本的总数,l 是正样本的总数。
迭代 (Iteration)
对于 t = 1, …, T :
- 规范化权重,使 wt 成为可能性的分布。
- 对于每个特征 j,训练限于单个特征的分类器 hj。其中,误差通过以下方式验证
- 选择带有最低误差的分类器 hi。
- 更新权重
其中若 xi 被分类正确了,则 ei = 0。否则 ei = 1。
强分类器
最终的强分类器是:
分类
一个子窗口 (sub-window) 在图片的不同分辨率中去扫描,并在每个地方使用分类器。每一个子窗口都会对脸和非脸进行分类。
合并检测 (Merging Detection)
在检测的过程中,多个检测通常会同时出现在附近的比例和空间位置(nearby scale and spatial locations)。合并算法 (merging algorithm) 会将其结合起来,通常是基于相近度 (proximity),重叠的比例 (percentage of overlap) 等。
单个的,远离其他的检测通常都是假阳性 (false positive) 的,如下图右上角。
Adaboost 算法提速
- 使用整体图像表示 (integral image representation) 的Haar-like特征能被计算得更快。
- 可以使用 注意级联(attentional cascade) 来加快分类速度。
整体图像表示
整体图像是一个新图像,其中每个像素都是原始图像中其上方和左侧的像素之和。
通过用内存交换速度,来加速 Haar-like特征的计算。
单通计算,其允许在 整体图像 中仅仅使用并计算矩形四个角。
级联分类器
整个分类器从简单分类器开始,该分类器 检测几乎所有正样本时拒绝了许多预测的阴性结果。
第一个分类器的阳性结果会触发第二个 (更复杂的) 分类器的评估,并以此类推。
任何时候的阴性结果都会导致分类立即完成。
将分类器依照 复杂度增加 (more complex) ,以及拥有更低假阳率 (lower false positive) 的 顺序链接起来。
调整弱学习器的阈值来最小化假阴性。
如,一个单特征分类器能够有 100% 的 真阳率 以及 50% 的假阳率。
接着,一个五特征分类器能够有 100% 的真阳率 以及 40% 的假阳率 (和上述的累积起来就是 20%)
最后,一个二十特征分类器能够有 100% 的真阳率 以及 10% 的假阳率 (累积起来 2%)
明显的面部特征
- 特征从最重要到最不重要
- 通常是眼睛和眉毛,然后是鼻子,然后是脸部其余部分
- 低空间频率 (low spatial frequency) 到高空间频率(“粗粒度到细粒度 coarse to fine”)
- 大多数基于外观的面部检测器 (appearance-based face detector) 都遵循相同的顺序。
优点
- 高准确性。
- 高效。
- 能在灰度图中工作。
缺陷
- 需要长时间的训练流程。
- 变化的分类时间 (variable classification)。
- 对姿态敏感 (sensitive to pose)。
结果
左边均为基于皮肤面部检测,右边均为Viola & Jones的方法。
挑战
- 低质量或低分辨率图像
- 被其他物体遮挡 (occlusion by foreign objects)
- 照明变化(或相机设置)
- 面部表情 (facial expression)
- 姿势(平面内 in-plane 和平面外 out-of plane 旋转)
人体检测模型 (Human Detection Model)
通常是基于滑动窗口 (sliding window based) 来进行检测。
我们需要进行预处理,如可以在候选提取 (candidate extraction) 之前应用图像滤波 (image filtering),以增强输入图像/视频序列的质量。
定向梯度直方图 (Histogram of oriented gradients)
使用局部梯度 (local gradient) 来代表正样本和负样本。
方法
- 先将图片转为灰度图。接着,对于每一个像素点,计算其梯度 (gradient),方向 (direction) 和强度 (magnitude)。通过和该像素点的直接邻点来计算,像素点往哪个方向变得更暗了。
- 重复步骤1的操作给所有的像素点,我们将会得到一张被箭头替换了像素点的图片,这些箭头被称为 梯度。这么做的好处是,当我们直接分析像素,同一个人的在亮处和暗处的像素值会很不一样。如果只是考虑亮度变化的方向,那么亮图和暗图将会有差不多的表示。
- 接着,为了减少梯度的数量,我们将整幅图片分为许多 16x16像素的块。在这些块,我们统计在主要的方向有多少梯度点。将最强的箭头方向替代当前的块。
- 为了在HOG图中找到面部,我们能做的就是从训练集中的其他脸部图片寻找和我们当前图片最接近的已知HOG模式。
使用HOG检测人体
-
Normalize Gamma & colour: 高斯平滑 + Gamma规范化。实际上,效果很小(约1%),同时需要一些计算时间。
-
compute gradient (计算梯度)
得出x方向梯度:
得出y方向梯度
得出梯度强度和方向
-
在 8x8 空间单元(spatial cells)上累积权重投票(weight vote)。8 x 8 x 3 = 192个像素。梯度方向被分成了 9 个bins (0, 20, 40, 60, …, 160 度)。中间的图是该RGB块和用箭头代表的梯度。右边的图是指用数字代表的该块的梯度和方向。
如上图,梯度方向为80,则表示在直方图80的位置加上该点的梯度强度值。而当梯度方向为10 (在 0 - 20度正中间),则分别在直方图的0和20处加上该点的梯度强度 4 / 2 = 2。
而当方向为165度,更接近160度而远离180度(0)。则其梯度强度85被分为 63.75和21.25分别分配给160和0。
最终结果如上图。 -
图像的梯度对整体光照敏感。为了使描述符独立于照明变化。直方图在 16x16块上被“归一化 normalized”,使其不受光照变化 (lighting variations) 影响。
-
计算整个图片块的最终特征向量(final feature vector)。在一张 64 x 128 的图片块中,我们有多少个 16 x 16 像素块。水平方向有 7 个位置,垂直方向有 15 个位置。总共 7 x 15 = 105 个位置。每个 16 x 16 的向量由 36 x 1 的向量代表。因此我们将105个向量都放到同一个大向量中 (36 x 105 = 3780维向量)