罗鸿 4 years ago
parent eb9dd8c454
commit 6d715f06a9

@ -0,0 +1,10 @@
功能1图片识别训练
车牌识别训练由src/main/java/com.yuxue.train路径下的SVMTrain.java实现。其中最重要的是train方法
实现了通过大量源图像文件和标记的比对建立起xml模型文件doPridect方法借助模型文件和opencv库中的
方法实现了对图片的识别判断。
图片文字识别训练由src/main/java/com.yuxue.train路径下的ANNTrain.java和CnANNTrain.java实现。其
中ANNTrain.java用于数字的识别训练CnANNTrain.java用于文字识别训练两者内容所差无几。两者之中
的train方法都是调用指定路径文件夹内的图片通过opencv库内给定的函数进行识别和标记比对建立模型
predict方法通过借助模型遍历测试样本下的所有文件进行计算预测准确率。
该功能主要用于为后续车牌判断CharsIdentify、字符分割CharsSegment和字符识别CharsRecognise
提供模型数据,提高算法的准确性。

@ -0,0 +1,10 @@
字符分割由src/main/resources/easype-java路径下的CharsSegment实现。
其中函数verifySizes是字符尺寸验证用于去掉尺寸不符合的图块。函数
preprocessChar是字符预处理用于统一每个字符的大小。函数clearLiuDing
用于计算每行元素的阶跃数如果小于X认为是柳丁将此行全部填0涂黑
X可根据实际调整。函数GetChineseRect根据特殊车牌来构造猜测中文字符的位置和大小。
函数GetSpecificRect用于找出指示城市的字符的Rect之所以选择城市的字符位置是因
为该位置不管什么字母,占用的宽度跟高度的差不多,能大大提高位置的准确性。函数
RebuildRect有两个功能一是把特殊字符Rect左边的全部Rect去掉后面再重建中文字
符的位置二是从特殊字符Rect开始依次选择6个Rect多余的舍去。函数SortRect用于
将Rect按位置从左到右进行排序。

@ -0,0 +1,21 @@
Features类
这个类主要是特征回调函数。什么是回调函数?回调函数是当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。
回调函数有以下几点作用:
1.回调函数就是客户自己做主的函数。比如OnTime定时器的回调函数时间到了需要做什么交给客户自己处理想添加什么功能都行。
2.回调函数很有可能是输出的一种方式。对于DLL来说函数的输入参数【in】输出参数【out】回调函数的指针作为其中的参数可以起到输入的作用也可以起到输出的作用。
3.回调函数还可以包括回调函数。
在整个系统中Features类主要是特征的回调作用。当满足设定的条件时调用该类的函数可以输出需要的特征。以下为该类中的主要函数
getHisteFeatures函数是生成直方图均衡特征的回调函数。
getHistogramFeatures是获取垂直和水平的直方图图值。
getSIFTFeatures是获取SITF特征子的回调函数。
getHOGFeatures是获取HOG特征子的回调函数。
CoreFunc类
这个类主要是共有的一些函数,并且这些函数的作用基本上都是对截取到的汽车牌照图进行处理的一些函数。比如,判断一个车牌的颜色、判断车牌的类型、显示图像等,都是对输入的图片进行处理的函数。
colorMatch函数是根据一副图像与颜色模板获取对应的二值图输出灰度图只有0和255两个值255代表匹配0代表不匹配
plateColorJudge函数是判断图片中的车牌是什么颜色返回值为bool类型。如果为true则最小值取决于H值按比例衰减如果为false则不再自适应使用固定的最小值minabs_sv。
getPlateType函数是判断图片中的车牌为什么类型的车牌。
projectHistogram函数是获取垂直或水平方向直方图。
features函数是获取样本特征水平、垂直直方图和低分辨率图像所组成的矢量。
showImage函数的作用是显示图像。

