连续手写字识别方法及系统与流程

文档序号:11216840阅读:434来源:国知局
连续手写字识别方法及系统与流程

本发明涉及图像文字识别技术领域,特别是涉及连续手写字识别方法及系统。



背景技术:

近年来,基于孤立字的手写字识别准确率已经达到了一定水平,随着科技的不断发展和电子产品的跟新替换,孤立字识别的技术越来越不能够满足人们的需求,也不符合人们日常的书写习惯,从而连续手写字的识别技术不断出现。

具体来讲,对于孤立字的识别,可以用条件概率表述,

maxp(ci|p)(1)

其中p表示孤立字图像,ci表示第i个中文字符;而对于连续手写字,一张输入的图像中含有n个中文字符,所以

s=c1c2...cn(2)

其中s表示图像p所对应的字符串,最后要求解的问题则为,

maxp(s|p)(3)

此时,可以看出用同样的方法解决连续手写字的识别问题,其算法复杂度和时间复杂度都会对整个网络开销带来很大的负面影响,严重影响用户体验;再者,对识别模型的输入要求图像大小是固定的,但对于连续手写字,其终端写两个字或者三个字的图像大小是不一样的,而且对其进行切割成的孤立字图像大小也非一样,采用通用的图像缩放方法会对其精度造成一定的影响,而且,对图像切割有误的话,会对后面的识别结果及其它处理造成严重的影响。



技术实现要素:

鉴于以上所述现有技术的缺点,本发明的目的在于提供连续手写字识别方法及系统,用于解决现有技术中的问题。

为实现上述目的及其他相关目的,本发明提供一种连续手写字识别方法,包括:分割包含手写字符串的主图像为多个子图像;通过第一神经网络模型分别对所述多个子图像进行特征提取以得到对应数量个特征向量序列;通过第二神经网络模型获得每个特征向量序列对应的字符串片段的识别结果的第一概率值;通过损失函数模块执行以下过程:枚举组成所述手写字符串的各个所述字符串片段组合,并根据所述第一概率值来计算各个字符串片段组合的第二概率值,选择第二概率值最大的字符串片段组合作为所述手写字符串的初步识别结果。

于本发明的一实施例中,所述第一神经网络模型的类型包括:cnn模型。

于本发明的一实施例中,所述第二神经网络模型的类型包括:lstm模型。

于本发明的一实施例中,所述损失函数模块的类型包括:ctc模型。

于本发明的一实施例中,所述方法还包括:网络测试过程,其包括:通过beam-search结合预设语言模型的方式来根据所述第二概率值计算得到第三概率值,并将第三概率值最大的字符串片段组合作为所述手写字符串的最终识别结果。

于本发明的一实施例中,所述方法还包括:通过随机梯度下降算法训练所述第一神经网络模型、第二神经网络模型、及损失函数模块中的一者或多者。

于本发明的一实施例中,各所述子图像尺寸相同;相邻子图像间有部分重叠或边缘相接。

为实现上述目的及其他相关目的,本发明提供一种连续手写字识别系统,包括:图像处理模块,用于分割包含手写字符串的主图像为多个子图像;第一神经网络模块,用于分别对所述多个子图像进行特征提取以得到对应数量个特征向量序列;第二神经网络模块,获得每个特征向量序列对应的字符串片段的识别结果的第一概率值;损失函数模块模块,枚举组成所述手写字符串的各个所述字符串片段组合,并根据所述第一概率值来计算各个字符串片段组合的第二概率值,选择第二概率值最大的字符串片段组合作为所述手写字符串的初步识别结果。

于本发明的一实施例中,所述第一神经网络模块包括:cnn模型。

于本发明的一实施例中,所述第二神经网络模块包括:lstm模型。

于本发明的一实施例中,所述损失函数模块包括:ctc模型。

于本发明的一实施例中,所述第一神经网络模块、第二神经网络模块、及损失函数模块中的一或多者通过随机梯度下降算法进行训练。

于本发明的一实施例中,所述系统包括:网络测试模块,用于通过beam-search结合预设语言模型的方式来根据所述第二概率值计算得到第三概率值,并将第三概率值最大的字符串片段组合作为所述手写字符串的最终识别结果。。

于本发明的一实施例中,各所述子图像尺寸相同;相邻子图像间有部分重叠或边缘相接。

