1,前言

之前谈到图片文本 OCR 识别时,写过一篇文章介绍了一个 Python 包 pytesseract ,具体内容可参考

介绍一个Python 包 ,几行代码可实现 OCR 文本识别!这篇文章 ,pytesseract 包是基于 Tesseract 封装得到的,这个包虽然支持多语言文本识别,但对于不同语言文本识别,准确率却不一样,例如英文识别准确率高,而中文文本较低;

英文字符识别,整体来看基本不会出错,但对于图片中的中文字符,经常出现乱码、识别失败,

2,EasyOCR 介绍

今天将介绍一个的用于 文本OCR 新的Python 包 EasyOCR ,这个包是基于训练好的 Deep Learning 模型开发的,模型包含功能:文本检测、文本识别

EasyOCR 包从开源到现在 10 个月不到,但在 Github 已经有 10k+ star,到目前为止经过四次版本迭代,有以下几个特点:

1,到目前为止 支持70+种语言文本识别,包括但不限于 英语、中文、日语、韩语等;
    2,源于深度学习技术,识别精度很高;对于正常图片文本识别来说,准确率能达到 100% ;

3,不仅适用于单语言,同样也适用于多语言(例如一张图片中需要同时识别中文、英语、日语三类语言);

4,支持 GPU 加速,GPU 识别速度要比 CPU 快 6~7 倍;(需要提前配置好 cuda、 pytorch、torchvision Python 环境);

对比传统 OCR 只具有图片文本识别之外,EasyOCR 还具有 文本检测 功能(图片中识别到的文本框,在图片中的定位以 左上、右上、右下、左下 坐标顺序依次返回),效果如下图:

上图中 EasyOCR 最终输出的是右图的 文本信息 ,左图中的红色线框是后面经处理加上去的

3,EasyOCR 使用

上面对 EasyOCR 程序包做了简单介绍,下面介绍一下它的基本用法

安装

EasyOCR 已经上传到 Pypi 上面了,可通过 pip 命令完成安装

pip install easyocr

EasyOCR 的模型是基于 pytorch 框架训练的,在 easyocr 下载同时会下载一些其它附加 python 包,例如 pytorch, torchvision 等,时间需要久一点(需要注意下,easyocr 默认安装的是 pytorch 的 cpu 版本,需要 gpu 配置的小伙伴可以搜一下 pytorch-gpu 相关教程进行配置);

使用方法

虽然 EasyOCR 安装步骤很简单,只有一行代码;但使用过程中会出现包版本不匹配、环境项缺失 等问题,在使用过程中,我遇到了两个因为环境错误导致无法使用的问题,这里我贴在下方并附上解决方案,遇到的小伙伴们可以参考下,当然没遇到的话更好

1,from ._remap import _map_array
ImportError: DLL load failed: The specified module could not be found

该问题是由于 C++ 运行包丢失造成的,解决方案,终端输入以下命令安装即可

pip install msvc-runtime

**2,train error : ImportError: cannot import name ‘Optional’ **

该问题是由于 pytorch 与 torchvision 版本不符造成的,安装 easyocr 时默认安装的 torchvision 版本为 0.5.0,对应 pytorch 相兼容的版本应该为 1.4.0,但通过下方命令安装时

pip install torch==1.14.0

会安装失败,解决方法:通过另一种 安装命令即可

pip install torch==1.4.0+cpu torchvision==0.5.0+cpu -f https://download.pytorch.org/whl/torch_stable.htm

easyocr 将所有功能都封装到一个类中 Reader ,可通过调用类里面的三种方法 readtext、detect、recognize 来实现,

detect 方法用于检测图像中的文本框,最终返回两个列表,来表示文本框在图像中的位置,一个为 horizontal_list 格式为 [x_min,x_max,y_min,y_max] ,另一个为 free_list ,格式为 [[x1,y1],[x2,y2],[x3,y3],[x4,y4]],

上面这张图是 B 站用于在用户登录时弹出的验证码界面,在接下来的例子中都以这张图作为模板,detect 函数的使用方法如下

import easyocr
reader = easyocr.Reader(['ch_sim','en'],gpu=False,model_storage_directory='./model')
result = reader.detect('ceshi.png')
print(result)### ouput([[11, 133, 11, 31], [158, 238, 2, 34], [199, 235, 315, 333]], [])

使用时,首先需要创建一个 Reader 类,在类中需要指定一些参数:

  • lang_list,用来指定需要识别语言代码(例如中文、英文),以列表形式存放,关于语言代码可参考下方(这里只贴出部分,详情可参考官网):

