zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ubuntu配置jdk(收藏)
    ubuntu学习笔记-tar 解压缩命令详解(转)
    URL编码以及GET和POST提交乱码解决方案 (转)
    maven模块开发(转)
    Spring定时任务配置
    java调用webservice
    struts2 JSON 插件的使用
    Java 基础知识点滴(1)
    vscode语法报错
    无法加载文件 .ps1,因为在此系统中禁止执行脚本
  • 原文地址:https://www.cnblogs.com/luofeiju/p/13366846.html
Copyright © 2011-2022 走看看