@ -0,0 +1,34 @@
# Example
from sklearn import datasets
import numpy
from numpy import *
from sklearn import svm
print ('''加载数据集''')
digits = datasets.load_digits()
# 例如在digits数据集中digits.data是可以用来分类数字样本的特征
print(digits.data,"type(digits.data)=%s"%type(digits.data))
print("shape(digits.data)=%s,%s"%shape(digits.data))
print (digits.target)
print ('''训练和预测''')
#选择参数
clf = svm.SVC(gamma=0.0001,C=100)
# 进行训练
clf.fit(digits.data[:-1],digits.target[:-1])
# 进行预测
print (clf.predict(digits.data[:-1]))

@ -0,0 +1,38 @@
SVM原理
支持向量机(SVM)是Vapnik及其研究小组提出的针对二类别的分类问题而提出的一种分类技术是一种新的非常有发展前景的分类技术。支持向量机的基本思想是在样本空间或特征空间构造出最优超平面使超平面与不同类样本集之间的距离最大从而达到最大的泛化能力其算法的详细叙述可参考文献。 支持向量机方法根据Vapnik的结构风险最小化原则尽量提高学习机的泛化能力使有限少量训练样本得到的决策规则对独立的测试集仍能得到小的误差。这样只需有限的少量样本参与训练就可以保证训练产生的分类器具有很小的误差。而车牌字符识别时相对于预测的样本只能有有限的少量样本参与训练支持向量机的方法可以使训练产生的分类器在识别车牌字符时只有小的误差并且大幅减少训练的时间。
对于数据分类问题通用的神经网络方法的机理可以简单地描述为系统随机产生一个超平面并移动它直到训练集中属于不同类别的点正好位于平面的不同侧面。这种处理机制决定了神经网络方法最终获得的分割平面并不是一个最优超平面只是一个局部的次优超平面。而SVM将最优超平面的求解问题转换为一个不等式约束下的二次函数寻优问题这是一个凸二次优化问题存在唯一解能保证找到的极值解就是全局最优解。 SVM通过一个非线性函数将输入数据映射到具有高维甚至为无穷维的特征空间并在这个高维特征空间进行线性分类构造最优分类超平面但在求解最优化问题和计算判别函数时并不需要显式计算该非线性函数而只需计算核函数从而避免特征空间维数灾难问题。 车牌字符识别问题中每个样本为一个字符图像每个字符图像由许多像素组成具有高维的特点。SVM通过核函数的计算避免了神经网络解决样本空间的高维问题带来的网络结构设计问题使训练模型与输入数据的维数无关并且每个字符的整幅图像作为一个样本输入不需要进行特征提取节省了识别时间。
SVM算法
支持向量机SVM是通过已知训练点的类别求训练点和类别之间的对应关系以便将训练集按照类别分开或者是预测新的训练点所对应的类别。其数据主要分为线性可分数据和非线性可分数据通过建立数据之间的最优超平面来区分数据类别。最优超平面假设线性可分样本(x1,d1),(x2,d2),....,(xn,dn)对于任意输入的样本其期望输出都为1或-1d=1或-1用来代表两类类别的标识。当空间为二维空间时直线可划分区域块其方程为x1+x2 = 1用向量表示即为[1,1]^{T}[x1,x2]-1 = 0当空间为三维空间时平面可划分区域块其方程为x1+x2+x3 = 1用向量表示即为[1,1,1]^{T} [x1,x2,x3]-1 = 0由此推广到高维空间可得超平面方程为W^{T} X+b = 0X为输入向量W为向量权值b为偏置则W^{T} X+b > 0d = 1W^{T} X+b < 0d = -1超平面与最近的样本之间的间隔称为分离边缘ρ表示SVM的目标就是找到使ρ最大时的W和b由于无法直接求得W和b可通过预测函数y = f(x) = sgn(W^{T} X+b)对给定样本的分类错误最小由几何数学可知空间内一点到最优超平面的距离为
r = (W^{T} X+b)/ ||W0||令g(x) = r ||W0|| = W^{T} X+b → r = g(x)/ ||W0|| = 1/ ||W0||
d = 1r = g(x)/ ||W0|| = -1/ ||W0|| d = -1所以分离边缘ρ = 2r = 2/ ||W0||线性可分数据最优超平面最优超平面的权向量是训练样本向量的线性组合且只有支持向量影响最终划分结果W = α01d1X1 + α02d2X2 + ... + α0ndnXnb = 1-W^{T} X非线性可分数据SVM对于非线性可分的数据是将输入向量映射到一个高维度特征向量空间如果选用的映射函数适当且特征空间的维数足够高则大多数非线性可分模式在特征空间中可转化为线性可分模式该构造与内积核相关以下为四种常用的核函数线性核函数
K(X,Xp) = X' Xp多项式核函数K(X,Xp) = [(X Xp)+1]^qGauss核函数K(X,Xp) = exp(- |X - X^p|^2/2ρ^2)Sigmoid核函数K(X,Xp) = tanh(k(X·X^p))+c tanh(x)=(e^x - e^(-x))/(e^x + e^(-x))支持向量机的学习算法:(1)准备一组训练样本(x1,d1),(x2,d2),....,(xn,dn)(2)在约束条件α1d1+α2d2+ ... +αndn = 00<=α<=C下使目标函数Q(α)最大化的αop(3)计算最优权值W(4)对于待分类模式X计算判别函数决定X的归属
SVM性质
稳健性与稀疏性SVM的优化问题同时考虑了经验风险和结构风险最小化因此具有稳定性。从几何观点SVM的稳定性体现在其构建超平面决策边界时要求边距最大因此间隔边界之间有充裕的空间包容测试样本 。SVM使用铰链损失函数作为代理损失铰链损失函数的取值特点使SVM具有稀疏性即其决策边界仅由支持向量决定其余的样本点不参与经验风险最小化。在使用核方法的非线性学习中SVM的稳健性和稀疏性在确保了可靠求解结果的同时降低了核矩阵的计算量和内存开销。
与其它线性分类器的关系SVM是一个广义线性分类器通过在SVM的算法框架下修改损失函数和优化问题可以得到其它类型的线性分类器例如将SVM的损失函数替换为logistic损失函数就得到了接近于logistic回归的优化问题。SVM和logistic回归是功能相近的分类器二者的区别在于logistic回归的输出具有概率意义也容易扩展至多分类问题而SVM的稀疏性和稳定性使其具有良好的泛化能力并在使用核方法时计算量更小。
作为核方法的性质SVM不是唯一可以使用核技巧的机器学习算法logistic回归、岭回归和线性判别分析Linear DiscriminantAnalysis, LDA也可通过核方法得到核logistic回归kernel logistic regression、核岭回归kernel ridge regression和核线性判别分析Kernelized LDA, KLDA方法。因此SVM是广义上核学习的实现之一。
SVM应用
SVM在各领域的模式识别问题中有应用包括人像识别、文本分类、手写字符识别、生物信息学等。包含SVM的编程模块。按引用次数由台湾大学资讯工程研究所开发的LIBSVM是使用最广的SVM工具。LIBSVM包含标准SVM算法、概率输出、支持向量回归、多分类SVM等功能其源代码由C编写并有JAVA、Python、R、MATLAB等语言的调用接口、基于CUDA的GPU加速和其它功能性组件例如多核并行计算、模型交叉验证等。
基于Python开发的机器学习模块scikit-learn提供预封装的SVM工具其设计参考了LIBSVM。其它包含SVM的Python模块有MDP、MLPy、PyMVPA等。TensorFlow的高阶API组件Estimators有提供SVM的封装模型。
SVM实例
# Example
from sklearn import datasets
import numpy
from numpy import *
from sklearn import svm
print ('''加载数据集''')
digits = datasets.load_digits()
# 例如在digits数据集中digits.data是可以用来分类数字样本的特征
print(digits.data,"type(digits.data)=%s"%type(digits.data))
print("shape(digits.data)=%s,%s"%shape(digits.data))
print (digits.target)
print ('''训练和预测''')
#选择参数
clf = svm.SVC(gamma=0.0001,C=100)
# 进行训练
clf.fit(digits.data[:-1],digits.target[:-1])
# 进行预测
print (clf.predict(digits.data[:-1]))

