您的位置:首页 >聚焦 >

【新视野】【关于 OCR 光学字符识别】 那些你不知道的事

2022-10-24 17:09:06    来源:程序员客栈

作者简介

作者:杨夕

推荐系统 百面百搭地址:


(相关资料图)

https://github.com/km1994/RES-Interview-Notes

NLP 百面百搭地址:

https://github.com/km1994/NLP-Interview-Notes

个人笔记:

https://github.com/km1994/nlp_paper_study

关注公众号 【关于NLP那些你不知道的事】 加入 【NLP && 推荐学习群】一起学习!!!

NLP && 推荐学习群【人数满了,加微信 blqkm601】

一、什么是 OCR?

光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。亦即将图像中的文字进行识别,并以文本的形式返回。

OCR的分类:

印刷体识别

介绍:印刷体大多都是规则的字体,这些字体都是计算机生成再通过打印技术印刷到纸上;

存在问题:在印刷过程中字体很有可能变得断裂或者墨水粘连,使得OCR识别异常困难

手写体识别

介绍:人手写文字;

存在问题:因为人类手写的字往往带有个人特色,每个人写字的风格基本不一样,虽然人类可以读懂你写的文字,但是机器缺很难

二、OCR 应用场景?

OCR的应用场景 可以分为两种:

识别特定场景的专用OCR

应用:证件识别、车牌识别

车辆识别代码

机票识别

识别多种场景的通用OCR

应用:场景不固定;

难度:由于通用图片的场景不固定,文字布局多样,因此难度更高;

三、OCR 技术路线是怎么样?

OCR 技术路线 可以 分为以下 技术路线:

3.1 图像预处理

动机:常见图片存在 文字布局多样,扭曲,模糊,光线不均和等问题,如果不做处理,直接使用,容易丢失大量有效信息,从而导致 识别效果低下;

常用的图像预处理:几何变换(透视、扭曲、旋转等)、畸变校正、去除模糊、图像增强和光线校正等;

采用的 图像预处理方法:

传统 OCR 图像预处理方法:

介绍:基于数字图像处理和传统机器学习等方法对图像进行处理和特征提取;

常用方法:HoG

优点:有利于增强简单场景的文本信息;

缺点:对于图像模糊、扭曲等问题鲁棒性很差,对于复杂场景泛化能力不佳;

基于 深度学习 OCR 图像预处理方法:

介绍:使用基于深度学习的神经网络作为特征提取手段;

常用方法:基于CNN的神经网络

优点:CNN强大的学习能力,配合大量的数据可以增强特征提取的鲁棒性,面临模糊、扭曲、畸变、复杂背景和光线不清等图像问题均可以表现良好的鲁棒性;

缺点:需要大量标注数据;

3.2 文字检测

动机:常见的图片 不仅 包含 有用的文字,还存在 大量的背景信息,这些背景信息 对于 模型容易存在误导作用;

介绍:文字检测即检测文本的所在位置和范围及其布局,即 识别哪里有文字,文字的范围有多大 等问题;

采用的 图像预处理方法:Faster R-CNN、FCN、RRPN、TextBoxes、DMPNet、CTPN、SegLink 等;

3.3 文本识别

动机:虽然 知道 图片中文字的具体位置,但是 如何知道这些文字是什么呢?

介绍:在文本检测的基础上,对文本内容进行识别,将图像中的文本信息转化为文本信息;

采用的 图像预处理方法:CNN+Softmax、CNN+RNN+CTC、CNN+RNN+Attention 等;

四、OCR 识别库 有哪些?4.1 pytesseract

介绍:pytesseract是基于Python的OCR工具, 底层使用的是Google的Tesseract-OCR 引擎,支持识别图片中的文字,支持jpeg, png, gif, bmp, tiff等图片格式。本文介绍如何使用pytesseract 实现图片文字识别。

环境配置

Python 3.6+

PIL库

安装Google Tesseract OCR

系统:windows/mac/linux,我的系统是Windows10

安装

安装Google Tesseract

Tesseract 下载地址

Tesseract OCR github地址:https://github.com/tesseract-ocr/tesseract    Windows Tesseract下载地址:https://digi.bib.uni-mannheim.de/tesseract/    Mac和Linux安装方法参考:https://tesseract-ocr.github.io/tessdoc/Installation.html