如上所述,本发明的连续手写字识别方法及系统,通过分割包含手写字符串的主图像为多个子图像;通过第一神经网络模型分别对所述多个子图像进行特征提取以得到对应数量个特征向量序列;通过第二神经网络模型获得每个特征向量序列对应的字符串片段的识别结果的第一概率值;通过损失函数模型执行以下过程:枚举组成所述手写字符串的各个所述字符串片段组合,并根据所述第一概率值来计算各个字符串片段组合的第二概率值,选择第二概率值最大的字符串片段组合作为所述手写字符串的初步识别结果;不需要通过对连续字体准确切割成孤立字体去识别,且配合神经网络模型进行学习识别,快速准确,提升用户体验。

附图说明

图1显示为本发明于一实施例中的连续手写字识别方法的流程示意图。

图2显示为cnn模型的结构示意图。

图3显示为lstm模型的结构示意图。

图4显示为本发明于一实施例中的连续手写字识别系统的模块示意图。

元件标号说明

401图像处理模块

402第一神经网络模块

403第二神经网络模块

404损失函数模块

s101~s104步骤

具体实施方式

以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。

需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。

请参阅图1,本发明提供一种连续手写字识别方法的实施例,该方法包括:

步骤s101:分割包含手写字符串的主图像为多个子图像。

于本发明的一实施例中,所述子图像可以图片;所述分割过程,可以是首先进行预处理,例如将整张图片的空白区域裁剪去除,并将切割后的子图像宽高比缩放成固定大小的宽高比,譬如裁剪后得到的图片宽高比为2:1,放大时为64:128;然后再将其进行分割成子图片,并将其处理为灰度图像作为神经网络的输入。

具体的,假设通过终端采集的一张手写字图像大小为m×n,将图像“分割”为k个子图像(子图片)的集合{p1,p2,...,pk},其中,各所述子图像尺寸相同,相邻子图像间有部分重叠或边缘相接;具体的,所述各个子图像可以是利用大小例如为m×d,步长为l的模板,将原图(m×n)通过滑窗的形式进行切割,其中l≤d,以使相邻子图像间不会有间隔。

步骤s102:通过第一神经网络模型分别对所述多个子图像进行特征提取以得到对应数量个特征向量序列。

具体的,该第一神经网络模型可以是cnn(convolutionalneuralnetwork卷积神经网络)模型,通过cnn模型对这k个子图像进行特征提取,其对应的特征向量序列分别为v1,v2,...,vk。

卷积神经网络是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成。其结构示意图2所示。

由图2可知,输入图像可以通过和三个可训练的;滤波器和可加偏置进行卷积,卷积后在c1层产生三个特征映射图,然后特征映射图中每组的四个像素再进行求和,加权值,加偏置,通过一个sigmoid函数得到三个s2层的特征映射图。这些映射图再经过滤波得到c3层。这个层级结构再和s2一样产生s4;最终,这些像素值被光栅化,并连接成一个向量输入到传统的神经网络,得到输出。

在cnn的参数更新和迭代一般利用bp算法的思想来计算的,在此首先利用bp算法阐述前向传播和反向传播的思想:

1.cnn的前向传播(feedforwardpass)

在此,采用平方误差代价函数。我们讨论的是多类问题,共c类,共n个训练样本。

这里表示第n个样本对应的标签的第k维。表示第n个样本对应的网络输出的第k个输出。对于多类问题,输出一般组织为“one-of-c”的形式,也就是只有该输入对应的类的输出节点输出为正,其他类的位或者节点为0或者负数,这个取决于你输出层的激活函数。

因为在全部训练集上的误差只是每个训练样本的误差的总和,所以这里我们先考虑对于一个样本的bp。对于第n个样本的误差,表示为:

传统的全连接神经网络中,我们需要根据bp规则计算代价函数e关于网络每一个权值的偏导数。我们用l来表示当前层,那么当前层的输出可以表示为:

xl=f(ul),ul=wlxl-1+bl(6)

其中,输出激活函数f(.)可以为多种函数,一般是sigmoid或者双曲正切函数。sigmoid将输出压缩到[0,1],所以最后的输出平均值一般趋于0。

2.cnn的反向传播(backpropagationpass)

反向传播回来的误差可以看做是每个神经元的基的灵敏度sensitivities(灵敏度的意思就是我们的基b变化多少,误差会变化多少,也就是误差对基的变化率,也就是导数了),定义如下:(第二个等号是根据求导的链式法则得到的)

