驾驶证/行驶证信息提取与识别

一、前言

       最近想要玩一个关于驾驶证和行驶证信息提取的小项目,于是就准备开始学习相关的知识。因为之前对身份证号码提取有过了解,所以一开始整体的概念还是有的,比如这种项目需要使用opencv、ocr或者深度学习模型等等。于是就带着这些仅存的印象开始了这个项目。

二、搜集资料

       在搜索实际项目之前,我先看了关于驾驶证和行驶证识别的基本原理。基本上就是分成两部分:使用opencv获取驾驶证信息在图片中的区域,然后截取出来使用文字识别工具进行识别。参考的主要是下面这两篇文章:

  • 基于Opencv和Tesseract的行驶证识别系统设计
  • OCR - 行驶证识别

       刚开始我习惯性的直接去百度搜索,想要搜索一些开源的项目,但是我发现并没有多少可以使用的资源。大多是一些只讲基本原理或者是身份证识别项目。于是我换了个方向,准备去Github上去找,真的找了好半天。虽然开源项目不少,但是还是刚才说的那个问题,很多都是基于国外驾驶证做的项目,又或者是一些python和C++之外的语言写的项目(因为我之前只深入学习过C++和python),其他不熟悉的语言如果需要修改的话很不方便。

三、实现方式①(调用百度OCR API)

       最后我只找到了一个比较合适的,这是一个基于百度文字识别(OCR)服务的项目,它通过百度OCR服务提供的一系列API来实现各种场景的文字识别。主要有以下几种服务:

  • 通用文字识别
  • 卡证文字识别
  • 票据文字识别
  • 汽车场景文字识别
  • 教育场景文字识别

该项目把这所有的服务整合到了一块,项目结构比较清晰,也比较合理。模块划分的也很好,使用起来方便,如果需要修改代码也比较方便。现在把该项目的Github链接放出来:BaiduTextApi。

       然后我大致看了一下这个项目的结构,其实还是很清晰明了的,而且是用python写的。并且结合百度OCR提供的官方API技术文档,弄明白了百度OCR服务的使用方式,也弄明白了该项目是如何使用的。

       最后根据具体的需求,简单的修改了一下代码就可以使用了。但是有一点需要注意的是,既然是百度的OCR服务,正常来说是要收费的,也就是你需要花钱来获取API使用时所需的一些信息,这个你看了官方API文档之后就知道是啥意思了。至少我目前是这么理解的,就是当你的账号有使用这些服务的权限的时候,你就可以获得请求服务所必不可少的这几条信息。

四、实现方式②(使用OpenCV和离线OCR脱机运行)

       其实上述第一种实现方式有一个局限性(是否局限取决于你自己的实际需求),那就是必须联网才能够工作。如果你想要脱机运行,那么该项目就不太合适了,这个时候就需要寻求其他的解决办法了。接下来就来简单的说一下我还在做的一个脱机运行的识别项目。

       该项目主要分为以下几个部分:

  • 原始图片的透视变换,为了方便后面使用固定位置法截取各部分的内容;
  • 使用固定位置法截取各部分信息,方便后续的字符分割;
  • 对截取后的每一部分的内容进行字符分割,其中字符分割中使用到了opencv中的各种形态学操作;
  • 对分割之后的每一个字符单独进行OCR识别

目前前面三步都可以比较好的实现,虽然还有一些瑕疵和改进的空间。而存在的问题就是第四步效果不是太好。其影响因素主要有两个:

  • 原始图片清晰度不够,这个取决于你怎么采集图片或者说你的使用场景是什么;
  • 中文文字OCR识别精度低,训练不够充分

针对以上两个问题,其中第一个要么你采集更加清晰的图片,要么对图片做一些图像增强的预处理使其更加清晰,这个暂且不讨论。下面主要来说一下第二个问题,主要有以下几种思路:

  • 第一种是,直接更换OCR工具,最开始使用的是tesseract,这个对于中文的识别率确实感人,尤其是清晰度不够的情况下。我们可以考虑使用EasyOCRcnocr或者是百度的PaddleOCR。这几种都是训练的比较好的,对中文更加的友好,识别率也更高。
  • 第二种思路就是我们自己去训练OCR,在Github也有不少支持训练自己的数据集的项目,PaddleOCR就是其中之一。下面把我找的几个支持训练的OCR项目的链接贴出来:
    cnocr
    chinese_ocr
    PaddleOCR
    crnn_ctc_ocr_tf
    CRNN_Chinese_Characters_Rec

以上提供的项目仅供参考,我自己大致看了一下,都是支持训练的,但可能所需环境不同,训练的复杂程度也不同。那么我就另开一篇简单记录一下以上所说的各OCR项目训练时应该注意的一些东西。

五、实现方式②的改进版