Tesseract 安装(记得下载 中文语言包)

Tesseract 配置

安装完成后,添加到环境变量PATH中

测试 是否安装成功

$ tesseractUsage:  tesseract --help | --help-extra | --version  tesseract --list-langs  tesseract imagename outputbase [options...] [configfile...]OCR options:  -l LANG[+LANG]        Specify language(s) used for OCR.NOTE: These options must occur before any configfile.Single options:  --help                Show this help message.  --help-extra          Show extra help for advanced users.  --version             Show version information.  --list-langs          List available languages for tesseract engine.

安装 pytesseract

Tesseract 下载地址

Python tesseract:https://github.com/madmaze/pytesseract

pip安装pytesseract

$pip install Pillow    $pip install pytesseract

pytesseract 使用

先准备一张包含英文字符的图片,下面的代码实现提取图片中的中文和英文字符,并识别为字符串:

import pytesseracttry:    from PIL import Imageexcept ImportError:    import Image# 列出支持的语言print(pytesseract.get_languages(config=""))print(pytesseract.image_to_string(Image.open("test.png"), lang="chi_sim+eng"))>>>生 63 211 80 227 0存 81 209 118 227 0是 122 211 139 226 0文 126 200 154 231 0明 142 210 157 226 0的 162 209 197 227 0第 200 217 218 219 0一 221 209 236 226 0需 217 200 253 231 0要 239 209 259 226 0。 260 211 266 216 0猜 325 64 364 82 0疑 364 64 481 82 0链 373 54 393 86 0和 383 54 403 86 0技 403 54 435 86 0术 419 54 451 86 0爆 441 54 477 86 0炸 469 54 485 86 0##############################levelpage_numblock_numpar_numline_numword_numlefttopwidthheightconftext11000000566279-1211000635220318-1311100635220318-1411110635220318-15111116352551896生存51111212253171596是51111312648313196文明51111416252351896的5111152006018291第51111622153151793一51111721748423193需要511118260636591。21200032519715618-131210032519715618-141211032519715618-15121113251971561894猜疑512112373193203277链512113383193203292和512114403193483296技术512115441193443294爆炸

4.2 PaddleOCR4.2.1 PaddleOCR 介绍

PaddleOCR是百度开源的一款基于深度学习的ocr识别库,对中文的识别精度相当不错,可以应付绝大多数的文字提取需求。

4.2.2 PaddleOCR 预训练权重 介绍

关于预训练权重,PaddleOCR 官网根据提供权重文件大小分为两类:

一类为轻量级,(检测+分类+识别)三类权重加起来大小一共才 9.4 M,适用于手机端和服务器部署;

另一类(检测+分类+识别)三类权重内存加起来一共 143.4 MB ,适用于服务器部署;无论模型是否轻量级,识别效果都能与商业效果相比,在本期教程中将选用轻量级权重用于测试;

4.2.3 PaddleOCR 环境介绍

PaddlePaddle 2.0.0    Python 3.7    glibc 2.23    cuDNN 7.6+(GPU)

4.2.4 PaddleOCR 使用

新建环境

$ conda create -n paddle38 python=3.8

安装paddlepaddle-gpu

$ pip install paddlepaddle-gpu

PaddleOCR 使用

import osimport csvimport timefrom paddleocr import PaddleOCR, draw_ocr # Paddleocr目前支持中英文、英文、法语、德语、韩语、日语,可以通过修改lang参数进行切换# 参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`。ocr = PaddleOCR(use_angle_cls=True, use_gpu=True, lang="ch")  # need to run only once to download and load model into memory# 选择你要识别的图片路径def test_ocr(img_path):    result = ocr.ocr(img_path, cls=True)    OCR_result = []    for line in result:        OCR_result.append(line[1][0])    res = " ".join(OCR_result)    print(res)    return res if __name__ == "__main__":    """    读取filepath下的所有jpg文件,图片识别之后存入save_file中,加上识别每张图片的时间    """    save_file = "result_1223.csv"    filePath = "pics/"    paths = os.listdir(filePath)    with open(save_file, "w", encoding="utf-8",newline="") as save_f:        writer = csv.writer(save_f)        # 先写入columns_name        writer.writerow(["url", "paddle_ocr", "ocr_time"])        for i in paths:            a = time.time()            img_path = f"{filePath}{i}"            baidu_res = test_ocr(img_path)            b1 = time.time() - a            line = [i, baidu_res, b1]            # 写入多行用writerows            writer.writerow(line)