该导数就是让高层误差反向传播到底层。反向传播就是用下面这条关系式,也即式(8)表达的就是第l层的灵敏度:

其中,表示每个元素相乘,输出层的神经元的灵敏度是不一样的:

最后,对每个神经元运用δ进行权值更新。具体来说就是,对一个给定的神经元,得到它的输入,然后用这个神经元的δ来进行缩放。用向量的形式表述就是,对于第l层,误差对于该层每一个权值(组合为矩阵)的导数是该层的输入(等于上一层的输出)与该层的灵敏度(该层每个神经元的δ组合成一个向量的形式)的叉乘。然后得到的偏导数乘以一个负学习率就是该层的神经元的权值的更新:

3.cnn的卷积层(convolutionlayers)

cnn网络中卷积层bp网络进行更新。在一个卷积层,上一层的特征maps被一个可学习的卷积核进行卷积,然后通过一个激活函数,就可以得到输出特征map。每一个输出map可能是组合卷积多个输入maps的值:

其中,mj表示选择的输入maps的集合,每一个输出map会给一个额外的偏置b,但是对于一个特定的输出map,卷积每个输入maps的卷积核是不一样。也就是说,如果输出特征mapj和输出特征mapk都是从输入mapi中卷积求和得到,那么对应的卷积核是不一样的。

3.1cnn的梯度计算(computingthegradients)

假定每个卷积层l都会接一个下采样层l+1。对于bp来说,要想求得层l的每个神经元对应的权值的权值更新(利用公式(11)),就需要先求层l的每一个神经节点的灵敏度δ,求解灵敏度δ,需要先对下一层节点(连接到当前层l的感兴趣节点的第l+1的节点)的灵敏度求和,得到δl+1;然后再乘以这些连接对应的权值(连接第l层感兴趣节点和第l+1层节点的权值)w。再乘以当前层l的该神经元节点的输入u的激活函数f的导数值,这样就可以得到当前层l每个神经节点对应的灵敏度δl了。

因为下采样的存在,采样层的一个像素(神经元节点)对应的灵敏度δ对应于卷积层(上一层)的输出map的一块像素(采样窗口大小)。因此,层l中的一个map的每个节点只与l+1层中相应map的一个节点连接。为了有效计算层l的灵敏度,我们需要上采样upsample这个下采样downsample层对应的灵敏度map(特征map中每个像素对应一个灵敏度,所以也组成一个map),这样才使得这个灵敏度map大小与卷积层的map大小一致,然后再将层l的map的激活值的偏导数与从第l+1层的上采样得到的灵敏度map逐元素相乘(利用公式(8))。

在下采样层map的权值都取一个相同值β,而且是一个常数。所以我们只需要将上一个步骤得到的结果乘以一个β就可以完成第l层灵敏度δ的计算。我们可以对卷积层中每一个特征mapj重复相同的计算过程。但很明显需要匹配相应的子采样层的map(参考公式(8)):

up(.)表示一个上采样操作。如果下采样的采样因子是n的话,它简单的将每个像素水平和垂直方向上拷贝n次。这样就可以恢复原来的大小了。实际上,这个函数可以用kronecker乘积来实现:

对于一个给定的map,我们就可以计算得到其灵敏度map了。然后我们就可以通过简单的对层l中的灵敏度map中所有节点进行求和快速的计算bias基的梯度了:

最后,对卷积核的权值的梯度就可以用bp算法来计算,另外,很多连接的权值是共享的,因此,对于一个给定的权值,我们需要对所有与该权值有联系(权值共享的连接)的连接对该点求梯度,然后对这些梯度进行求和,就像上面对bias基的梯度计算一样:

其中,中的在卷积的时候与逐元素相乘的patch,输出卷积map的(u,v)位置的值是由上一层的(u,v)位置的patch与卷积核k_ij逐元素相乘的结果。

4.cnn的子采样层(sub-samplinglayers)

对于子采样层来说,有n个输入maps,就有n个输出maps,只是每个输出map都变小了。

down(.)表示一个下采样函数。典型的操作一般是对输入图像的不同nxn的块的所有像素进行求和。这样输出图像在两个维度上都缩小了n倍。每个输出map都对应一个属于自己的乘性偏置β和一个加性偏置b。

