当前位置:   article > 正文

一文搞定!手把手教你文字识别(识别篇:LSTM+CTC, CRNN, chineseocr方法)

chineseocr

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 

文字识别是AI的一个重要应用场景,文字识别过程一般由图像输入、预处理、文本检测、文本识别、结果输出等环节组成。
 
其中,文本检测、文本识别是最核心的环节。文本检测方面,在前面的文章中已介绍过了多种基于深度学习的方法,可针对各种场景实现对文字的检测,详见以下文章:

【AI实战】手把手教你文字识别(检测篇:MSER、CTPN、SegLink、EAST等方法)

 

【AI实战】手把手教你文字识别(检测篇:AdvancedEAST、PixelLink方法)
 


而本文主要就是介绍在“文本识别”方面的实战方法,只要掌握了这些方法,那么跟前面介绍的文本检测方法结合起来,就可以轻松应对各种文字识别的任务了。话不多说,马上来学习“文本识别”的方法。

文字识别可根据待识别的文字特点采用不同的识别方法,一般分为定长文字、不定长文字两大类别。

  • 定长文字(例如验证码),由于字符数量固定,采用的网络结构相对简单,识别也比较容易;
  • 不定长文字(例如印刷文字、广告牌文字等),由于字符数量是不固定的,因此需要采用比较复杂的网络结构和后处理环节,识别也具有一定的难度。

下面按照定长文字、不定长文字分别介绍识别方法。

一、定长文字识别
定长文字的识别相对简单,应用场景也比较局限,最典型的场景就是验证码的识别了。由于字符数量是已知的、固定的,因此,网络结构比较简单,一般构建3层卷积层,2层全连接层便能满足“定长文字”的识别。
具体方法在之前介绍验证码识别的文章中已详细介绍,在此不再赘述。详见文章:

【AI实战】文字识别(验证码识别)


 
二、不定长文字识别
不定长文字在现实中大量存在,例如印刷文字、广告牌文字等,由于字符数量不固定、不可预知,因此,识别的难度也较大,这也是目前研究文字识别的主要方向。下面介绍不定长文字识别的常用方法:LSTM+CTC、CRNN、chinsesocr。
1、LSTM+CTC 方法
(1)什么是LSTM
为了实现对不定长文字的识别,就需要有一种能力更强的模型,该模型具有一定的记忆能力,能够按时序依次处理任意长度的信息,这种模型就是“循环神经网络”(Recurrent Neural Networks,简称RNN)。
LSTM(Long Short Term Memory,长短期记忆网络)是一种特殊结构的RNN(循环神经网络),用于解决RNN的长期依赖问题,也即随着输入RNN网络的信息的时间间隔不断增大,普通RNN就会出现“梯度消失”或“梯度爆炸”的现象,这就是RNN的长期依赖问题,而引入LSTM即可以解决这个问题。LSTM单元由输入门(Input Gate)、遗忘门(Forget Gate)和输出门(Output Gate)组成,具体的技术原理的工作过程详见之前的文章(文章:白话循环神经网络(RNN)),LSTM的结构如下图所示。
 
(2)什么是CTC
CTC(Connectionist Temporal Classifier,联接时间分类器),主要用于解决输入特征与输出标签的对齐问题。例如下图,由于文字的不同间隔或变形等问题,导致同个文字有不同的表现形式,但实际上都是同一个文字。在识别时会将输入图像分块后再去识别,得出每块属于某个字符的概率(无法识别的标记为特殊字符”-”),如下图:
 
由于字符变形等原因,导致对输入图像分块识别时,相邻块可能会识别为同个结果,字符重复出现。因此,通过CTC来解决对齐问题,模型训练后,对结果中去掉间隔字符、去掉重复字符(如果同个字符连续出现,则表示只有1个字符,如果中间有间隔字符,则表示该字符出现多次),如下图所示
 