@ -0,0 +1,35 @@
支持向量机SVM是通过已知训练点的类别求训练点和类别之间的对应关系以便将训练集按照类
别分开,或者是预测新的训练点所对应的类别。其数据主要分为线性可分数据和非线性可分数据,通过
建立数据之间的最优超平面来区分数据类别。
最优超平面:
假设线性可分样本(x1,d1),(x2,d2),....,(xn,dn)对于任意输入的样本其期望输出都为1或-1d=1或-1
,用来代表两类类别的标识。
当空间为二维空间时直线可划分区域块其方程为x1+x2 = 1用向量表示即为[1,1]^{T}[x1,x2]-1 = 0
当空间为三维空间时平面可划分区域块其方程为x1+x2+x3 = 1用向量表示即为[1,1,1]^{T}
[x1,x2,x3]-1 = 0
由此推广到高维空间可得超平面方程为W^{T} X+b = 0X为输入向量W为向量权值b为偏置
则W^{T} X+b > 0d = 1W^{T} X+b < 0d = -1
超平面与最近的样本之间的间隔称为分离边缘ρ表示SVM的目标就是找到使ρ最大时的W和b
由于无法直接求得W和b可通过预测函数y = f(x) = sgn(W^{T} X+b)对给定样本的分类错误最小
由几何数学可知空间内一点到最优超平面的距离为r = (W^{T} X+b)/ ||W0||
令g(x) = r ||W0|| = W^{T} X+b → r = g(x)/ ||W0|| = 1/ ||W0|| d = 1r = g(x)/ ||W0|| = -1/ ||W0||
d = -1
所以分离边缘ρ = 2r = 2/ ||W0||
线性可分数据最优超平面:
最优超平面的权向量是训练样本向量的线性组合,且只有支持向量影响最终划分结果
W = α01d1X1 + α02d2X2 + ... + α0ndnXn
b = 1-W^{T} X
非线性可分数据:
SVM对于非线性可分的数据是将输入向量映射到一个高维度特征向量空间如果选用的映射函数适当且
特征空间的维数足够高,则大多数非线性可分模式在特征空间中可转化为线性可分模式,该构造与内积
核相关
以下为四种常用的核函数:
线性核函数K(X,Xp) = X' Xp
多项式核函数K(X,Xp) = [(X Xp)+1]^q
Gauss核函数K(X,Xp) = exp(- |X - X^p|^2/2ρ^2)
Sigmoid核函数K(X,Xp) = tanh(k(X·X^p))+c tanh(x)=(e^x - e^(-x))/(e^x + e^(-x))
支持向量机的学习算法:
(1)准备一组训练样本(x1,d1),(x2,d2),....,(xn,dn)
(2)在约束条件α1d1+α2d2+ ... +αndn = 00<=α<=C下使目标函数Q(α)最大化的αop
(3)计算最优权值W
(4)对于待分类模式X计算判别函数决定X的归属