PaddleOCR 识别结果

4.2.5 PaddleOCR 安装过程中问题列表

问题一:Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools":http://landinghub.visualstudio.com/visual-cpp-build-tools

问题介绍

error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

【解决】:python_Levenshtein‑0.12.0‑cp36‑cp36m‑win_amd64.whl

下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

pip install C:\Users\IMMOTOR\Desktop\python_Levenshtein-0.12.0-cp36-cp36m-win_amd64.whl

问题二:Could not find a version that satisfies the requirement fasttext

0.9.1 (from paddleocr) (from versions: )No matching distribution found for fasttext

0.9.1 (from paddleocr)

Could not find a version that satisfies the requirement fasttext==0.9.1 (from paddleocr) (from versions: )No matching distribution found for fasttext==0.9.1 (from paddleocr)

【解决】:安装之,pip install fasttext==0.9.1

问题三:升级jinja2:

pip install Jinja2 --upgrade

问题四:No module named "paddle"

ModuleNotFoundError: No module named "paddle"

【解决】:python -m pip install paddlepaddle -ihttps://mirror.baidu.com/pypi/simple

问题五:xlrd.biffh.XLRDError: Excel xlsx file

pip uninstall xlrd    pip install xlrd==1.2.0

问题五:paddleOCR识别速度过慢

python paddleocr 增加识别速度的方法

切记长度不要超过960px

【解决】:

模型压缩 enable_mkldnn=True,use_tensorrt=True,use_angle_cls=False

ocr = PaddleOCR(enable_mkldnn=True,use_tensorrt=True,use_angle_cls=False,use_gpu= False)    text=ocr.ocr(img_name) #打开图片文件

参考

OCR技术简介

【OCR技术系列一】光学字符识别技术介绍

适合小白的几个入门级Python ocr识别库

Python OCR工具pytesseract详解

PaddleOCR

PaddleOCR详解

十分钟掌握PaddleOCR使用

所有文章

五谷杂粮

超1900星标!自然语言处理论文学习笔记

超500星标!自然语言处理 面经

超500星标!推荐系统 面经

推广搜 军火库【持续更新】

NLP百面百搭

【算法基础篇】

【关于 过拟合和欠拟合】那些你不知道的事

【关于 BatchNorm vs LayerNorm】那些你不知道的事

【关于 激活函数】那些你不知道的事

【关于 正则化】那些你不知道的事

【关于 优化算法】那些你不知道的事

【关于 归一化】那些你不知道的事

【关于 判别式(discriminative)模型 vs. 生成式(generative)模型】 那些你不知道的事

【机器学习篇】

【关于 逻辑回归】那些你不知道的事

【关于 支持向量机】 那些你不知道的事

【关于 集成学习】那些你不知道的事

【深度学习篇】

【关于 CNN】那些你不知道的事(上)

【关于 CNN】那些你不知道的事(下)

【关于 Attention 】那些你不知道的事

【关于Transformer】 那些的你不知道的事(上)

【关于Transformer】 那些的你不知道的事(中)

【关于Transformer】 那些的你不知道的事 (下)

【预训练模型篇】

【关于 TF-idf】 那些你不知道的事

【关于 Word2vec】 那些你不知道的事

【关于 fastText】 那些你不知道的事

【关于Bert】 那些的你不知道的事(上)

【关于Bert】 那些的你不知道的事(下)

【关于 Bert 源码解析I 之 主体篇 】 那些的你不知道的事

【关于 Bert 源码解析II 之 预训练篇 】 那些的你不知道的事

【关于 Bert 源码解析III 之 微调 篇 】 那些的你不知道的事

【关于 Bert 源码解析IV 之 句向量生成篇 】 那些的你不知道的事

【Bert 越大越精篇】

