夏日炎炎,正宜学习
上期武卓老师教了我们一键填入票据小技巧
解放了双手的Nono不得不感慨
OCR技术真是太太太实用了!
那么问题来了,
我们是否可以用身边CPU随时使用这项技术呢?
武卓老师对Nono露出了肯定的微笑
仍然只需要简单的几行代码哦
不信接着往下看
本期课程主要是以百度开源的PaddlePaddle框架的PaddleOCR技术为例,具体介绍如何利用英特尔开源的OpenVINO工具套件,仅使用我们手边的CPU,轻松实现对于PaddleOCR的实时推理。
提到PaddleOCR,就不得不提到它的技术原理了。PaddleOCR工作流程如下图所示,主要包括文本检测、方向分类、以及文本识别三部分。
文本检测任务,是指找出图像或视频中的文字位置,不需要像目标检测任务那样,不仅要解决定位问题,还要解决目标分类问题。然而,文本检测也面临一些难点,比如:自然场景中的文本具有多样性,文字大小、方向、长度、形状、语言都会有不同,文字重叠或者密度较高,这些都会影响最终文本检测的效果。目前常用的文本检测方法有基于回归以及基于分割的方法。而在PaddleOCR中,我们选取的是基于分割的DBNet方法。
DBNet的工作原理如上图所示。
一般而言,图像会经过特征金字塔fpn网络结构得到4个特征图,分别为原始图像的1/4、1/8、1/16和1/32的大小。然后,我们将4个特征图分别进行上采样为1/4的大小,再进行concatenation就会得到特征图f。接下来由特征图f得到我们的概率图和阈值图。最后通过概率图p和阈值图t的计算,通过可微分的二值化就能够得到近似的二值图。
这种针对基于分割的方法需要利用阈值进行二值化处理会导致后处理耗时较久,所以我们所采用的DBNet针对这种现象提出了一种可学习阈值的方法,并巧妙地设计了一个近似于阶跃函数的二值化函数,使得分割网络在训练的时候能端对端的学习文本分割的阈值。这种自动调节阈值不仅能带来精度的提升,同时可以简化后处理,会进一步提高文本检测的性能。
纸上谈兵终觉浅,绝知此事要躬行。我们先来导入好所有需要的Python工具包,通过查看具体代码的操作实践来实现OpenVINO对于PaddleOCR里面文本检测模型的推理。
进行推理之前,首先需要进行模型的下载。为了方便下载,我们定义了一个模型下载的函数,然后指定了下载的路径。在本次课程采用的是PaddleOCR mobile这样一个体积比较小的模型。
然后进行模型读取,并加载到设备CPU上面去。仅仅使用下图这样两行很简单的代码,就可以完成模型的读取和加载。
接下来,需要去定义变量名以及前处理、后处理函数。我们在进行文本检测任务的时候所需要的输入和输出的这样的一个变量名。在我们正式进行文本检测的推理任务之前,我们还需要再去定义一些必要的前处理和后处理函数,方便最后我们能够在一张图片上可视化的看到检测到目标文字以及完成转换过程。
最后,我们仅仅只需要使用了这样的一行代码,就可以利用OpenVINO去进行文本检测模型的推理,那么推理的效果到底怎么样呢?
推理效果验证
上图呈现了本次课程文本检测的推理结果,可以看到这种印刷体的文本检测定位的文字清晰准确,定位精准。那如果是手写体又会怎样呢?我们可以换一张图片来看一下。
手写体的文本检测结果,依然清晰准确。
本期课程大家学会了吗?
反正Nono已经get啦!