opencv3.1 svm(支持向量机)使用心得

本文转载自:http://livezingy.com/category/opencv/

 在开源的车牌识别系统EasyPR中,用SVM(支持向量机)模型甄选出候选车牌中真正的车牌。目前EasyPR1.4的SVM模型输入的是LBP特征,作者提及后续会考虑增加HOG和SIFT特征。据此思路,我用HOG特征作为SVM模型的输入进行了初步验证,在此记录训练方法和数据。

      本文验证用的工程SVM sample已上传至CSDN,欢迎下载和探讨,该工程运行环境:Win10 + VS2013 + opencv3.1。trainAuto非常耗时,具体时间与电脑配置相关,本文的测试数据会给出各类特征trainAuto的训练时间,所以这里也给出电脑配置供大家参考:Intel(R) Core(TM) i3 CPU,4GB内存。

      1. LBP/HOG特征SVM训练结果

      我们先来看一下LBP特征作为SVM输入时的验证结果,如下图所示。LBP特征完全来源于EasyPR工程,SVMexample中只是将svm_train.cpp以及LBP相关内容独立出来了。但是训练结果中的precise, recall, Fscore并没有EasyPR作者博客中介绍的那么高,不知是否与opencv版本有关,或者只是我使用不当。

     下图是HOG特征作为输入的验证结果。HOG特征的维度与检测HOG特征时的参数有关,我验证过两组参数。其中特征维度为24156时,以RBF为内核时,我的程序运行24小时以上都没有得到结果。但是将特征维度降为2340后,RBF得到了结果,优于LINEAR内核。且同为LINEAR内核,2340维度的结果要优于24156维度的。有兴趣的同学可以再尝试降低维度是否可以得到更好的结果。

      验证结果的注解如下:

1.1 EasyPR作者的博客计算机的潜意识, EasyPR在Github上的地址https://github.com/liuruoze/EasyPR

1.2 本文验证工程的主题架构和LBP特征来源于EasyPR1.4的svm_train.cpp文件,训练样本是EasyPR1.4中的训练数据,数据路径EasyPR\resources\train\svm.7z。

1.3 EasyPR1.0~EasyPR1.4中在使用SVM模型时,设置的SVM类型均为C_SVC,本文各类特征的验证结果也基于C_SVC。

1.4 LBP/HOG/SIFT/SURF特征均使用trainAuto函数训练得到。

     count_all:测试样本总数量;

     ptrue_rtrue:预测(p)为车牌并且实际(r)为车牌的数量;

     ptrue_rfalse:预测(p)为车牌并且实际(r)不为车牌的数量;

     pfalse_rtrue:预测(p)是非车牌但实际(r)为车牌的数量;

     pfalse_rfalse:预测(p)是非车牌但实际(r)不为车牌的数量;
     precise/recall/Fscore分别表示准确率,查全率,评分。这三个参数的具体意义大家可以参考《EasyPR详解》中的第6章《SVM开发详解》,这里不再赘述。

     c/class weights/coef0/degree/gamma/nu/p等参数是SVM 模型的训练参数。opencv 官网文档对这些参数都有注解,对于使用者而言,我们可以不用理解这些参数的意义,因为有trainAuto函数,该函数会自动调参,相关介绍可以参考opencv3.1 svm(支持向量机)使用心得

      2. SVM训练数据特征向量维度

      SVM模型训练时,要求每个样本的特征维度相同。

      LBP特征维度与图像尺寸有关,EasyPR的图像样本的尺寸固定为136*36,因此LBP特征的维度是固定的。

      HOG特征的维度由HOG特征检测时的参数决定的,检测样本时保持相同的参数就可以确保不同图像得到的HOG特征维度相同。

      而SIFTSURF特征则不一样,每一个特征点的描述符维度固定,但不同图像获取的特征点数量不一致,这种状况会导致不同图像的特征维度不一致。因此后续在尝试用SIFT和SURF特征作为SVM的输入时需要结合feature聚类来实现,下一次再和大家分享SIFT和SURF特征值作为SVM输入的例程。


你可能感兴趣的:(OpenCv专栏,CV_计算机视觉,目标检测/目标跟踪)