4.1cnn的梯度计算(computingthegradients)

计算卷积核的梯度,需找到输入map中哪个patch对应输出map的哪个像素。这里,就是必须找到当前层的灵敏度map中哪个patch对应与下一层的灵敏度map的给定像素,这样才可以利用公式(8)那样的δ递推,也就是灵敏度反向传播回来。另外,需要乘以输入patch与输出像素之间连接的权值,这个权值实际上就是卷积核的权值(已旋转的)。

对b和β计算梯度了。首先,加性基b的计算和上面卷积层的一样,对灵敏度map中所有元素加起来就可以了:

而对于乘性偏置β,因为涉及到了在前向传播过程中下采样map的计算,所以我们最好在前向的过程中保存好这些maps,这样在反向的计算中就不用重新计算了。定义:

这样,对β的梯度就可以用下面的方式计算:

步骤s103:通过第二神经网络模型获得每个特征向量序列对应的字符串片段的识别结果的第一概率值。

所述第二神经网络模型可以是lstm算法(longshort-termmemory;长短期记忆)模型。

具体的lstm算法是由于rnn的梯度消失和梯度暴增的不足提出的一种算法。且有着短时的记忆能力。一般使用bptt(backpropagationthroughtime)来进行梯度的更新。lstm网络中,将一般的rnn网络中的神经元换成了block,其示意图如图3所示。

一个lstm层由多个block连接而成,如上图3所示。这些block包含一个或者多个循环连接记忆单元,也即图3中的cell,还包含其他的三个单元:输入门(inputgate)、输出门(outputgate)和遗忘门(forgetgate)。顾名思义,其中输入门和输出门就是输入和输出数据的,图中∫g和∫h;网络通过初始化遗忘门的值为1,来调整是“遗忘”还是“记住”当前所输入的数据。

1.lstm的前向传播

假设当前时刻为t1,前一时刻为t0,网络每迭代一步,存储所有的隐层单元,并激活每次输出;其中,n为网络中的神经元总数,wij代表从神经元i到神经元j的权重。对于每一个lstmblock,分别用l,φ,ω代表输入门,遗忘门和输出门的参数,c表示cells集合c的一个元素,sc表示cellc的状态值,f为门的压缩函数,g和h代表cell的输入和输出压缩函数。则有,

输入门(inputgates):

yl=f(xl)

yl=f(xl)

遗忘门(forgetgates):

yφ=f(xφ)

cells:

sc=yφsc(t-1)+ylg(xc)

输出门(outputgates):

yω=f(xω)

celloutput:

2.lstm的反向传播

假设当前开始时间为t1,反向传播迭代过程用标准的bptt来进行参数的更新:定义,

ε(t1)=ej(t1)

对于每一个lstmblock,值δ用以下公式进行计算:

celloutput:

输出门(outputgates):

状态值(states):

cells:

遗忘门(forgetgates):

输入门(inputgates):

利用标准的bptt,计算δ得到相应的误差值:

定义

定义

步骤s104:通过损失函数模块执行以下过程:枚举组成所述手写字符串的各个所述字符串片段组合,并根据所述第一概率值来计算各个字符串片段组合的第二概率值,选择第二概率值最大的字符串片段组合作为所述手写字符串的初步识别结果。

具体的,所述损失函数模块可以是ctc(connectionisttemporalclassification)模型。

举例来说明该ctc模型的算法,假设原始图像p包含手写字符串“abc”(也可以是汉字),其分解为k个子图像,k个子图像经cnn模型生成的特征向量序列可能被识别为“a”、“b”、“c”或其它(如空白字符串等),此仅为举例,未必以此为限。

定义该其它字符串为blank,用“_”来表示,则字符串abc,可能会被“分割”成以下h种情况{_aa_bc,_a__b_c,...,_a_bb_c},每一种情况对应一种字符串片段组合,所以输入的图像p最终被识别为字符串abc的概率为:

其中,

p(_aa_b...c_|p)=p(_|v11)·p(a|v12)·p(a|v13)·p(_|v14)·p(b|v15)...p(c|v1k-1)·p(_|v1k)

(a2)

同理,

p(_a__...bc|p)=p(_|v21)·p(a|v22)·p(_|v23)·p(_|v24)...p(b|v2k-1)p(c|v2k)(a3)

