From 6d715f06a910791a5f74a1feaa0d84fe8b6cde72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E9=B8=BF?= <3307447117@qq.com> Date: Wed, 12 Aug 2020 22:40:39 +0800 Subject: [PATCH] . --- ANNTrain & SVMTrain.txt | 10 ++++++++++ CharsSegment.txt | 10 ++++++++++ CoreFunc-Features.txt | 21 +++++++++++++++++++++ Example.txt | 34 ++++++++++++++++++++++++++++++++++ FETCH_HEAD | 0 Integration.txt | 38 ++++++++++++++++++++++++++++++++++++++ SVM算法.txt | 35 +++++++++++++++++++++++++++++++++++ xingzhi.txt | 4 ++++ yingyong.txt | 4 ++++ yuanli.txt | 6 ++++++ 10 files changed, 162 insertions(+) create mode 100644 ANNTrain & SVMTrain.txt create mode 100644 CharsSegment.txt create mode 100644 CoreFunc-Features.txt create mode 100644 Example.txt create mode 100644 FETCH_HEAD create mode 100644 Integration.txt create mode 100644 SVM算法.txt create mode 100644 xingzhi.txt create mode 100644 yingyong.txt create mode 100644 yuanli.txt diff --git a/ANNTrain & SVMTrain.txt b/ANNTrain & SVMTrain.txt new file mode 100644 index 0000000..0d31a67 --- /dev/null +++ b/ANNTrain & SVMTrain.txt @@ -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) +提供模型数据,提高算法的准确性。 diff --git a/CharsSegment.txt b/CharsSegment.txt new file mode 100644 index 0000000..2f3a4f0 --- /dev/null +++ b/CharsSegment.txt @@ -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按位置从左到右进行排序。 \ No newline at end of file diff --git a/CoreFunc-Features.txt b/CoreFunc-Features.txt new file mode 100644 index 0000000..4162581 --- /dev/null +++ b/CoreFunc-Features.txt @@ -0,0 +1,21 @@ +Featuresࣺ + Ҫصʲôǻصصǵij¼ʱϵͳԶ㶨һκص൱һжϴϵͳڷ趨ʱԶá + ص¼ã + 1.صǿͻԼĺ磬OnTimeʱĻصʱ䵽ˣҪʲôͻԼʲôܶС + 2.صпһַʽDLL˵inoutصָ룬ΪеIJãҲá + 3.ص԰ص + ϵͳУFeaturesҪĻصá趨ʱøĺҪΪеҪ + getHisteFeaturesֱͼĻص + getHistogramFeaturesǻȡֱˮƽֱͼͼֵ + getSIFTFeaturesǻȡSITFӵĻص + getHOGFeaturesǻȡHOGӵĻص + +CoreFuncࣺ + ҪǹеһЩЩû϶ǶԽȡͼдһЩ磬жһƵɫжϳƵ͡ʾͼȣǶͼƬдĺ + colorMatchǸһͼɫģȡӦĶֵͼҶͼֻ0255ֵ255ƥ䣬0ƥ䣩 + plateColorJudgeжͼƬеijʲôɫֵΪbool͡ΪtrueСֵȡHֵ˥ΪfalseӦʹù̶Сֵminabs_sv + getPlateTypeжͼƬеijΪʲô͵ijơ + projectHistogramǻȡֱˮƽֱͼ + featuresǻȡˮƽֱֱͼ͵ͷֱͼɵʸ + showImageʾͼ + \ No newline at end of file diff --git a/Example.txt b/Example.txt new file mode 100644 index 0000000..24a4ecb --- /dev/null +++ b/Example.txt @@ -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])) \ No newline at end of file diff --git a/FETCH_HEAD b/FETCH_HEAD new file mode 100644 index 0000000..e69de29 diff --git a/Integration.txt b/Integration.txt new file mode 100644 index 0000000..88b0b12 --- /dev/null +++ b/Integration.txt @@ -0,0 +1,38 @@ +SVMԭ + ֧(SVM)VapnikоСԶķһַ༼һµķdzзչǰķ༼֧Ļ˼ռռ䣬ųƽʹƽ벻֮ͬľ󣬴Ӷﵽķ㷨ϸɲοס ֧VapnikĽṹСԭ򣬾ѧϰķʹѵõľ߹ԶIJԼܵõСֻ޵ѵͿԱ֤ѵķкСַʶʱԤֻ޵ѵ֧ķʹѵķʶַʱֻСҴѵʱ䡣 + ݷ⣬ͨõ緽ĻԼ򵥵Ϊϵͳһƽ沢ƶֱѵڲͬĵλƽIJͬ档ִƾ緽ջõķָƽ沢һųƽ棬ֻһֲĴųƽ档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ĿҵʹʱWb޷ֱWbͨԤ⺯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(XX^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عŻ⡣SVMlogisticعǹķߵlogisticعи壬Ҳչ⣬SVMϡԺȶʹõķʹú˷ʱС + Ϊ˷ʣSVMΨһʹú˼ɵĻѧϰ㷨logisticع顢عбLinear DiscriminantAnalysis, LDAҲͨ˷õlogisticع飨kernel logistic regressionع飨kernel ridge regressionͺбKernelized LDA, KLDASVMǹϺѧϰʵ֮һ + +SVMӦã + SVMڸģʽʶӦãʶıࡢдַʶϢѧȡSVMıģ顣ǫ̂ѧѶоLIBSVMʹSVMߡLIBSVM׼SVM㷨֧ع顢SVMȹܣԴCдJAVAPythonRMATLABԵĵýӿڡCUDAGPUٺ˲м㡢ģͽ֤ȡ + PythonĻѧϰģscikit-learnṩԤװSVMߣƲοLIBSVMSVMPythonģMDPMLPyPyMVPAȡTensorFlowĸ߽APIEstimatorsṩ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])) diff --git a/SVM算法.txt b/SVM算法.txt new file mode 100644 index 0000000..5672cd6 --- /dev/null +++ b/SVM算法.txt @@ -0,0 +1,35 @@ +支持向量机(SVM)是通过已知训练点的类别,求训练点和类别之间的对应关系,以便将训练集按照类 +别分开,或者是预测新的训练点所对应的类别。其数据主要分为线性可分数据和非线性可分数据,通过 +建立数据之间的最优超平面来区分数据类别。 +最优超平面: +假设线性可分样本(x1,d1),(x2,d2),....,(xn,dn),对于任意输入的样本,其期望输出都为1或-1(d=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 = 0(X为输入向量,W为向量权值,b为偏置), +则W^{T} X+b > 0,d = 1;W^{T} X+b < 0,d = -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 = 1;r = 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 = 0,0<=α<=C下使目标函数Q(α)最大化的αop +(3)计算最优权值W +(4)对于待分类模式X,计算判别函数决定X的归属 \ No newline at end of file diff --git a/xingzhi.txt b/xingzhi.txt new file mode 100644 index 0000000..70ea9b9 --- /dev/null +++ b/xingzhi.txt @@ -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是广义上核学习的实现之一。 diff --git a/yingyong.txt b/yingyong.txt new file mode 100644 index 0000000..9afe191 --- /dev/null +++ b/yingyong.txt @@ -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的封装模型。 diff --git a/yuanli.txt b/yuanli.txt new file mode 100644 index 0000000..c8ec91d --- /dev/null +++ b/yuanli.txt @@ -0,0 +1,6 @@ +SVM原理: +支持向量机(SVM)是Vapnik及其研究小组提出的针对二类别的分类问题而提出的一种分类技术,是一种新的非常有发展前景的分类技术。支持向量机的基本思想是在样本空间或特征空间,构造出最优超平面使超平面与不同类样本集之间的距离最大,从而达到最大的泛化能力,其算法的详细叙述可参考文献。 + 支持向量机方法根据Vapnik的结构风险最小化原则,尽量提高学习机的泛化能力,使有限少量训练样本得到的决策规则对独立的测试集仍能得到小的误差。这样只需有限的少量样本参与训练,就可以保证训练产生的分类器具有很小的误差。而车牌字符识别时,相对于预测的样本,只能有有限的少量样本参与训练,支持向量机的方法可以使训练产生的分类器在识别车牌字符时只有小的误差,并且大幅减少训练的时间。 + 对于数据分类问题,通用的神经网络方法的机理可以简单地描述为:系统随机产生一个超平面并移动它,直到训练集中属于不同类别的点正好位于平面的不同侧面。这种处理机制决定了神经网络方法最终获得的分割平面并不是一个最优超平面,只是一个局部的次优超平面。而SVM将最优超平面的求解问题转换为一个不等式约束下的二次函数寻优问题,这是一个凸二次优化问题,存在唯一解,能保证找到的极值解就是全局最优解。 + SVM通过一个非线性函数将输入数据映射到具有高维甚至为无穷维的特征空间,并在这个高维特征空间进行线性分类,构造最优分类超平面,但在求解最优化问题和计算判别函数时并不需要显式计算该非线性函数,而只需计算核函数,从而避免特征空间维数灾难问题。 + 车牌字符识别问题中每个样本为一个字符图像,每个字符图像由许多像素组成,具有高维的特点。SVM通过核函数的计算,避免了神经网络解决样本空间的高维问题带来的网络结构设计问题,使训练模型与输入数据的维数无关;并且每个字符的整幅图像作为一个样本输入,不需要进行特征提取,节省了识别时间。 \ No newline at end of file