2.2.1基于分类识别的选择
BP神经网络:具有自适应性,通过反复训练不断修正连接权值以进行特征提取。该方法具有较高的普适性,并且可以通过调整学习方法得到一种较优的网络。但该方法并未利用汉字的特征,适用于子类中单字识别。
字型特征:通过对水平和垂直方向上投影得出的直方图的分析,可得出一个汉字的字型统计特征(左右、上下等),适于粗分类。
笔画密度特征:从水平,垂直方向等间隔取多根扫描线,取穿过笔画数的最大值,形成2维特征向量,适于粗分类。
弹性网格特征:根据笔画位置将单个汉字分割为几个网格,通过计算每个网格内笔画的矢量特征进行特征提取,特征向量较多,适用于子类中单字识别。
笔画结构特征:通过寻找交叉点和拐点将汉字分为笔段,然后将笔段按倾斜度和连通性合并成笔画,提取笔画的矢量特性作为特征向量,向量数较多,适用于子类中单字识别。但该方法同时可以统计出笔画总数和交叉点总数,可用于粗分类。
四角特征:通过提取四角的笔画结构特征进行分类,向量中包含四个元素,可结合(5)进行粗分类。
我们将通过MATLAB对以上算法进行实验,以确定最优的分类和子分类中单字识别的算法。
2.2.2基于并行化运算的选择
BP神经网络:由于神经网络由神经元构成,每个神经元的计算以及权值调整计算都为乘法和加法,以上特征使之很适合并行化和流水线计算。
字型特征:投影运算为串并行结合加法运算,最大值计算为串行运算,字型判断部分为较复杂串并行结合逻辑运算。
笔画密度特征:水平和垂直扫描运算为串行,多根扫描线并行,取最大值运算为串行。
弹性网格特征:分格后可对每格进行并行化运算,但其中的向量计算包含大量除法,其实现效率有待验证。
笔画结构特征:交叉点寻找为并行,倾斜度计算为并行,提取矢量特性为并行,但以上步骤的结果入库过程为串行扫描。
四角特征:四角可并行运算。
在进行MATLAB进行算法实验的同时,我们会同时使用System Generator进一步对算法的并行化及流水线计算可能性进行评估实验,并结合2.2.1进行总体效率评估。
2.3分类识别
在分别对样本和标准样本提取特征后,分类和识别可采用神经网络、决策树、支持向量机或统计方法等。对于在FPGA上实现文字识别来说,神经网络和统计方法可行性较好,下面对这两种算法的特点进行简单说明。
2.3.1神经网络
人工神经网络通过网络节点间的连接来存储信息并完成分类计算。神经网络分类器通过学习,根据训练样本集来调整连接的权值,构造出相应的分类曲面。由于其较强的曲线拟合和模式分类能力,为手写签名识别的研究提供了新的手段。
神经网络有很强的信息处理能力,它能以任意精度逼近连续非线性函数;它信息处理的并行机制中的冗余性可以实现很强的容错能力;对复杂不确定问题具有自适应和自学习能力。在一定多的训练次数以及合适的参数选择下,神经网络可以得出很理想的结果。
神经网络是由大量神经元构成的,其自身的特点使其非常适合并行化和流水线计算。
2.3.2 统计方法
统计方法主要有最近邻归类、基于事例的学习等,这些方法本质上是基于某种距离进行相应变换,得到具有另外一些参数的分类公式。统计学上主要用的基本距离公式有绝对值距离、欧氏距离、明斯基距离等。
其中,最小距离分类器作为一种直观有效的分类方法,在实际应用中受到广泛重视,尤其对于高维多模式问题,使用类聚等分类方法存在计算量巨大、难以保证算法收敛等问题,距离函数分类器更显其优越性。在实际问题中,常把各类模式矢量的统计平均值作为该类模式的基准模板,用待识别样本与此基准模板做比较。
统计计算多为乘累加运算,在FPGA中采用分级流水线乘法器和加法器可获得较高的计算效率。
2.4仿真识别结果(以数字测试)
附:
(部分matlab主要程序代码)
主程序:main.m
clear
clc
global X; %图像特征矩阵
global S; %样本特征矩阵
sample_training; %训练样本
E=imread('6_1.jpg'); %待识别图像读入
%A=gca;
imshow(E);%axis(A);
initial(E);
i=0;j=0;d=0;
Dm=zeros(10,15);
for i=1:10
for j=1:15
Dm(i,j)=abs(S(i,j)-X(1,j));
end
end
D=sum(Dm,2);
Position=find(D==min(D));
% i=Position;
if Position==10
Position=0;
else break;
end
set(handles.edit1,'String',Position);
预处理程序:initial.m
function initial(RGB)
GRAY=rgb2gray(RGB);
%高斯滤波
g=fspecial('gaussian',3,3);
GRAY1=imfiLTEr(GRAY,g);
%切割图像
BW=im2bw(GRAY1);
[m,n]=size(BW);
%竖直投影
I1=sum(BW);
L=max(I1);
L1=L-2;
x1=0;x2=0;k=0;
for k=1:m
if I1(k)
x1=k;break;
else
k=k+1;
end
end
for k=x1:m
if I1(k)>L1
x2=k;break;
else
k=k+1;
end
end
%水平投影
BW1=BW';
I2=sum(BW1);
L=max(I2);
L2=L-2;
y1=0;y2=0;k=0;
for k=1:n
if I2(k)
y1=k;break;
else
k=k+1;
end
end
for k=y1:n
if I2(k)>L2
y2=k;break;
else
k=k+1;
end
end
%行,子切分
BW2=BW(y1:y2,x1:x2);
%图像归一化
NOR=imresize(BW2,[120 90]);
%特征提取
X=zeros(1,15);
X(1)=bwarea(NOR(1:40,1:30))/10800;
X(2)=bwarea(NOR(1:40,31:60))/10800;
X(3)=bwarea(NOR(1:40,61:90))/10800;
X(4)=bwarea(NOR(41:80,1:30))/10800;
X(5)=bwarea(NOR(41:80,31:60))/10800;
X(6)=bwarea(NOR(41:80,61:90))/10800;
X(7)=bwarea(NOR(81:120,1:30))/10800;
X(8)=bwarea(NOR(81:120,31:60))/10800;
X(9)=bwarea(NOR(81:120,61:90))/10800;
X(10)=X(1)+X(2)+X(3);
X(11)=X(4)+X(5)+X(6);
X(12)=X(7)+X(8)+X(9);
X(13)=X(1)+X(4)+X(7);
X(14)=X(2)+X(5)+X(8);
X(15)=X(3)+X(6)+X(9);