(3)LSTM+CTC实现:常量定义
定义一些常量,在模型训练和预测中使用,定义如下:

  1. # 数据集,可根据需要增加英文或其它字符
  2. DIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
  3. # 分类数量
  4. num_classes = len(DIGITS) + 1 # 数据集字符数+特殊标识符
  5. # 图片大小,32 x 256
  6. OUTPUT_SHAPE = (32, 256)
  7. # 学习率
  8. INITIAL_LEARNING_RATE = 1e-3
  9. DECAY_STEPS = 5000
  10. REPORT_STEPS = 100
  11. LEARNING_RATE_DECAY_FACTOR = 0.9
  12. MOMENTUM = 0.9
  13. # LSTM网络层次
  14. num_hidden = 128
  15. num_layers = 2
  16. # 训练轮次、批量大小
  17. num_epochs = 50000
  18. BATCHES = 10
  19. BATCH_SIZE = 32
  20. TRAIN_SIZE = BATCHES * BATCH_SIZE
  21. # 数据集目录、模型目录
  22. data_dir = '/tmp/lstm_ctc_data/'
  23. model_dir = '/tmp/lstm_ctc_model/'

(4)LSTM+CTC实现:随机生成不定长图片数据
为了训练和测试LSTM+CTC识别模型,先要准备好基础数据,可根据需要准备好已标注的文本图片集。在这里,为了方便训练和测试模型,随机生成10000张不定长的图片数据集。通过使用Pillow生成图片和绘上文字,并对图片随机叠加椒盐噪声,以更加贴近现实场景。核心代码如下:

  1. # 生成椒盐噪声
  2. def img_salt_pepper_noise(src,percetage):
  3. NoiseImg=src
  4. NoiseNum=int(percetage*src.shape[0]*src.shape[1])
  5. for i in range(NoiseNum):
  6. randX=random.randint(0,src.shape[0]-1)
  7. randY=random.randint(0,src.shape[1]-1)
  8. if random.randint(0,1)==0:
  9. NoiseImg[randX,randY]=0
  10. else:
  11. NoiseImg[randX,randY]=255
  12. return NoiseImg
  13. # 随机生成不定长图片集
  14. def gen_text(cnt):
  15. # 设置文字字体和大小
  16. font_path = '/data/work/tensorflow/fonts/arial.ttf'
  17. font_size = 30
  18. font=ImageFont.truetype(font_path,font_size)
  19. for i in range(cnt):
  20. # 随机生成110位的不定长数字
  21. rnd = random.randint(1, 10)
  22. text = ''
  23. for j in range(rnd):
  24. text = text + DIGITS[random.randint(0, len(DIGITS) - 1)]
  25. # 生成图片并绘上文字
  26. img=Image.new("RGB",(256,32))
  27. draw=ImageDraw.Draw(img)
  28. draw.text((1,1),text,font=font,fill='white')
  29. img=np.array(img)
  30. # 随机叠加椒盐噪声并保存图像
  31. img = img_salt_pepper_noise(img, float(random.randint(1,10)/100.0))
  32. cv2.imwrite(data_dir + text + '_' + str(i+1) + '.jpg',img)

随机生成的不定长数据效果如下:
 
执行 gen_text(10000) 后生成的图片集如下,文件名由序号和文字标签组成:

(5)LSTM+CTC实现:标签向量化(稀疏矩阵)
由于文字是不定长的,因此,如果读取图片并获取标签,然后将标签存放在一个紧密矩阵中进行向量化,那将会出现大量的零元素,很浪费空间。因此,使用稀疏矩阵对标签进行向量化。所谓“稀疏矩阵”就是矩阵中的零元素远远多于非零元素,采用这种方式存储可有效节约空间。
稀疏矩阵有3个属性,分别是:

  • indices:二维矩阵,代表非零的坐标点
  • values:二维tensor,代表indice位置的数据值
  • dense_shape:一维,代表稀疏矩阵的大小(取行数和列的最大长度)


例如读取了以下图片和相应的标签,那么存储为稀疏矩阵的结果如下:
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/231413?site
推荐阅读
相关标签
  

闽ICP备14008679号