opencv笔记--HOGDescriptor

    特征描述提取图像区域上有用信息而忽略无用信息,不同目标下有用信息与无用信息定义不同。这里提取的有用信息用于分类器输入并期望产生正确的分类。

    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<Rect>& foundLocations:输出检测行人矩形区域;
          vector<double>& foundWeights:输出检测行人置信度;
          double hitThreshold:线性分类器  中  取值,提升正类可信度;
          double scale:计算其他检测尺度,当 scale 越趋近 1,形成更多检测尺度,检测越细致;
          double finalThreshold:丢弃置信度小于 finalThreshold 区域;
    opencv 提供 samples peopledetect 给出了行人检测的使用示例,我修改了参数 hitThreshold = .3 以提升正类可信度,检测结果如下:
        
 

 

参考资料 https://www.learnopencv.com/histogram-of-oriented-gradients/

               https://docs.opencv.org/2.4.10/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html#introductiontosvms

posted @ 2020-07-23 17:01  罗飞居  阅读(2486)  评论(0编辑  收藏  举报