首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何让机器读懂图片上的文字?飞桨助您快速了解OCR

如何让机器读懂图片上的文字?飞桨助您快速了解OCR

作者头像
用户1386409
发布2019-09-09 15:46:26
2.7K0
发布2019-09-09 15:46:26
举报
文章被收录于专栏:PaddlePaddlePaddlePaddle

1.OCR技术概述

OCR(Optical Character Recognition),译为光学字符识别,是指通过扫描等光学输入方式将各种票据、报刊、书籍、文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的计算机输入技术。

在不久前的首届“中国人工智能·多媒体信息识别技术竞赛”中,百度一举斩获印刷文本OCR、人脸识别和地标识别三项任务中的A级证书,其中印刷文本OCR的成绩更是摘得冠军,且因成绩显著优于其他参赛团队,成为该任务94支参赛队伍中唯一获得A级证书的单位。

在OCR技术出现之前,要把大量的卡证牌照、票据表单、纸质文档上的文字信息录入电脑,只能依赖人工,效率低下,而且极易出错。

随着OCR技术的成熟,“人工数字化”的现状被打破,OCR自动化识别代替了人工录入,大大节约了人力成本,有效提升了业务效率。

OCR技术的应用场景非常广泛:

(1)拍照/截图识别

使用OCR技术,实现拍照文字识别、相册图片文字识别和截图文字识别,可应用于搜索、书摘、笔记、翻译等移动应用中,方便用户进行文本的提取或录入,有效提升产品易用性和用户使用体验。

识别结果:

(2)内容审核与监管

使用OCR技术,实现对图像中文字内容的提取,结合文本审核技术识别违规内容,提示相应风险,协助进行违规处理,可应用于电商广告审核、舆情监管等场景,帮助用户有效规避业务风险。

(图片来自网络)

识别结果:

(3)视频内容分析

使用OCR技术,实现对视频中的字幕、标题、弹幕等文字内容的检测和识别,并根据文字位置判断文字类型,可应用于视频分类和标签提取、视频内容审核、营销分析等场景,有效降低人力成本,控制业务风险。

(图片来自网络)

识别结果:

(4)纸质文档电子化

使用OCR技术,实现对各类医疗单据、金融财税票据、法律卷宗等纸质文档的识别,并返回文字在图片中的位置信息以便于进行比对、结构化等处理,可满足医疗、金融、政务、法务、教育等行业文档快速录入、存档和检索的需求,有效降低企业人力成本,提高信息录入效率。

(注:以上识别效果来源百度AI开放平台,感兴趣的用户可以在线体验)

2.OCR技术原理

从整体上来说,OCR技术可以分为图像处理和文字识别两大阶段:

  • 图像处理阶段:包含图像输入、图像预处理、版面分析、字符切割等子步骤。
  • 文字识别阶段:包含特征提取、字符识别、版面恢复、后处理等子步骤。

流程图如下:

【文本检测】

  • 图像输入:读取不同格式的图像文件。
  • 图像预处理:包含灰度化、二值化、图像降噪、倾斜矫正等预处理步骤。
  • 版面分析:针对左右两栏等特殊排版,进行版面分析并划分段落。
  • 字符切割:对图像中的文本进行字符级的切割,尤其注意字符粘连等问题。

【文本识别】

  • 特征提取:对字符图像提取关键特征并降维,用于后续的字符识别算法。
  • 字符识别:依据特征向量,基于模版匹配分类法或深度神经网络分类法,识别出字符。
  • 版面恢复:识别原文档的排版,按照原排版的格式将识别结果输出。
  • 后处理:引入语言模型或人工检查,修正“分”和“兮”等形近字。

从整体上来看,OCR 的步骤繁多,涉及到的算法也很复杂。针对每一个步骤的每一个算法,都有单独的研究论文。如果从零开始做 OCR,将是一个十分浩大的工程。飞桨先从一个入门的实验开始,教您如何借助飞桨快速实现OCR功能。

3.飞桨OCR快速上手

3.1 任务介绍

本次实验的任务是最简单的任务:识别图片中单行英文字符,从这个简单的任务开始,主要是熟悉OCR的关键技术点,实际上OCR的技术有很多,一般都是文本检测+文本识别,比如经典的CRNN+CTC、Seq2seq+Attention,考虑到文本检测涉及到的内容比较复杂,我们主要以CTC(Connectionist Temporal Classification) 模型为例,前提假设文本已经检测到,限定在一个比较小的行内,然后如何来进行文本识别部分的内容。

编码部分,首先采用卷积将图片转为特征图, 然后再将特征图转为序列,通过双向GRU学习到序列特征。

损失函数在训练过程选用的损失函数为CTC loss,这也是CTC算法称呼的来源。预测阶段采用的是贪婪策略和CTC解码策略。评估指标是样本级别的错误率。

3.2 数据示例

数据的下载和简单预处理都在data_reader.py中实现。

数据示例:

我们使用的训练和测试数据如下图所示,每张图片包含单行不定长的英文字符串,这些图片都是经过检测算法进行预框选处理的。

在训练集中,每张图片对应的label是汉字在词典中的索引。图1 对应的label如下所示:

80,84,68,82,83,72,78,77,68,67

在上边这个label中,80 表示字符Q的索引,67 表示英文字符D的索引。

3.3 数据准备

(1)训练集

