机器学习之Haar特征

参考博客:
http://blog.csdn.net/xiaowei_cqu
https://blog.csdn.net/lanxuecc/article/details/52222369

最早的Haar特征由Papageorgiou C.等提出(《A general framework for object detection》),后来Paul Viola和Michal Jones提出利用积分图像法快速计算Haar特征的方法(《Rapid object detection using a boosted cascade of simple features》)。之后,Rainer Lienhart 和 Jochen Maydt用对角特征对Haar特征库进行了扩展(《An extended set of Haar-like features for rapid object detection》)。OpenCV的Haar分类器就是基于扩展后的特征库实现的。

Haar特征/矩形特征

  Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、中心特征和对角线特征用黑白两种矩形框组合成特征模板,在特征模板内用 黑色矩形像素和 减去 白色矩形像素和来表示这个模版的特征值。
  例如:脸部的一些特征能由矩形模块差值特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定方向(水平、垂直、对角)上有明显像素模块梯度变化的图像结构。


这里写图片描述
图1 特征模板

如上图A、B、D模块的图像Haar特征为:v=Sum白-Sum黑
C 模块的图像Haar特征为:v=Sum白(左)+Sum白(右)-2*Sum黑
这里要保证白色矩形模块中的像素与黑色矩形的模块的像素数相同,所以乘2
   对于一幅图像来说,可以通过通过改变特征模板的大小和位置,可穷举出大量的特征来表示一幅图像。上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。例如在24*24大小的图像中可以以坐标(0,0)开始宽为20高为20矩形模版计算上图A特征,也可以以坐标(0,2)开始宽为20高为20矩形模版计算上图A特征,也可以以坐标(0,0)开始宽为22高为22矩形模版计算上图A特征,这样矩形特征值随着类别、大小和位置的变化,使得很小的一幅很小的图像含有非常多的矩形特征。矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数。


首先清楚两点:

图像大小为24*24,特征图1(a)大小为2*1 (宽 *高)
1、对于这种情况,水平可滑动23步,垂直可以滑动24步,所以共有23*24个特征。
2、对于一个特征,特征本身沿水平、竖直方向分别缩放。
还看特征1(a),特征大小为2*1,则延水平方向可放大为:4*1,6*1,8*1,…,24*1;竖直方向可放大为:2*1,2*2,2*3,…,2*24。即每个特征有XY种放大方式。(!放大的矩形特征并限制保持2:1的比例!


用Haar-like提取特征

首先介绍一下Haar-like特征。如下图所示,Haar-like特征是很简单的,无非就那么几种,首先介绍论文《Rapid Object Detection using a Boosted Cascade of Simple Features》中提到的三种特征,分为两矩形特征、三矩形特征、对角特征。当然还有很多分类方法,这里先不介绍,下面再继续讲。先介绍如何计算特征。
这里写图片描述
计算特征很简单,就是拿黑色部分的所有的像素值的和减去白色部分所有像素值的和。得到的就是一个特征值。
说的很简单,但是在工程中需要进行快速计算某个矩形内的像素值的和,这就需要引入积分图的概念。
(1)、使用积分图加速计算特征
需要注意的是这里的积分图输入的图像是经过归一化的图像哈。与上面用到的符号不一样了。

首先给出积分图的定义:

这里写图片描述

上述含义是指在位置(x,y)(x,y)上,对应的积分图中的像素为该位置的左上角所有的像素的之和。
那么我们实现的时候是如何进行计算积分图的呢?
s(x,y)=s(x,y−1)+i(x,y)
ii(x,y)=ii(x−1,y)+s(x,y)

初始值s(x,−1)=0,ii(−1,y)=0s(x,−1)=0,ii(−1,y)=0.
  上面这两个递归公式是什么意思呢?就是首先每一行都递归计算s(x,y)(公式中也可以看出是按行计算的),每一行首先都是计算s,计算完毕之后在每一列都计算ii(x,y)。这样扫描下去就可以计算好了积分图了。这种方法跟动态规划的思想有点类似。

好了计算好了积分图,我们接下来就可以利用积分图来加速计算某个方块内部的像素的和了。

计算方块内的像素和


这里写图片描述
图2 计算某个方块内的像素和

  图中的大框是积分图,为了讲解如何计算任意矩形内的像素值,我们画出四个区域A、B、C、D,并且图中有四个位置分别为1、2、3、4。我们要计算D区域内部的像素和该怎么计算?

我们记位置4的左上的所有像素为rectsum(4)rectsum(4),那么
D位置的像素之和就是rectsum(1)+rectsum(4)−rectsum(2)−rectsum(3)rectsum(1)+rectsum(4)−rectsum(2)−rectsum(3)。
是不是有了积分图,就可以很快地计算出了任意矩形内的像素之和了?
我们前面提到有三种类型的Haar-like特征。
其中二矩形特征需要6次查找积分图中的值,而三矩形特征需要8次查找积分图中的值,而对角的特征需要9次。

提取的特征的个数有多少?

那么,如果给定一个窗口,窗口的大小为24*24像素,那么我们得到的特征有多少个呢?
计算公式如下:
可以参考本文的第一幅图中的ABCD个特征那幅图。
该部分未完待续!!!

使用Adaboost进行训练

该部分未完待续!!!

其他一些参数的确定

如何确定有多少个级联的分类器,有多少个特征,阈值如何确定的。

扫描窗口的时候的缩放如何确定

合并检测出的多个窗口

补充说明

Haar-like特征的分类(Haar-like特征的变种)

猜你喜欢

转载自blog.csdn.net/weixin_39540045/article/details/80547706