在使用方式2实现的时候,发现效果一直不是很好,究其原因,是因为透视变换需要寻找驾驶证的轮廓,而在寻找轮廓的时候受到背景的干扰比较强。而且后面采取的是固定区域截取各部分信息的方法,一旦透视变换的结果不是特别理想,那么截取出的各部分信息的区域就会偏差很大。所以,后来没有去掉透视变换的步骤,而是在透视变换之后,将固定区域截取变成了相对位置截取。因为各部分的信息的相对位置是不变的,如果使用文本检测检测出一些比较容易检测的区域的位置,那么就可以根据相对位置获得其他区域的具体位置。改进方法的步骤如下:

  • 对传入的照片进行透视变换或者其他矫正操作,如旋转,以便于后续操作。
  • 在上述操作的基础上,对照片进行区域截取,也即截取出各部分信息,然后用于后续的识别操作。区域截取采取的是文本检测+相对位置结合的方式。之所以采取这种结合的方式,是为了减少文本检测的误差,但是如果文本检测效果非常好,也可以完全使用文本检测。
  • 在上述操作的基础上,对截取到的每部分区域进行字符分割,单个字符识别的话,有时候识别率会更高。
  • 对图像做一些增强操作,可能有助于识别率的提高。
  • 对获取到的每个字符单独进行识别或者每块区域整体识别。
六、训练自己的OCR模型
1、 PaddleOCR

项目地址:https://github.com/Alex-1997-Wzx/PaddleOCR

这个项目兼顾了文字检测文字识别,所以如果你有足够的数据集,是可以训练的很好的,毕竟行驶证/驾驶证它们有一定自己的特点,比如照片颜色,字体等等,而且区域都是固定的。我对这个项目的理解主要分为以下几个部分:

1)、如果你想直接使用 ,不想训练,那么你可以按照文档说明安装相应的环境,然后直接按照使用说明进行预测推理即可。如果你想要部署在端侧,比如树莓派上,文档中也提供了在端侧部署的例子,只需要类比其操作就可以一步一步的在端侧完成预测推理。其中使用到了Paddle Lite,它是轻量化的推理引擎,可以提升在端侧的推理速度。其中有几点需要注意的是:

  • 正常推理的时候,我们可以直接运行PaddleOCR / tools / infer路径下的几个文件,分别有文字检测程序,文字识别程序以及检测加识别的程序。这些程序使用的都是inference模型,该模型是预测推理时使用的非常重要的文件,当我们自己训练模型的时候,也需要先把训练好的模型转换成inference模型,然后才能开始预测推理。也就是说,它是预测推理所直接调用的文件,非常重要,具体使用看文档即可。

  • 当我们在端侧直接使用的时候,也需要使用inference模型,不过中间又多了一步,还需要将inference模型转换成opt模型。此外,使用的推理引擎也从PaddlePaddle变成了轻量化的Paddle Lite。不过提供的案例是C++版本的,我觉得使用起来不是太方便,如果你要将整个项目作为一个模块去实现一些逻辑比较麻烦。这个时候一个很重要的东西就派上用场了,那就是Paddle Lite,我们可以使用其提供的各种API(链接奉上:Welcome to Paddle-Lite’s documentation!),里面有多种语言多种使用方式可供选择。而我们只需要获取由PaddlePaddle深度学习框架产出的模型文件,就可以结合所提供的API一步一步的在端侧实现预测推理。

2)、如果你想要自己训练模型,那么也可以,这个详细的步骤,以及数据集的组织形式在文档中都有说明。我们只需要对训练代码稍作修改,使其训练完成之后将模型保存起来就可以了,之后我们就可以直接使用该保存的已训练模型,结合Paddle Lite提供的API在端侧预测推理。当然也可以运行PaddleOCR / tools / infer路径下的几个文件,使用训练得到的inference模型直接进行预测推理。

2、 CRNN_Chinese_Characters_Rec

项目地址:https://github.com/Alex-1997-Wzx/CRNN_Chinese_Characters_Rec

这个项目只有文字识别的部分,具体的训练和测试方法可以参考该项目自己提供的教程。这里我只再简单的说一下需要注意的地方:

1)、一共有四个需要我们自己提供的东西:

  • 含有多张训练图片的文件夹,这些图片里都包含文字
  • 包含大量字符的char.txt文件,也即字符库
  • 包含训练图片名称 图片中的字符对应的索引 信息的train.txt
  • 包含测试图片名称 图片中的字符对应的索引 信息的test.txt

2)、在train.txttest.txt中,第一段内容是图片的名称,因为之前我们已经提供过训练图片所在的文件夹路径,所以这里直接提供图片名称即可;第二段内容是图片中的每一个字符(按顺序)对应的自己在字符库char.txt中的索引。

3、 chinese_ocr

项目地址:https://github.com/YCG09/chinese_ocr

这个项目有CTPN文字检测部分和DenseNet文字识别部分,这两部分都可以自己进行训练。

  • 先说CTPN文字检测,这部分提供的数据集链接失效了,我没有找到,所以就无法知道数据集如何组织的,所以这个暂且就不自己训练了。而且提高识别率主要是需要重新训练文字识别部分,所以文字检测我们可以直接使用作者已经训练好的模型。
  • DenseNet文字识别部分,如果我们想要训练自己的数据集,我们就下载教程中提供的数据集,看一下数据集组织形式,按照其所述方法进行训练即可。
4、crnn_ctc_ocr_tf

项目地址:https://github.com/bai-shang/crnn_ctc_ocr_tf

这个项目只有CRNN文字识别部分,并且支持训练。训练数据集的组织方式是如下的图片路径 文字内容的形式。可以使用自己的数据集按照这个形式进行组织,训练自己的数据集。还需要注意的是,训练时该项目会把数据集转变成tfrecord的形式。

90kDICT32px/1/2/373_coley_14845.jpg coley
90kDICT32px/17/5/176_Nevadans_51437.jpg nevadans

你可能感兴趣的:(项目笔记,c++,python,人工智能)