p(_a_bb_...c|p)=p(_|vh1)·p(a|vh2)·p(b|vh3)·p(b|vh4)·p(_|vh5)...p(c|vhk)(a4)

其中,a2~a4中的各个子图像的特征向量序列如p(_|v11)等均可在上述步骤103中求得的各个第一概率值中获得,因此,可据以求得各个字符串片段组合的第二概率值。

由于被“分割”的每张子图像经过cnn网络以后,都有其各自的特征向量序列,所以这里假设条件为独立的,每一个字图像的信息,只与该子图像的特征向量序列有关。在实际运算中,上述公式(a2)-(a4)将相同字符合并,例如_aa_bc_合并为abc,并将空白符“_”去除。

进而,取其中第二概率值最大的为原始图像p中手写字符串abc的识别结果,然后利用随机梯度下降法进行第一神经网络模型(如cnn)、第二神经网络模型(如lstm)、和损失函数模块(如ctc)的训练。

于本发明的一实施例中,在测试过程中,也即解码过程中,利用beam-search结合语言模型的方式获取到第三概率值,其值是取top20个结果作为候选结果;也即在步骤s104中p(abc|p),在实际的应用中字符串“abc”经过ctc后,也即步骤s104中,字符串“abc”被分割为h中情况中,有的最终被解码和合并为ab,ac,bc,abc等多种情况,在上述步骤中只举例abc的情况;所以在此假设经过步骤s104后(也即ctc),上述字符串通过公式a2~a4的概率值假设为pctc-ab,pctc-ac,pctc-bc,pctc-abc,其每个被解码并被合并以后的字符串的语言模型概率为pab,pac,pbc,pabc,则最终解码的值为:

...

其中

最终选择上述(a5)~(a8)中概率最大的那个值所对应的序列为解码的最终字符串识别结果。

本发明专利提供的技术方案,不同于传统的连续手写字识别,不需要通过对连续字体准确切割成孤立字体去识别,可结合cnn、lstm及ctc的技术,对再终端输入的连续手写字进行识别,识别速度达20毫秒/词(字),与传统的连续手写字识别方法相比,响应速度和准确率都有了提高,从而用户体验得到了很大的提升。

如图4所示,本发明提供一种连续手写字识别系统的实施例,其原理与上述方法实施例大致相同,因此,实施例间可通用的技术特征不作重复赘述;所述系统包括:图像处理模块401,用于分割包含手写字符串的主图像为多个子图像;第一神经网络模块402,用于分别对所述多个子图像进行特征提取以得到对应数量个特征向量序列;第二神经网络模块403,获得每个特征向量序列对应的字符串片段的识别结果的第一概率值;损失函数模块404,枚举组成所述手写字符串的各个所述字符串片段组合,并根据所述第一概率值来计算各个字符串片段组合的第二概率值,选择第二概率值最大的字符串片段组合作为所述手写字符串的初步识别结果。

于本发明的一实施例中,所述第一神经网络模块402包括:cnn模型。

于本发明的一实施例中,所述第二神经网络模块403包括:lstm模型。

于本发明的一实施例中,所述损失函数模块404包括:ctc模型。

于本发明的一实施例中,所述第一神经网络模块402、第二神经网络模块403、及损失函数模块404中的一或多者通过随机梯度下降算法进行训练。

于本发明的一实施例中,各所述子图像尺寸相同;相邻子图像间有部分重叠或边缘相接。

综上所述,本发明的连续手写字识别方法及系统,通过分割包含手写字符串的主图像为多个子图像;通过第一神经网络模型分别对所述多个子图像进行特征提取以得到对应数量个特征向量序列;通过第二神经网络模型获得每个特征向量序列对应的字符串片段的识别结果的第一概率值;通过损失函数模块执行以下过程:在网络训练过程中,枚举组成所述手写字符串的各个所述字符串片段组合,并根据所述第一概率值来计算各个字符串片段组合的第二概率值,选择第二概率值最大的字符串片段组合作为所述手写字符串的初步识别结果,在网络测试过程中,也即解码过程中,经过损失函数模块后的第二概率值结合语言模型,得到的结果,从其中选择概率最大的结果作为最终结果(可视为第三概率值);不需要通过对连续字体准确切割成孤立字体去识别,且配合神经网络模型进行学习识别,快速准确,提升用户体验。

本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。

上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1