【OCR】OCR学习记录(3)

1、介绍
之前介绍过图片文本OCR识别,文章介绍了一个Python包pytesseract,该包是基于Tesseract封装得到的,这个包虽然支持多语言文本识别,但对于不同语言识别,准确率却不一样,例如英文识别准确率高,而中文文本识别率较低;英文字符识别,整体来看基本不错,但对于图片中的中文字符,经常出现乱码、识别失败的情况。

2、EasyOCR
项目地址:https://github.com/JaidedAI/EasyOCR

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

EasyOCR包从开源到现在,已在GitHub上获得12k+ star,到目前为止经过4次版本迭代,有一下几个特点:

  • 1- 截止当前支持80+种语言文本识别,包括但不限于英语、中文、韩语、日语等;
  • 2-源于深度学习技术,识别精度很高;对于正常图片文本识别来说,准确率能达到100%;
  • 3-不仅适用于单语言,同样也适用于多语言(例如,一张图片中需要同时识别中文、英语两种语言);
  • 4-支持GPU加速,GPU识别速度要比CPU快6~7倍(需要提前配置好cuda、pytorch、torchvision Python环境)

对比传统OCR只具有图片文本识别之外,EasyOCR还具有文本检测功能(图片中识别到文本框,在图片中定位以左上、右上、右下、左下 坐标顺序依次返回),效果如下图所示:
在这里插入图片描述
上图中 EasyOCR 最终输出的是右图的 文本信息 ,左图中的红色线框是后面经处理加上去的。

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

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

pip install easyocr

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

安装的过程中可能会遇到一系列的问题,包之间的兼容问题、版本问题等等,根据报错提示依次解决。

3.2 使用方法
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,ImageDraw

reader = 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 easyocr

reader = easyocr.Reader(['ch_sim','en'],gpu=False,model_storage_directory='./model')
result = reader.readtext('ceshi.png')
print(result)

### ouput

Using 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,ImageDraw

reader = 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,里面的文本信息不是单一地将文字贴到图片上,我猜测是经过一些加密处理。

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

想要了解更多EasyOCR请阅读官方文档。

参考:
https://mp.weixin.qq.com/s?__biz=MzU2NTgxMjUyMQ==&mid=2247487340&idx=1&sn=1cc15737a668a94f0b901f86d43ca239&chksm=fcb7432acbc0ca3cca4401cb71f609d7817f8643c4e3be13f17f50b8d53cef3b088bc2388000&token=1121212502&lang=zh_CN#rd

猜你喜欢

转载自blog.csdn.net/AugustMe/article/details/120650104
OCR