gpu,布尔值,表示是否需要使用GPU,默认为 True;
    model_storage_directoy,字符串类型,默认为~./EasyOCR/.用于指定网络模型的存储路径,建议自己指定一个新路径;

最终会输出两个列表,分别表示 horizontal_list, free_list

recognize 用于识别,使用该函数时需要提供三个参数,image、horizontal_list、free_list,使用时与 detect 相搭配

image 表示图片;
    horizontal_list、free_list 分别表示矩形文本框列表,是函数 detect 的两个输出列表

使用方法如下

import easyocr
from PIL import Image,ImageDrawreader = easyocr.Reader(['ch_sim','en'],gpu=False,model_storage_directory='./model')
result = reader.recognize('ceshi.png',horizontal_list=[[11, 133, 11, 31], [158, 238, 2, 34], [199, 235, 315, 333]],free_list=[])print(result)### output[([[158, 2], [238, 2], [238, 34], [158, 34]], '带鱼', 0.48613545298576355), ([[11, 11], [133, 11], [133, 31], [11, 31]], '清在下图依次点击:', 0.46184659004211426), ([[199, 315], [235, 315], [235, 333], [199, 333]], '确认', 0.31680089235305786)]

最终 recognize 方法会返回每个文本框中的文本信息

readtext 函数是将 detect 和 recognize 方法相结合:先利用 detect 函数识别图像中文本框的位置坐标,将坐标列表输入 recognize 进行识别,最终返回每个文本信息及位置坐标,函数框架如下:

import easyocrreader = easyocr.Reader(['ch_sim','en'],gpu=False,model_storage_directory='./model')
result = reader.readtext('ceshi.png')
print(result)### ouputUsing CPU. Note: This module is much faster with a GPU.
[([[158, 2], [238, 2], [238, 34], [158, 34]], '带鱼', 0.48613545298576355), ([[11, 11], [133, 11], [133, 31], [11, 31]], '清在下图依次点击:', 0.46184659004211426), ([[199, 315], [235, 315], [235, 333], [199, 333]], '确认', 0.31680089235305786)]

得到坐标之后,为了更直观地观察到检测结果的正确性,可通过 PIL 把图像中文本框给绘制出来

import easyocr
from PIL import Image,ImageDrawreader = easyocr.Reader(['ch_sim','en'],gpu=False,model_storage_directory='./model')
result = reader.readtext('ceshi.png')img = Image.open('ceshi.png')
draw = ImageDraw.Draw(img)for i in result:draw.rectangle((tuple(i[0][0]),tuple(i[0][2])),fill=None,outline='red',width=2)
img.save("ceshi3.png")

效果如下

结果来看,除了图片中间的 带鱼 文本信息没有识别出来之外,其他区域的文本信息都能取得不错的识别和检测效果;

这里解释一下识别失败的原因,仔细观察的话会发现上面这张图并不是现实中真实存在的,而是通过深度学习技术生成的一个虚拟图像例如 GAN,里面的文本信息不是单一地将文字贴到图片上,我猜测是经过一些加密处理,

为了验证我的猜测,这里我借助了超级鹰打码平提供的API 接口,但最终依然得不到很好的识别效果(图中的蓝色字体位置代表打码平台识别结果)

上面只介绍了easyocr 方法中 的一些常规参数,还有许多默认参数没有介绍,比如 batch_size 控制每次识别图片的数量,有了这个参数可以实现批量识别,但前提需要 GPU 大内存的支撑;adjust_contrast 调整图像对比度;

关于 easyocr 更多详细信息,感兴趣的小伙伴可看官方文档:Jaided AI: EasyOCR documentation

上面的官方文档非常详细,赶时间的话直接点进文档阅读可能会更方便和直接一点

好了,以上就是本篇文章全部内容,最后感谢大家的阅读!

本文全篇借鉴,写的非常好,由于今天很累,之前写的代码没来得及写注释,今天找了很久发现这个博客讲解的不错,干了一天活很累不想动了,就直接粘贴了,方便以后自己学习

关于OCR图片文本检测、推荐一个 基于深度学习的Python 库!_小张Python-CSDN博客

