paddleocr识别使用初体验

1、安装过程:

pip install paddlepaddle

如果是安装gpu版本,对应的版本选择参考:飞桨PaddlePaddle-源于产业实践的开源深度学习平台

pip install paddleocr

2、应用:

import time
import gradio as gr
from paddleocr import PaddleOCR, draw_ocr
import io
import numpy as np
# 模型路径下必须含有model和params文件

import base64
from PIL import Image
ocr = PaddleOCR(use_angle_cls=True,use_gpu=True)#det_model_dir='{your_det_model_dir}', rec_model_dir='{your_rec_model_dir}', rec_char_dict_path='{your_rec_char_dict_path}', cls_model_dir='{your_cls_model_dir}', use_angle_cls=True
# img_path = 'G:/my_learn/image_ocr/image1.jpg'
# img_file = open(img_path,'rb')
# img_b64encode = base64.b64encode(img_file.read())
start = time.time()
# img_b64decode = base64.b64decode(img_b64encode)
# image = io.BytesIO(img_b64decode)
# img = np.array(Image.open(image))
def handle(input_file_path):
    print(input_file_path.name)
    ocr_result = ocr.ocr(input_file_path.name, det=True,cls=False)
    final_result = []
    for line in ocr_result:
        final_result.append(line)
    return str(final_result)
record_input = gr.components.File(label='upload file',file_types=[".pdf","image"],type='file')
# record_input = gr.components.Image(label='upload file',type='filepath')
output_message = gr.components.Textbox(label="ocr result",lines=10,max_lines=1000)
iface = gr.Interface(title="灯塔OCR识别演示环境",fn=handle, inputs=record_input, outputs=output_message,interpretation="default")
iface.launch(share=False,server_name='0.0.0.0',server_port=30002)

3、识别准确率方面:paddleocr在通用ocr识别准确率已经达到95%+,对于具体业务场景的ocr识别,根据难易度进行调整即可。

4、如果需要个人训练,可以使用,https://github.com/PaddlePaddle/PaddleOCR,进行二次训练

5、参考文档:中文OCR模型快速使用 - 《PaddleOCR 使用教程》 - 书栈网 · BookStack

6、数据整理和预训练:数据集 - 常用数据标注工具 - 《PaddleOCR 使用教程》 - 书栈网 · BookStack

文本检测和文本识别概述

1. 背景

OCR全称Optical Character Recognition,即光学字符识别,最早在1929年被德国科学家Tausheck提出,定义为将印刷体的字符从纸质文档中识别出来。现在的OCR,狭义上指对输入扫描文档图像进行分析处理,识别出图像中文字信息。而随着OCR技术的日益发展,人们已不再仅仅满足于文档或书本上的文字,开始将目标转移到现实世界场景中的文字,这被称为场景文字识别(Scene Text Recognition,STR)。

因此目前的OCR通常泛指所有图像文字检测和识别技术,包括传统文档图像识别与场景文字识别技术。场景文字识别技术可以被看成是传统OCR技术的演进与升级,面临着许多新的困难和挑战。目前,学术界在OCR领域的研究也多集中在自然场景下的文本识别。

场景文字识别与一般的目标检测相比,有其自身的特点。

  • 背景多样化.尤其是自然场景下,文本行的背景可以为任意,同时还会受一些结构相近的背景影响(如栅栏)。
  • 文本行形状和方向的多样化。如水平、垂直、倾斜、曲线等。
  • 文本行颜色、字体、尺度的多样化。
  • 不同程度的透视变换。
  • 恶劣的光照条件和不同程度的遮挡。

虽然说普通文档识别与场景文字识别相比通常来说难度更小,但具体到细分领域也面临着许多挑战。比如本次课题所识别的目标扫描票据,往往由于扫描仪分辨率低、纸张、油墨质量差等原因导致扫描的票据质量低下,同时,字体过小、存在干扰文本也是需要考虑的问题。

图像文字检测和识别技术应用场景广泛,存在着巨大商业价值。各大互联网公司也纷纷推出了许多相关技术支持或应用,涉及方方面面,包括名片、快递单、身份证、银行卡、车牌、路牌、广告牌、商品包装袋、营业证、试卷、发票收据等。

2. 方法

通常来说文本识别可以分为三个步骤:图像预处理、文本检测和文本识别。当然,目前也有一些将文本检测和文本识别合并到一起的方法,将在下文中展开叙述。

2.1 图像预处理

对于待识别的图像或者扫描文档,一般需要先进行灰度化、二值化、平滑以及其他的一些处理,使输入的图像得到矫正,并统一规格。

2.2 文本检测

对图像进行预处理之后,就可以进行文本检测了。文本检测就是要定位图像中的文字区域,然后通常以边界框的形式将单词或文本行标记出来。

文本检测的技术演变历史与普通的目标检测任务相似,在深度学习还未广泛流行之前,传统方法大多都是基于手工提取特征,包括SWT,MSER、HoG等。在深度学习大量应用于计算机视觉任务之后,文本检测也逐渐转向基于深度学习的方法。

2.2.1 基于手工提取特征的方法

