特征描述提取图像区域上有用信息而忽略无用信息,不同目标下有用信息与无用信息定义不同。这里提取的有用信息用于分类器输入并期望产生正确的分类。
HOG(Histogram of Oriented Gradient) 对图像块生成描述信息 vector,然后将每个图像块指定一个分类(-1, 1),通过大量训练得到一个线性分类器(SVM);针对新图像块首先生成描述 vector,在使用训练分类器对新的描述 vector 分类,实现图像分类。
HOG 首先应用在行人检测,opencv 中 HOGDescriptor 类已经给出了一个默认的分类器(HOGDescriptor::getDefaultPeopleDetector()),通过该分类器可实现图像中行人检测。
当需要对其他物体进行检测时,则需要自定义一个描述信息 vector, 训练分类器,最终实现特定图像分类。
这里首先学习默认描述信息 vector 的生成及分类:
1)行人检测默认图像块为 64 * 128,当需要检测其他尺寸下是否存在行人时,需要将其缩放到默认尺寸,如尺寸 100 * 200, 128 * 256… ,但检测长宽比总为 1:2 的区域;
2)计算图像梯度与梯度方向,形成梯度图与梯度方向图;
3)在 8 * 8 邻域内计算梯度方向直方图,计算方法如下图:
首先将梯度方向取值范围修改为 [0° ,180°),然后划分为 9 个 bins,使用加权方式填充梯度方向直方图;
4)将 16 * 16 邻域内的4个梯度直方图连接成 1 * 36 vector,并将其归一化处理;
以 8 * 8 的步长在 64 * 128 图像块上扫描图像,每次扫描形成一个 1 * 36 vector 并归一化,最终得到 7 * 15 * 36 = 3780 个元素的特征向量;
5)以 1 * 3780 vector 作为图像特征训练 SVM 分类器, SVM 分类器基本原理如下
寻找一个超平面 ,对于任意特征向量 X 可正确分类,W 可通过训练得到;
当训练完成后,针对新的特征向量,满足 为正类,满足 为负类;
在实际检测中,为了提升正类的可信度,可能使用 进行分类, 。
opencv 提供 HOGDescriptor 类已经训练好行人分类器(HOGDescriptor::getDefaultPeopleDetector()),下面对 HOGDescriptor 给出一些解释:
1) HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8),
cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1),
histogramNormType(HOGDescriptor::L2Hys), L2HysThreshold(0.2), gammaCorrection(true),
nlevels(HOGDescriptor::DEFAULT_NLEVELS)
以上代码构造 HOGDescriptor 对象,主要参数意义如下:
winSize:行人区域尺寸,在该尺寸上生成特征向量;对于大于该尺寸的行人,使用缩小到 winSize 尺寸以实现多尺度;应该注意的是,当行人尺寸较小时,无法通过放大到 winSize 尺寸实现检测;
cellSize:在 cellSize 区域上构造梯度方向直方图;
nbins:一个 cellSize 区域上形成梯度直方图的 bins;
blockSize: 梯度方向直方图归一化尺寸,对 2 * 2 cells 进行归一化;
blockStride:特征向量扫描步长,每次扫描增加 36 个特征点;
2)hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()) 设置默认行人分类器参数;
3)detectMultiScale()检测行人,主要参数如下:
vector
vector
double hitThreshold:线性分类器 中 取值,提升正类可信度;
double scale:计算其他检测尺度,当 scale 越趋近 1,形成更多检测尺度,检测越细致;
double finalThreshold:丢弃置信度小于 finalThreshold 区域;
opencv 提供 samples peopledetect 给出了行人检测的使用示例,我修改了参数 hitThreshold = .3 以提升正类可信度,检测结果如下:
参考资料 https://www.learnopencv.com/histogram-of-oriented-gradients/
手机扫一扫
移动阅读更方便
你可能感兴趣的文章