XLNet->RoBERTa->ELECTRA->ERNIE 1.0->... 】那些的你不知道的事(一)" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2" wah-hotarea="click" hasload="1">【关于 Bert 越大越精序列】那些的你不知道的事(一)

【关于 Bert 越大越精序列】那些的你不知道的事(二)

【关于 Bert 越大越精序列】那些的你不知道的事(三)

【Bert 短小精悍篇】

【关于 Bert 压缩】 那些你不知道的事

【关于 BERT to TextCNN】那些你不知道的事

【关于 FastBERT 实现】那些你不知道的事

【关于自训练 + 预训练 = 更好的自然语言理解模型 】 那些的你不知道的事

【文本分类篇】

【关于 文本分类】那些你不知道的事

【关于 文本分类 trick】那些你不知道的事

【关键词提取】

【关于 关键词提取】 那些你不知道的事

【关于 KeyBERT 】 那些你不知道的事

【命名实体识别】

【关于 HMM】 那些你不知道的事

【关于 MEMM】 那些你不知道的事

【关于 CRF】 那些你不知道的事

【关于 DNN-CRF】 那些你不知道的事

【关于 中文领域 NER】 那些你不知道的事

【关于 NER trick】 那些你不知道的事

【问答系统】

【关于 FAQ 检索式问答系统】 那些你不知道的事

【关于 KBQA】 那些你不知道的事

【关于 对话系统】那些你不知道的事

【多标签文本分类篇】

Multi-Class is Multi-Label ???

【trick 篇】

NLP常见trick汇总及代码实现

【关于BERT如何处理篇章级长文本】那些你不知道的事

当Bert遇到未登录词?也许你应该这样做!

【其他】

NLP论文学习篇【文本摘要】自然语言处理任务系列——文本摘要【指代消歧】自然语言处理任务系列——指代消解(共指消解【文本纠错】自然语言处理任务系列——文本纠错【其他】

推荐系统 百面百搭

【关于 推荐系统 导论篇】 那些你不知道的事

【关于 推荐系统百面百搭 导论篇】 那些你不知道的事

推荐系统机器学习篇

【关于 协同过滤篇】 那些你不知道的事

【关于 矩阵分解篇】 那些你不知道的事

torch 学习篇

Bert4torch 快速入门实战

Rasa 对话系统

《【社区说】一起来聊聊 Rasa 3.0》 不完全笔记

(一)对话机器人概述

(二)RASA开源引擎介绍

(三)RASA NLU语言模型

(四)RASA NLU分词器

(五)RASA NLU特征生成器

(六)RASA NLU意图分类器

(七)RASA NLU实体提取器

(九)RASA自定义pipeline组件

(十)RASA CORE Policy

(十一)RASA CORE Action

(十二)RASA Domain

(十三)RASA 训练数据

(十四)RASA story

(十五)Rasa Rules

(十六)RASA最佳实践

(十七)基于RASA开始中文机器人

(十八)基于RASA开始中文机器人实现机制

(十九)基于知识图谱的问答系统(KBQA)

(二十)基于阅读理解的问答系统

(二十一)RASA应用常见问题

(二十二)RASA的超参数优化

(二十三)机器人测试与评估

(二十四)利用Rasa Forms创建上下文对话助手

DIET:Dual Intent and Entity Transformer——RASA论文翻译

知识图谱入门

浙大图谱讲义 | 第一讲-知识图谱概论 — 第1节-语言与知识

浙大图谱讲义 | 第一讲-知识图谱概论 — 第2节-知识图谱的起源

图谱讲义 | 第一讲-第3节-知识图谱的价值

图谱讲义 | 第一讲-第4节-知识图谱的技术内涵

图谱讲义 | 第二讲-第1节-什么是知识表示

转载记录

Bert与TensorRT部署手册,享受丝滑的顺畅

句向量新方案CoSENT实践记录

CHIP2021|临床术语标准化第三名方案开源

CHIP2021 | 医学对话临床发现阴阳性判别任务第一名方案开源

破解transformer八股,快问快答

BERT可视化工具bertviz体验

PRGC:一种新的联合关系抽取模型

给神经网络加入先验知识!

CBLUE中文医学语言理解测评Baseline

关键词: 你不知道的事 推荐系统 自然语言处理

相关阅读