• 开篇HOG提取训练检测+样本制作


    利用HOG特征训练分类器说明文档-By miracled

    整体框架: 样本制作+训练+检测 - (vs2008 + opencv2.3.1 + libsvm(可换用svmlight需改动部分源代码))

    1. 样本制作:Make_Sample类

    1.1功能大致如下(如需要详细的介绍,请直接参看源码)

      Make_Sample() : 加载抠选参数可以采用这种方式,构造实例。

      Make_Sample(Size winSize,Point tl = Point(),double ratios = 1.0,int numPerPic = 1);

         winsize:指定抠选区域的大小

          tl:指定抠选窗口的左上顶点,如果为(-1,-1)则随机在输入图像有效区域内随机选取。

          ratios:指定输入图像的缩放比例,如果 <0则随机有效的比率。最大比率定义在make_sample.h中的MAXRATIOS中,可以自行修改。

          numPerPic:指定每张输入图片中输出样本的数量,为随机抠选选项。

      int Make(string root,string type,string savePath,void (*Proccess)(Mat& ) = 0);

          root:输入图片的路径。

          type:输入图片的格式。

          savePath:抠选样本保存的路径。

          void Process(Mat& image):图像的预处理函数,这个函数可以自行编写你的预处理过程。

         int Make(string parmFile, string savePath,void (*Proccess)(Mat& ) = 0);

          parmFile:抠选参数,形如

            G:/database/test/imagexx.jpg 0 0 128 64 1

            G:/database/test/366.jpg 0 0 128 64 1

            G:/database/test/1568.jpg 0 0 128 64 1

            G:/database/test/1939.jpg 0 0 128 64 1

            path (x,y) winSize ratios // 路径 左上顶点 窗口大小 缩放比例

            savePath:样本保存路径。

            void Process(Mat& image):自定义预处理函数。

    2. 训练

    2.1 HOG特征提取(使用前请参看后面的5个注意事项)

      bool initHogs(int num);

        功能:初始化训练参数

        num:提取样本的个数

      void DetectPacket(Mat& img,Mat& grad_ang);

        功能:计算输入图像img的角度和梯度,保存在grad_ang中

      void calculateHogs(Mat& grad_ang,Point tl);

        功能:计算一张大图中以tl为左上顶点检测窗口的HOG特征(为检测和寻找困难样本而设置)

        grad_ang:梯度和角度

        tl:检测窗口的左上顶点

      void calculateHogs(Mat& grad_ang,int ipic);

        功能:计算样本大小,第ipic个样本的HOG特征(为训练而设置)

        grad_ang:梯度和角度

        ipic:样本的编号。

      void saveHog(char *hpath,int label,bool iscls = false) const;

        功能:保存训练得到的hog特征

        hapth:保存的全路径

        label:保存的标签

        iscls:是否清除上次保存的结果,默认不清除,使用append写入。

      Mat getHogs() const { return vfeature; }

        功能:获取训练得到的hog特征

      float *getHogs(int ipic) const

        功能:获取索引为ipic的样本hog特征

      int FeatureLength() const { return parm.len; }

        功能:获取特征的维数

      int Height() const { return parm.height; }

        功能:获取检测窗口的高度

      int Width() const { return parm.width; }

        功能:获取检测窗口的宽度

    2.2使用hog特征需要注意的几点:

      1、只定义了9方向

      2、只定义L2归一化

      3、需要使用请解开//#define _GAMMA_COMPRESS_的注释

      4、高斯加权模板采用的16x16的如果block大小不是(16,16)则需要改动,请参看并修改static double* getGaussMask()函数

      5、提取前需要加载配置文件Hogcfg.ini

           128  

          height: 64

          block: 2

          cell: 8

          normt: 0  //这个参数预留,需要自己添加block归一化方法

    3. 训练分类器

    3.1获取训练数据

      void getTrainData(char *root, char *type, int label, char *matlab_data)

        功能:获取hog训练数据。

        root:当前训练样本位置

        type:训练样本格式

        label:训练样本标签

        matlab_data:训练样本保存名称

      注意:样本必须同检测窗口大小,并且具有相同的标签,例如

      getTrainData("G:/database/car_detect/pos4/",".jpg",1,"train.txt");

      getTrainData("G:/database/car_detect/neg4/",".jpg",-1,"train.txt"); 保存名称需要相同,不然需要自己黏贴    到一个文件中参与训练。

    3.2 训练

      step1:训练一轮

        训练方法主要有两种

      第一种:

        需要下载libsvm,使用其中的svm-train.exe文件

        已经打包到一起了,在根目录下找到training_bat.bat,将其中的train.txt修改成你的训练数据名字,双击运行training_bat.bat就可以直接训练一轮得到一个libsvm的model,想自己设定参数请参看svm-train-usage.txt,如何使用svm-train.exe文件。

      第二种:

        使用matlab训练,不过需要修改hog特征提取中的

        void saveHog(char *hpath,int label,bool iscls = false) const方法。然后将训练数据加载到matlab里训练就可以了。

    注:这里得到的libsvm-model都比较大,如果使用的是线性的model的话,使用void changeModel(char *modelname,char *newmodelname,int fealen)方法转化一下就可以得到一个比较小的model,

        modelname:libsvm的model,

        newmodelname:自定义保存model的名字,

        fealen:特征的维数,使用第二种方式训练的在matlab中转化可以参看源码(很简单的)。

      step2:搜索困难样本

        void findHardSample(char *modelname,char *hardroot,char *type,char *matlab_hard);

          功能:利用训练好的线性模型搜索困难样本集,将困难样本数据保存在matlab_hard中

          modelname:一个已训练好的线性mode

          hardroot:困难样本集路径

          type:样本扩展名

          matlab_hard:保存困难样本的文件名

    step2完成以后,挑选需要再次训练的困难样本与第一轮训练的数据合并,重复step1可以得到最终的分类器。

    3. 检测

      int detectCar(char *modelname,char *imfile);

        功能:检测一张图片中是否含有目标。

        modelname:分类器的路径

        imfile:图片的路径

    注意:

    1、显示结果请打开//#define _SHOW_DETECT_RESULT_前的注释

    2、关于多框的问题请调节,一下方法,具体如何调节请参看源码或网络

        //PostProcess(carRect,1);

                      PostProcess(carRect,2);

        //RemoveCoveredRectangles(carRect);

    使用注意事项:code供学习使用,本人测试能用于检测,但不保证没有任何bug。

    以上文档下载包已包含

    下载地址:http://pan.baidu.com/share/link?shareid=137019&uk=3104776594

  • 相关阅读:
    ASCII码表以及不同进制间的O(1)转换
    四则运算表达式的语法分析
    语法分析器初步学习——LISP语法分析
    ASC与HEX之间的转换
    字节存储数据
    进制之间的转换
    java多线程CountDownLatch
    java反射机制
    java注解
    使用javafx实现视频播放器
  • 原文地址:https://www.cnblogs.com/miracled/p/2497271.html
Copyright © 2020-2023  润新知