之前的文本检测方法以自下而上的方法为主。该方法首先要进行笔画或字符检测,有基于连接组件和基于滑动窗口两种方式,然后再进行后续的一系列步骤,包括非文本组件过滤,文本行构建和文本行验证等。这类方法往往基于手工设计的特征,如SWT、MSER、HoG等,来区分文本和背景。这种方法一大弊端就是无法利用上下文信息,如果文本中的某个字符由于存在干扰或其他原因导致模糊无法识别时,会将其划分到非文本类,这会导致检测出大量的非文本组件。这种错误将导致接下来自下而上的构建步骤中出现错误累积。

传统文本检测流程

可以看出它的步骤繁多,而且这类方法的性能往往依赖于字符检测的结果,鲁棒性和可靠性较差。

这类方法过去通常用于印刷体文档,对于英文的检测效果较好。而中文由于很多汉字是左右结构,同时没有空格对字符进行间隔,该方法又是基于字符检测,所以效果往往不尽人意。

2.2.2 基于深度学习的方法

深度学习席卷计算机视觉领域之后,传统的文本检测方法渐渐就被基于深度学习的方法代替了。从源头来讲,目前基于深度学习方法可以分为两大类:一个是从目标检测发展而来的,基于候选框的文本检测(Proposal-based)、一个是从语义分割发展而来的,基于图像分割的文本检测(Segmentation-based)。此外还有基于两者方法混合的文本检测(Hybrid-based)以及少数其它方法。

基于候选框的文本检测大致的思想就是根据设置的default boxes(也称anchor)产生一系列的候选文本框,再进行一系列调整、筛选,最终通过NMS得到最终的文本边界框。

这种思路也是最先出现在目标检测领域,不过如果将常规物体检测方法(SSD, YOLO, Faster-RCNN等直接照搬到文字检测领域,效果一般并不理想。

这主要与文本检测自身特点有关:

  • 相比于常规物体,文本行长度、长宽比例变化范围很大。
  • 文本行是有方向性的。常规物体边框BBox的四元组描述方式信息量不充足。
  • 自然场景中某些物体局部图像与字母形状相似,如果不参考图像全局信息将有误报。
  • 有些艺术字体使用了弯曲的文本行,而手写字体变化模式也很多。
  • 由于丰富的背景图像干扰,手工设计特征在自然场景文本识别任务中不够鲁棒。

鉴于以上原因,人们在传统的目标检测模型的基础上,结合文本检测的特点进行改进,诞生了许多效果不错的文本检测模型,例如CTPN、TextBoxes、EAST、SegLink等。改进模型的网络结构精心为文本检测而设计,极大地提升了对扫描文档以及自然场景图像中文本检测的准确率。

  • CTPN方案中,用BiLSTM模块提取字符所在图像上下文特征,以提高文本块识别精度。
  • SegLink将单词切割为更易检测的小文字块,再预测邻近连接将小文字块连成词。
  • TextBoxes等方案中,调整了文字区域参考框的长宽比例,并将特征层卷积核调整为长方形,从而更适合检测出细长型的文本行。”

而基于分割的文本检测的大致思想,是先对网络结构进行分割以达到像素级别的语义分割,然后根据分割的结果构建文本行。例如PixelLink和FTSN,它们会生成分割映射,然后再经过后续其他处理,最终得到文本边界框。

  • PixelLink放弃了边框回归的思想,采用实例分割的方法,分割出文本行区域,然后直接找对应文本行的外接矩形框。
  • FTSN实际上是FCIS和FPN的一个组合,它是基于实例感知分割的端到端、可训练的多方向文本检测模型,去除中间冗余的步骤。

2.3 文本识别

对图像进行文本检测之后要进行的就是文本识别了,文本识别同样分为两种识别方法,包括单字符识别和文本行识别。

传统的文本识别是对单字符进行识别,常采用的是k近邻的方法,但是这种方法的计算量很大,因此不适合用在实时度要求高的系统中。而随着深度学习方法的广泛应用,涌现出了许多优秀的基于深度学习的识别模型,比如VggNet,ResNet,InceptionNet,DenseNet等,单字符识别的准确率也有了明显提升。

而目前主要采用的是对文本行的识别。对于文字行的识别,近两年效果比较出色的方法主要有两种,一种是CNN+RNN+CTC,还有一种是CNN+RNN基于Attention的方法。

2.4 端到端识别

以上的方法是将文本检测和文本识别分为两个步骤进行,分别建立模型,然后在实施阶段将两个模型串联到一起组成统一的识别系统,也就是所谓的two-stage。

近年来,人们开始尝试建立端到端的识别模型,也就是将检测和识别放到一个网络结构中,比如FOTS等模型。

在训练阶段,输入训练图像以及对应文本坐标、文本内容,优化目标是文本内容预测误差与边框坐标预测误差的加权之和。

在预测阶段,原始图片输入到训练好的模型,然后直接输出识别到的文本。相比于two-stage方案,端到端模型的训练效率更高,在预测阶段资源开销更少。

你可能感兴趣的:(ocr,计算机视觉,python,人工智能)