文本识别 easyocr 库的相关知识相关推荐

  1. Python 图像文本识别 EasyOCR

    目录 1. 安装依赖 2. 下载模型文件 3. 编写代码 4. 运行脚本 命令行模式 参考文献 一个Python的图像文本识别工具:easyocr. 这个模块支持70多种语言的即用型OCR,包括中文, ...

  2. 12.16库的相关知识与补充

    12.16 25.标准库:     (1)turtle库:Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根 ...

  3. svn服务器现存的库文件导入,svn导入版本库及相关知识

    SVN作为新一代代码版本管理工具,有很多优点,管理方便,逻辑明确,安全性高,代码一致性高.SVN数据存储有两种方式,BDB(事务安全表类型)和FSFS(一种不需要数据库的存储系统),为了避免在服务器连 ...

  4. 关于Linux动态库的相关知识

    如果某动态库中有一个全局变量,程序a使用的这个动态库,程序b也使用了这个动态库,那么程序a和b中的全局变量是一个吗?也就是说,进程间使用动态库时,共享全局变量吗?答题是:是一个,共享,但写时拷贝,给程 ...

  5. python场景文字识别_针对复杂场景的 OCR 文本识别,推荐一个Python 库!

    大家好,我是 zeroing~ 1,前言 之前谈到图片文本 OCR 识别时,写过一篇文章介绍了一个 Python 包 pytesseract ,具体内容可参考 介绍一个Python 包 ,几行代码可实 ...

  6. python 人脸识别相关知识和库的使用

    python 人脸识别相关知识和库的使用 写在前面 一.用到的基本库 二.常用的库简单使用 1.skimag.io 2.sys.argv 三.补充知识点 1.相对路径与绝对路径: 2.numpy.me ...

  7. 搭建基于飞桨的OCR工具库,总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、竖排文本识别、长文本识别的PaddleOCR

    介绍 基于飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. 相关链接 PaddleOCR ...

  8. keil C对lib封装库反汇编成C语言,Keil软件“C语言”及“汇编”混编 —— 相关知识整理.doc...

    Keil软件"C语言"与"汇编"混编 相关知识整理 用Keil在C中嵌入汇编1 在Keil中嵌入汇编2 介绍直接嵌入汇编代码的方法4 采用汇编可能会有的好处5 ...

  9. 【Python之pymysql库学习】二.游标cursor的相关知识(保姆级图文+实现代码)

    目录 读取的数据类型 读取的数据转为字典类型效果 读取的数据转为字典类型实现思路 读取的数据转为字典类型实现代码 关于游标的重置 总结 欢迎关注 『Python之pymysql库学习』 系列,持续更新 ...

最新文章

  1. 美国新桥投资集团(Newbridge Capital) [from baike]
  2. C 语言编程 — uint8_t / uint16_t / uint32_t /uint64_t
  3. 07--MySQL自学教程:DQL(Data Query Language:数据库查询语言)简介、基础查询、条件查询、模糊查询以及排序(一)
  4. 2015年第六届蓝桥杯C/C++ A组国赛 —— 第五题:切开字符串
  5. 算术运算符_加号的多种用法
  6. MetInfo最新版代码审计漏洞合集
  7. ResultSet的getDate()、getTime()和getTimestamp()比较
  8. 微信年终奖人均280万?腾讯张军:不可能 醒一醒吧!
  9. iOS NSString URLencode
  10. Array对象的三种属性实例
  11. html中选择收货地址时候,选择收货地址.html
  12. HTML:自定义修改鼠标指针
  13. 云大计算机专业基础综合,2020云南大学计算机专业课改考408
  14. 【转】职场学做“功夫熊猫”
  15. springboot花店商城系统鲜花店系统含后台管理源码
  16. 双子天蝎,爱情是不老的传说
  17. 用pyecharts画地图(世界地图、中国省级地图、市级地图、某省市级地图、某市县级地图)
  18. 基于Hi3516DV300rtmp交叉编译移植
  19. html重置怎么使用图片,路由器重置后怎么设置_路由器重置设置【图文教程】-太平洋IT百科...
  20. Latex字体加粗不了

热门文章

  1. win 2003 SP2 (32位X86) 中文版 升级补丁包 下载地址 光盘整合集成方法
  2. 【codecs】JPEG、MPEG-1、MPEG-2和MPEG-4编解码流程对比
  3. 西门子的统一通信解决之道
  4. 数据结构知识点概要(北大张铭版)
  5. 如何将已有图片做成透明水印_如何用Photoshop在图片上添加透明水印?
  6. webview性能优化—webview预创建
  7. x264源码分析与应用示例(一)——视频编码基本流程
  8. 89c51控制小车运行c语言,STC89C52单片机蓝牙遥控小车代码
  9. Libpcap Libnet 各个接口pai 巨细
  10. 好用的Google浏览器插件