@ -0,0 +1,4 @@
性质
稳健性与稀疏性SVM的优化问题同时考虑了经验风险和结构风险最小化因此具有稳定性。从几何观点SVM的稳定性体现在其构建超平面决策边界时要求边距最大因此间隔边界之间有充裕的空间包容测试样本 。SVM使用铰链损失函数作为代理损失铰链损失函数的取值特点使SVM具有稀疏性即其决策边界仅由支持向量决定其余的样本点不参与经验风险最小化。在使用核方法的非线性学习中SVM的稳健性和稀疏性在确保了可靠求解结果的同时降低了核矩阵的计算量和内存开销。
与其它线性分类器的关系SVM是一个广义线性分类器通过在SVM的算法框架下修改损失函数和优化问题可以得到其它类型的线性分类器例如将SVM的损失函数替换为logistic损失函数就得到了接近于logistic回归的优化问题。SVM和logistic回归是功能相近的分类器二者的区别在于logistic回归的输出具有概率意义也容易扩展至多分类问题而SVM的稀疏性和稳定性使其具有良好的泛化能力并在使用核方法时计算量更小 。
作为核方法的性质SVM不是唯一可以使用核技巧的机器学习算法logistic回归、岭回归和线性判别分析Linear DiscriminantAnalysis, LDA也可通过核方法得到核logistic回归kernel logistic regression、核岭回归kernel ridge regression和核线性判别分析Kernelized LDA, KLDA方法。因此SVM是广义上核学习的实现之一。