我们需要把所有参与训练的图片放入同一个文件夹,暂且记为train_images。然后用一个list文件存放每张图片的信息,包括图片大小、图片名称和对应的label,这里暂记该list文件为train_list,其格式如下所示:

185 48 00508_0215.jpg 7740,5332,2369,3201,4162
48 48 00197_1893.jpg 6569
338 48 00007_0219.jpg 4590,4788,3015,1994,3402,999,4553
150 48 00107_4517.jpg 5936,3382,1437,3382
...
157 48 00387_0622.jpg 2397,1707,5919,1278

文件train_list,上述文件中的每一行表示一张图片,每行被空格分为四列,前两列分别表示图片的宽和高,第三列表示图片的名称,第四列表示该图片对应的sequence label。最终我们应有以下类似文件结构:

|-train_data
    |- train_list
    |- train_imags
        |- 00508_0215.jpg
        |- 00197_1893.jpg
        |- 00007_0219.jpg
        | ...

在训练时,我们通过选项--train_images 和 --train_list 分别设置准备好的train_images 和train_list。

在data_reader.py中,会按照用户设置的DATA_SHAPE调整训练数据的高度。用户可以根据自己准备的训练数据,设置合适的DATA_SHAPE。如果使用默认的示例数据,则使用默认的DATA_SHAPE即可。

注:如果--train_images 和 --train_list都未设置或设置为None, data_reader.py会自动下载使用示例数据,并将其缓存到$HOME/.cache/paddle/dataset/ctc_data/data/ 路径下。

(2)测试集和评估集

测试集、评估集的准备方式与训练集相同。在训练阶段,测试集的路径通过train.py的选项--test_images和 --test_list 来设置。在评估时,评估集的路径通过eval.py的选项--input_images_dir 和--input_images_list 来设置。

在data_reader.py中,会按照用户设置的DATA_SHAPE调整测试图像的高度,所以测试图像可以有不同高度。但是,DATA_SHAPE需要和训练模型时保持严格一致。

(3)待预测数据集

预测支持三种形式的输入:

第一种:设置--input_images_dir和--input_images_list, 与训练集类似, 只不过list文件中的最后一列可以放任意占位字符或字符串,如下所示:

185 48 00508_0215.jpg s
48 48 00197_1893.jpg s
338 48 00007_0219.jpg s
...

第二种:仅设置--input_images_list, 其中list文件中只需放图片的完整路径,如下所示:

data/test_images/00000.jpg
data/test_images/00001.jpg
data/test_images/00003.jpg

第三种:从stdin读入一张图片的path,然后进行一次inference.

在data_reader.py中,会按照用户设置的DATA_SHAPE调整预测图像的高度,所以预测图像可以有不同高度。但是,DATA_SHAPE需要和训练模型时保持严格一致。

3.4 模型训练

使用默认数据在GPU单卡上训练:

env CUDA_VISIBLE_DEVICES=0python train.py

使用默认数据在CPU上训练:

env python train.py--use_gpu False --parallel=False

使用默认数据在GPU多卡上训练:

env CUDA_VISIBLE_DEVICES=0,1,2,3 python train.py --parallel=True

默认模型使用的是CTC model,执行python train.py --help可查看更多使用方式和参数详细说明。

下图为使用默认参数在默认数据集上训练CTC model的收敛曲线,其中横坐标轴为训练迭代次数,纵轴为样本级错误率。其中,蓝线为训练集上的样本错误率,红线为测试集上的样本错误率。测试集上最低错误率为22.0%。

3.5 模型测试

通过以下命令调用评估脚本用指定数据集对模型进行评估:

env CUDA_VISIBLE_DEVICES=0 python eval.py \
    --model_path="./models/model_0" \
    --input_images_dir="./eval_data/images/" \
    --input_images_list="./eval_data/eval_list"

执行python train.py --help可查看参数详细说明。

3.6 模型预测

从标准输入读取一张图片的路径,并对齐进行预测:

env CUDA_VISIBLE_DEVICES=0 python infer.py \
    --model_path="models/model_00044_15000"

执行上述命令进行预测的效果如下:

-----------  Configuration Arguments -----------
use_gpu: True
input_images_dir: None
input_images_list: None
model_path: /home/work/models/fluid/ocr_recognition/models/model_00052_15000
------------------------------------------------
Init model from: ./models/model_00052_15000.
Please input the path of image: ./test_images/00001_0060.jpg
result: [3298 2371 4233 6514 2378 3298 2363]
Please input the path of image: ./test_images/00001_0429.jpg
result: [2067 2067 8187 8477 5027 7191 2431 1462]

从文件中批量读取图片路径,并对其进行预测:

env CUDA_VISIBLE_DEVICES=0 python infer.py \
    --model_path="models/model_00044_15000" \
    --input_images_list="data/test.list"
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PaddlePaddle 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3.1 任务介绍
  • 3.2 数据示例
    • 3.3 数据准备
      • 3.4 模型训练
        • 3.5 模型测试
          • 3.6 模型预测
          相关产品与服务
          文字识别
          文字识别(Optical Character Recognition,OCR)基于腾讯优图实验室的深度学习技术,将图片上的文字内容,智能识别成为可编辑的文本。OCR 支持身份证、名片等卡证类和票据类的印刷体识别,也支持运单等手写体识别,支持提供定制化服务,可以有效地代替人工录入信息。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档