【无标题】

Jetson Agx Xavier实现文字识别

  • 一、工程简介
  • 二、部署
    • 2.1 安装Paddle
      • 2.1.1 下载Paddle
      • 2.1.2 安装Paddle
    • 2.2 下载并安装PaddleOCR
      • 2.2.1 下载PaddleOCR工程代码
      • 2.2.2 安装第三方库
    • 2.3 运行代码
  • 三、文字检测、文字识别原理
    • 3.1 文本检测
    • 3.2 文本识别
    • 3.3 文本相似度
      • 3.3.1 Levenshtein算法原理

一、工程简介

本工程建立在百度开源的PaddleOCR工程之上,在Jetson Agx Xavier实现了文字识别功能,并对公共室内场所识别到的文字进行归类,Markdown的基本语法知识。

二、部署

2.1 安装Paddle

2.1.1 下载Paddle

从网站找到跟Jetson Agx Xavier对应的预编译whl包,再pip 安装即可。

2.1.2 安装Paddle

下载完成之后,切换到下载的文件夹内运行。

python3 -m pip install xxxxxxxxxxxxxxxx.whl

安装后运行

import paddle
paddle.fluid.install_check.run_check()

若终端输出success,则安装成功。

2.2 下载并安装PaddleOCR

2.2.1 下载PaddleOCR工程代码

从GitHub下载代码

2.2.2 安装第三方库

cd PaddleOCR
pip install -r requirements.txt

2.3 运行代码

python sim.py

三、文字检测、文字识别原理

3.1 文本检测

文本检测的任务是定位出输入图像中的文字区域。近年来学术界关于文本检测的研究非常丰富,一类方法将文本检测视为目标检测中的一个特定场景,基于通用目标检测算法进行改进适配,如TextBoxes[1]基于一阶段目标检测器SSD[2]算法,调整目标框使之适合极端长宽比的文本行,CTPN[3]则是基于Faster RCNN[4]架构改进而来。但是文本检测与目标检测在目标信息以及任务本身上仍存在一些区别,如文本一般长宽比较大,往往呈“条状”,文本行之间可能比较密集,弯曲文本等,因此又衍生了很多专用于文本检测的算法,如EAST[5]、PSENet[6]、DBNet[7]等等。

目前较为流行的文本检测算法可以大致分为基于回归和基于分割的两大类文本检测算法,也有一些算法将二者相结合。基于回归的算法借鉴通用物体检测算法,通过设定anchor回归检测框,或者直接做像素回归,这类方法对规则形状文本检测效果较好,但是对不规则形状的文本检测效果会相对差一些,比如CTPN[3]对水平文本的检测效果较好,但对倾斜、弯曲文本的检测效果较差,SegLink[8]对长文本比较好,但对分布稀疏的文本效果较差;基于分割的算法引入了Mask-RCNN[9],这类算法在各种场景、对各种形状文本的检测效果都可以达到一个更高的水平,但缺点就是后处理一般会比较复杂,因此常常存在速度问题,并且无法解决重叠文本的检测问题。

3.2 文本识别

文本识别的任务是识别出图像中的文字内容,一般输入来自于文本检测得到的文本框截取出的图像文字区域。文本识别一般可以根据待识别文本形状分为规则文本识别和不规则文本识别两大类。规则文本主要指印刷字体、扫描文本等,文本大致处在水平线位置;不规则文本往往不在水平位置,存在弯曲、遮挡、模糊等问题。不规则文本场景具有很大的挑战性,也是目前文本识别领域的主要研究方向。

规则文本识别的算法根据解码方式的不同可以大致分为基于CTC和Sequence2Sequence两种,将网络学习到的序列特征 转化为 最终的识别结果 的处理方式不同。基于CTC的算法以经典的CRNN[11]为代表。

不规则文本的识别算法相比更为丰富,如STAR-Net[12]等方法通过加入TPS等矫正模块,将不规则文本矫正为规则的矩形后再进行识别;RARE[13]等基于Attention的方法增强了对序列之间各部分相关性的关注;基于分割的方法将文本行的各字符作为独立个体,相比与对整个文本行做矫正后识别,识别分割出的单个字符更加容易;此外,随着近年来Transfomer[14]的快速发展和在各类任务中的有效性验证,也出现了一批基于Transformer的文本识别算法,这类方法利用transformer结构解决CNN在长依赖建模上的局限性问题,也取得了不错的效果。

3.3 文本相似度

3.3.1 Levenshtein算法原理

  1. str1或str2的长度为0返回另一个字符串的长度。 if(str1.length0) return str2.length; if(str2.length0) return str1.length;

2)初始化(n+1)*(m+1)的矩阵d,并让第一行和列的值从0开始增长。

3)扫描两字符串(n*m级的),如果:str1 == str2[j],用temp记录它,为0。否则temp记为1。然后在矩阵d[i,j]赋于d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+temp三者的最小值。

4)扫描完后,返回矩阵的最后一个值d[n][m]即是它们的距离。

Levenshtein计算相似度公式:1-它们的距离/两个字符串长度的最大值。

你可能感兴趣的:(机器学习,python,深度学习,计算机视觉)