@ -0,0 +1,4 @@
SVM在各领域的模式识别问题中有应用包括人像识别、文本分类、手写字符识别、生物信息学等。
包含SVM的编程模块。
按引用次数由台湾大学资讯工程研究所开发的LIBSVM是使用最广的SVM工具。LIBSVM包含标准SVM算法、概率输出、支持向量回归、多分类SVM等功能其源代码由C编写并有JAVA、Python、R、MATLAB等语言的调用接口、基于CUDA的GPU加速和其它功能性组件例如多核并行计算、模型交叉验证等。
基于Python开发的机器学习模块scikit-learn提供预封装的SVM工具其设计参考了LIBSVM。其它包含SVM的Python模块有MDP、MLPy、PyMVPA等。TensorFlow的高阶API组件Estimators有提供SVM的封装模型。

@ -0,0 +1,6 @@
SVM原理
支持向量机(SVM)是Vapnik及其研究小组提出的针对二类别的分类问题而提出的一种分类技术是一种新的非常有发展前景的分类技术。支持向量机的基本思想是在样本空间或特征空间构造出最优超平面使超平面与不同类样本集之间的距离最大从而达到最大的泛化能力其算法的详细叙述可参考文献。
支持向量机方法根据Vapnik的结构风险最小化原则尽量提高学习机的泛化能力使有限少量训练样本得到的决策规则对独立的测试集仍能得到小的误差。这样只需有限的少量样本参与训练就可以保证训练产生的分类器具有很小的误差。而车牌字符识别时相对于预测的样本只能有有限的少量样本参与训练支持向量机的方法可以使训练产生的分类器在识别车牌字符时只有小的误差并且大幅减少训练的时间。
对于数据分类问题通用的神经网络方法的机理可以简单地描述为系统随机产生一个超平面并移动它直到训练集中属于不同类别的点正好位于平面的不同侧面。这种处理机制决定了神经网络方法最终获得的分割平面并不是一个最优超平面只是一个局部的次优超平面。而SVM将最优超平面的求解问题转换为一个不等式约束下的二次函数寻优问题这是一个凸二次优化问题存在唯一解能保证找到的极值解就是全局最优解。
SVM通过一个非线性函数将输入数据映射到具有高维甚至为无穷维的特征空间并在这个高维特征空间进行线性分类构造最优分类超平面但在求解最优化问题和计算判别函数时并不需要显式计算该非线性函数而只需计算核函数从而避免特征空间维数灾难问题。
车牌字符识别问题中每个样本为一个字符图像每个字符图像由许多像素组成具有高维的特点。SVM通过核函数的计算避免了神经网络解决样本空间的高维问题带来的网络结构设计问题使训练模型与输入数据的维数无关并且每个字符的整幅图像作为一个样本输入不需要进行特征提取节省了识别时间。
Loading…
Cancel
Save