Skip to content

Chinese language recognition

宅教授 edited this page Oct 2, 2019 · 21 revisions

中文识别

第一步,提取文字部分

切割验证码中的的文字部分,并灰度图后,将其保存到data.npy中。

~$ ll -h data.npy
... 21M ... data.npy
~$ python3 -c "import numpy as np;t=np.load('data.npy');print(t.shape)"
(20133, 19, 57)

第二步,借用百度提供的光学字符识别功能

百度文档中心:https://ai.baidu.com/docs#/OCR-API/e1bd77f3

查看百度识别的结果,人工估计,识别的正确率并不高,因此把出现次数多的名词排到前面,人工估计,一共就只有80种名词,后面还有两千多种不对的,详情。假设如果对单个文字图片的识别结果就在这80种内就算是识别正确,将正确的数据存到texts.npz中。

~$ ll -h texts.npz
... 12M ... texts.npz
~$ python3 -c "~;print(t['texts'].shape);print(t['labels'].shape)"
(11164, 19, 57)
(11164,)

这也就是说百度对于12306验证码文字部分识别的正确率为11164/20133 ≈ 55%

第三步,深度学习

让卷积神经网络从texts.npz中学习,前30步如下:

让学习后的卷积神经网络识别前所未见的文字texts.npy。嗯,在此就不公开这让我觉得很开心的结果了。

第五步,借用图片识别器学习有噪声文字图

这真的是第五步,不是我给搞错了。这一步,需要图片识别器才能出生。

我不想再让百度为文字识别器提供训练集,而是让它的好朋友——图片识别器来帮它一把。图片识别器会告诉它,这张验证码中的文字只可能是以下八张图片的名称,将结果保存到texts.v2.npz

~$ ll -h texts.v2.npz
... 12M ... texts.v2.npz
~$ python3 -c "~;print(t['texts'].shape);print(t['labels'].shape)"
(10015, 19, 57)
(10015, 80)

第六步,深度学习

这一步需要已经根据百度文字识别器学习后的模型才能进一步学习,不然将很难入门(其实学习后的模型想入门也不容易),这很容易理解,但是我还是想知道其中隐藏的数学问题,难道这真的只能当做一种经验?

数据的下载地址:

  1. https://drive.google.com/drive/folders/1GDCQyaHr36c7y1H-19pOKjc_EdAI1wn0
  2. https://pan.baidu.com/s/1OsBIBM4rl8EnpZt7VYiD9g