HOG特征描述 html
首先咱们来了解一下HOG特征描述子。 算法
HOG特征描述子(HOG descriptors)是由Navneet Dalal和 Bill Triggs在2005年的一篇介绍行人检测方法的论文提到的特征描述子(论文以及演讲可参见参考资料一、2)。 数组
其主要思想是计算局部图像梯度的方向信息的统计值,来做为该图像的局部特征值。 ide
- 如上图,归一化图像后,因为颜色数据对咱们没有帮助,因此将图片转为灰度图。
- 而后将图片分割成必定“块”数,称做细胞单元。
- 计算每一个细胞单元的梯度大小方向。
- 获得每一个单元的梯度方向组成一个图片的特征向量。
- 将这个特征向量交给SVM来学习或辨认。
SVM的简单介绍能够参考:OpenCV 2.4+ C++ SVM文字识别。 函数
算法分析 学习
OpenCV 2.4+ C++ 边缘梯度计算中,介绍了Sobel算子和Scharr滤波器的梯度计算方法,可是论文做者使用这些复杂方法的效果并很差,最好的是使用简单的一维梯度算子:[-1, 0, 1],进行卷积计算,分别算出x方向梯度Gx与y方向梯度Gy。而后利用下面两个公式计算梯度大小和方向: ui
![]()
![]()
论文做者使用了高斯模糊进行平滑处理,结果效果变差了。其可能缘由是:许多有用的图像信息是来自变化剧烈的边缘,而在计算梯度以前加入高斯滤波会把这些边缘滤除掉。 spa
- 细胞的统计方向,由细胞中的每个像素点投票取得。
- 票箱是0 - PI(无向)角度范围平分为9个角度,即PI/9为每一个票箱的角度范围。
- 每一个投票像素点的投票权重,由其梯度幅值计算出来,可采用幅值自己(实验效果最佳),或者他的函数来表示这个权重。
局部关照变化或者前景和背景的对比变化,可能使梯度强度产生剧烈变化,但咱们关注的不是这些信息,因此须要对这些信息弱化处理。利用数个细胞单元组成空间上连通的块。这样,HOG描述就成了由各个块全部细胞单元的直方图组成的一个向量,这些区域是互相重叠的。这样就减少了这些剧烈变化的影响。 .net
每一个细胞是8*8个像素点,以四个细胞组成一个块。 code
再由块组成检测窗。
最后是利用L2-norm或者L1-norm进行归一化。
设v是未被归一化的向量,| vk |是k阶范数,ε为任意小常数,当k=2时,L2-norm为:
![]()
当k=1时,L1-norm为:
![]()
还有一种归一化方式L2-Hys:
首先进行L2-norm,而后进行截短(即值被限制为v - 0.2v之间),而后再归一化。
HOGDescriptor API
gpu::HOGDescriptor::HOGDescriptor
建立HOG描述符和检测器。
C++: gpu:: HOGDescriptor::HOGDescriptor(Size win_size=Size(64, 128), Size block_size=Size(16, 16), Size block_stride=Size(8, 8), Size cell_size=Size(8, 8), int nbins=9, double win_sigma=DEFAULT_WIN_SIGMA, double threshold_L2hys=0.2, bool gamma_correction=true, int nlevels=DEFAULT_NLEVELS)
参数
- win_size – 检测窗大小。须要和块的大小、步长匹配。
- block_size – 块的大小。须要和细胞大小匹配。目前只支持(16,16)的大小。
- block_stride – 块的步长,必须是细胞大小的整数倍。
- cell_size – 细胞大小。目前只支持(8, 8)的大小。
- nbins – 投票箱的个数。目前只支持每一个细胞9个投票箱。
- win_sigma – 高斯平滑窗口参数。
- threshold_L2hys – L2-Hys归一化收缩率。
- gamma_correction – 伽马校订预处理标志,须要或不须要。
- nlevels – 检测窗口的最大数目。
gpu::HOGDescriptor::getDescriptorSize
返回分类所需的系数的数目。
C++: size_t gpu:: HOGDescriptor::getDescriptorSize() constgpu::HOGDescriptor::getBlockHistogramSize
返回块直方图的大小。
C++: size_t gpu:: HOGDescriptor::getBlockHistogramSize() constgpu::HOGDescriptor::setSVMDetector
设置线性SVM分类器的系数。
C++: void gpu:: HOGDescriptor::setSVMDetector(const vector<float>& detector)gpu::HOGDescriptor::getDefaultPeopleDetector
返回人的分类训练检测(默认的窗口大小)的默认系数。
C++: static vector<float> gpu:: HOGDescriptor::getDefaultPeopleDetector()gpu::HOGDescriptor::getPeopleDetector48x96
返回人的分类训练检测(48*96窗口大小)的系数。
C++: static vector<float> gpu:: HOGDescriptor::getPeopleDetector48x96()gpu::HOGDescriptor::getPeopleDetector64x128
返回人的分类训练检测(64*128窗口大小)的系数。
C++: static vector<float> gpu:: HOGDescriptor::getPeopleDetector64x128()gpu::HOGDescriptor::detect
在没有多尺度的窗口执行对象检测
C++: void gpu:: HOGDescriptor::detect(const GpuMat& img, vector<Point>& found_locations, double hit_threshold=0, Size win_stride=Size(), Size padding=Size())
Parameters:
- img – 源图像。只支持CV_8UC1和CV_8UC4数据类型。
- found_locations – 检测出的物体的边缘。
- hit_threshold – 特征向量和SVM划分超平面的阀值距离。一般它为0,并应由检测器系数决定。可是,当系数被省略时,能够手动指定它。
- win_stride – 窗口步长,必须是块步长的整数倍。
- padding – 模拟参数,使得CUP能兼容。目前必须是(0,0)。
gpu::HOGDescriptor::detectMultiScale
在多尺度窗口中执行对象检测。
C++: void gpu:: HOGDescriptor::detectMultiScale(const GpuMat& img, vector<Rect>& found_locations, double hit_threshold=0, Size win_stride=Size(), Size padding=Size(), double scale0=1.05, int group_threshold=2)
参数
- img – 源图像。只支持CV_8UC1和CV_8UC4数据类型。
- found_locations – 检测出的物体的边缘。
- hit_threshold – 特征向量和SVM划分超平面的阀值距离。一般它为0,并应由检测器系数决定。可是,当系数被省略时,能够手动指定它。
- win_stride – 窗口步长,必须是块步长的整数倍。
- padding – 模拟参数,使得CUP能兼容。目前必须是(0,0)。
- scale0 – 检测窗口增加参数。
- group_threshold – 调节类似性系数的阈值。检测到时,某些对象能够由许多矩形覆盖。 0表示不进行分组。
gpu::HOGDescriptor::getDescriptors
返回整个图片的块描述符。
C++: void gpu:: HOGDescriptor::getDescriptors(const GpuMat& img, Size win_stride, GpuMat& descriptors, int descr_format=DESCR_FORMAT_COL_BY_COL)
参数
- img – 源图像。只支持CV_8UC1和CV_8UC4数据类型。
- win_stride – 窗口步长,必须是块步长的整数倍。
- descriptors – 描述符的2D数组。
- descr_format –
描述符存储格式:
- DESCR_FORMAT_ROW_BY_ROW - 行存储。
- DESCR_FORMAT_COL_BY_COL - 列存储。
这个函数主要用于分类学习。
检测代码
这段代码虽然能够检测出行人,可是可能会出现,一我的身上有几个框框。例以下图左边的行人:
因此咱们须要对found进行筛选,把那些被嵌套的长方形去除。
PS:输入图片不能比检测窗还小,这样会抛出错误的。
参考资料
Histograms of Oriented Gradients for Human Detection . Navneet Dalal & Bill Triggs . 2005
Histograms of Oriented Gradients for Human Detection Talk . Navneet Dalal & Bill Triggs
OpenCV HOGDescriptor 参数图解 . Excalibur . 2011-03-11