本文转载自: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内存。
我们先来看一下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特征维度相同。
而SIFT和SURF特征则不一样,每一个特征点的描述符维度固定,但不同图像获取的特征点数量不一致,这种状况会导致不同图像的特征维度不一致。因此后续在尝试用SIFT和SURF特征作为SVM的输入时需要结合feature聚类来实现,下一次再和大家分享SIFT和SURF特征值作为SVM输入的例程。