驾驶证/行驶证信息提取与识别
一、前言
???????最近想要玩一個關(guān)于駕駛證和行駛證信息提取的小項目,于是就準(zhǔn)備開始學(xué)習(xí)相關(guān)的知識。因?yàn)橹皩ι矸葑C號碼提取有過了解,所以一開始整體的概念還是有的,比如這種項目需要使用opencv、ocr或者深度學(xué)習(xí)模型等等。于是就帶著這些僅存的印象開始了這個項目。
二、搜集資料
???????在搜索實(shí)際項目之前,我先看了關(guān)于駕駛證和行駛證識別的基本原理。基本上就是分成兩部分:使用opencv獲取駕駛證信息在圖片中的區(qū)域,然后截取出來使用文字識別工具進(jìn)行識別。參考的主要是下面這兩篇文章:
- 基于Opencv和Tesseract的行駛證識別系統(tǒng)設(shè)計
- OCR - 行駛證識別
???????剛開始我習(xí)慣性的直接去百度搜索,想要搜索一些開源的項目,但是我發(fā)現(xiàn)并沒有多少可以使用的資源。大多是一些只講基本原理或者是身份證識別項目。于是我換了個方向,準(zhǔn)備去Github上去找,真的找了好半天。雖然開源項目不少,但是還是剛才說的那個問題,很多都是基于國外駕駛證做的項目,又或者是一些python和C++之外的語言寫的項目(因?yàn)槲抑爸簧钊雽W(xué)習(xí)過C++和python),其他不熟悉的語言如果需要修改的話很不方便。
三、實(shí)現(xiàn)方式①(調(diào)用百度OCR API)
???????最后我只找到了一個比較合適的,這是一個基于百度文字識別(OCR)服務(wù)的項目,它通過百度OCR服務(wù)提供的一系列API來實(shí)現(xiàn)各種場景的文字識別。主要有以下幾種服務(wù):
- 通用文字識別
- 卡證文字識別
- 票據(jù)文字識別
- 汽車場景文字識別
- 教育場景文字識別
該項目把這所有的服務(wù)整合到了一塊,項目結(jié)構(gòu)比較清晰,也比較合理。模塊劃分的也很好,使用起來方便,如果需要修改代碼也比較方便。現(xiàn)在把該項目的Github鏈接放出來:BaiduTextApi。
???????然后我大致看了一下這個項目的結(jié)構(gòu),其實(shí)還是很清晰明了的,而且是用python寫的。并且結(jié)合百度OCR提供的官方API技術(shù)文檔,弄明白了百度OCR服務(wù)的使用方式,也弄明白了該項目是如何使用的。
???????最后根據(jù)具體的需求,簡單的修改了一下代碼就可以使用了。但是有一點(diǎn)需要注意的是,既然是百度的OCR服務(wù),正常來說是要收費(fèi)的,也就是你需要花錢來獲取API使用時所需的一些信息,這個你看了官方API文檔之后就知道是啥意思了。至少我目前是這么理解的,就是當(dāng)你的賬號有使用這些服務(wù)的權(quán)限的時候,你就可以獲得請求服務(wù)所必不可少的這幾條信息。
四、實(shí)現(xiàn)方式②(使用OpenCV和離線OCR脫機(jī)運(yùn)行)
???????其實(shí)上述第一種實(shí)現(xiàn)方式有一個局限性(是否局限取決于你自己的實(shí)際需求),那就是必須聯(lián)網(wǎng)才能夠工作。如果你想要脫機(jī)運(yùn)行,那么該項目就不太合適了,這個時候就需要尋求其他的解決辦法了。接下來就來簡單的說一下我還在做的一個脫機(jī)運(yùn)行的識別項目。
???????該項目主要分為以下幾個部分:
- 原始圖片的透視變換,為了方便后面使用固定位置法截取各部分的內(nèi)容;
- 使用固定位置法截取各部分信息,方便后續(xù)的字符分割;
- 對截取后的每一部分的內(nèi)容進(jìn)行字符分割,其中字符分割中使用到了opencv中的各種形態(tài)學(xué)操作;
- 對分割之后的每一個字符單獨(dú)進(jìn)行OCR識別
目前前面三步都可以比較好的實(shí)現(xiàn),雖然還有一些瑕疵和改進(jìn)的空間。而存在的問題就是第四步效果不是太好。其影響因素主要有兩個:
- 原始圖片清晰度不夠,這個取決于你怎么采集圖片或者說你的使用場景是什么;
- 中文文字OCR識別精度低,訓(xùn)練不夠充分
針對以上兩個問題,其中第一個要么你采集更加清晰的圖片,要么對圖片做一些圖像增強(qiáng)的預(yù)處理使其更加清晰,這個暫且不討論。下面主要來說一下第二個問題,主要有以下幾種思路:
- 第一種是,直接更換OCR工具,最開始使用的是tesseract,這個對于中文的識別率確實(shí)感人,尤其是清晰度不夠的情況下。我們可以考慮使用EasyOCR, cnocr或者是百度的PaddleOCR。這幾種都是訓(xùn)練的比較好的,對中文更加的友好,識別率也更高。
- 第二種思路就是我們自己去訓(xùn)練OCR,在Github也有不少支持訓(xùn)練自己的數(shù)據(jù)集的項目,PaddleOCR就是其中之一。下面把我找的幾個支持訓(xùn)練的OCR項目的鏈接貼出來:
cnocr
chinese_ocr
PaddleOCR
crnn_ctc_ocr_tf
CRNN_Chinese_Characters_Rec
以上提供的項目僅供參考,我自己大致看了一下,都是支持訓(xùn)練的,但可能所需環(huán)境不同,訓(xùn)練的復(fù)雜程度也不同。那么我就另開一篇簡單記錄一下以上所說的各OCR項目訓(xùn)練時應(yīng)該注意的一些東西。
五、實(shí)現(xiàn)方式②的改進(jìn)版
在使用方式2實(shí)現(xiàn)的時候,發(fā)現(xiàn)效果一直不是很好,究其原因,是因?yàn)橥敢曌儞Q需要尋找駕駛證的輪廓,而在尋找輪廓的時候受到背景的干擾比較強(qiáng)。而且后面采取的是固定區(qū)域截取各部分信息的方法,一旦透視變換的結(jié)果不是特別理想,那么截取出的各部分信息的區(qū)域就會偏差很大。所以,后來沒有去掉透視變換的步驟,而是在透視變換之后,將固定區(qū)域截取變成了相對位置截取。因?yàn)楦鞑糠值男畔⒌南鄬ξ恢檬遣蛔兊?#xff0c;如果使用文本檢測檢測出一些比較容易檢測的區(qū)域的位置,那么就可以根據(jù)相對位置獲得其他區(qū)域的具體位置。改進(jìn)方法的步驟如下:
- 對傳入的照片進(jìn)行透視變換或者其他矯正操作,如旋轉(zhuǎn),以便于后續(xù)操作。
- 在上述操作的基礎(chǔ)上,對照片進(jìn)行區(qū)域截取,也即截取出各部分信息,然后用于后續(xù)的識別操作。區(qū)域截取采取的是文本檢測+相對位置結(jié)合的方式。之所以采取這種結(jié)合的方式,是為了減少文本檢測的誤差,但是如果文本檢測效果非常好,也可以完全使用文本檢測。
- 在上述操作的基礎(chǔ)上,對截取到的每部分區(qū)域進(jìn)行字符分割,單個字符識別的話,有時候識別率會更高。
- 對圖像做一些增強(qiáng)操作,可能有助于識別率的提高。
- 對獲取到的每個字符單獨(dú)進(jìn)行識別或者每塊區(qū)域整體識別。
六、訓(xùn)練自己的OCR模型
1、 PaddleOCR
項目地址:https://github.com/Alex-1997-Wzx/PaddleOCR
這個項目兼顧了文字檢測和文字識別,所以如果你有足夠的數(shù)據(jù)集,是可以訓(xùn)練的很好的,畢竟行駛證/駕駛證它們有一定自己的特點(diǎn),比如照片顏色,字體等等,而且區(qū)域都是固定的。我對這個項目的理解主要分為以下幾個部分:
1)、如果你想直接使用 ,不想訓(xùn)練,那么你可以按照文檔說明安裝相應(yīng)的環(huán)境,然后直接按照使用說明進(jìn)行預(yù)測推理即可。如果你想要部署在端側(cè),比如樹莓派上,文檔中也提供了在端側(cè)部署的例子,只需要類比其操作就可以一步一步的在端側(cè)完成預(yù)測推理。其中使用到了Paddle Lite,它是輕量化的推理引擎,可以提升在端側(cè)的推理速度。其中有幾點(diǎn)需要注意的是:
-
正常推理的時候,我們可以直接運(yùn)行PaddleOCR / tools / infer路徑下的幾個文件,分別有文字檢測程序,文字識別程序以及檢測加識別的程序。這些程序使用的都是inference模型,該模型是預(yù)測推理時使用的非常重要的文件,當(dāng)我們自己訓(xùn)練模型的時候,也需要先把訓(xùn)練好的模型轉(zhuǎn)換成inference模型,然后才能開始預(yù)測推理。也就是說,它是預(yù)測推理所直接調(diào)用的文件,非常重要,具體使用看文檔即可。
-
當(dāng)我們在端側(cè)直接使用的時候,也需要使用inference模型,不過中間又多了一步,還需要將inference模型轉(zhuǎn)換成opt模型。此外,使用的推理引擎也從PaddlePaddle變成了輕量化的Paddle Lite。不過提供的案例是C++版本的,我覺得使用起來不是太方便,如果你要將整個項目作為一個模塊去實(shí)現(xiàn)一些邏輯比較麻煩。這個時候一個很重要的東西就派上用場了,那就是Paddle Lite,我們可以使用其提供的各種API(鏈接奉上:Welcome to Paddle-Lite’s documentation!),里面有多種語言多種使用方式可供選擇。而我們只需要獲取由PaddlePaddle深度學(xué)習(xí)框架產(chǎn)出的模型文件,就可以結(jié)合所提供的API一步一步的在端側(cè)實(shí)現(xiàn)預(yù)測推理。
2)、如果你想要自己訓(xùn)練模型,那么也可以,這個詳細(xì)的步驟,以及數(shù)據(jù)集的組織形式在文檔中都有說明。我們只需要對訓(xùn)練代碼稍作修改,使其訓(xùn)練完成之后將模型保存起來就可以了,之后我們就可以直接使用該保存的已訓(xùn)練模型,結(jié)合Paddle Lite提供的API在端側(cè)預(yù)測推理。當(dāng)然也可以運(yùn)行PaddleOCR / tools / infer路徑下的幾個文件,使用訓(xùn)練得到的inference模型直接進(jìn)行預(yù)測推理。
2、 CRNN_Chinese_Characters_Rec
項目地址:https://github.com/Alex-1997-Wzx/CRNN_Chinese_Characters_Rec
這個項目只有文字識別的部分,具體的訓(xùn)練和測試方法可以參考該項目自己提供的教程。這里我只再簡單的說一下需要注意的地方:
1)、一共有四個需要我們自己提供的東西:
- 含有多張訓(xùn)練圖片的文件夾,這些圖片里都包含文字
- 包含大量字符的char.txt文件,也即字符庫
- 包含訓(xùn)練圖片名稱 圖片中的字符對應(yīng)的索引 信息的train.txt
- 包含測試圖片名稱 圖片中的字符對應(yīng)的索引 信息的test.txt
2)、在train.txt和test.txt中,第一段內(nèi)容是圖片的名稱,因?yàn)橹拔覀円呀?jīng)提供過訓(xùn)練圖片所在的文件夾路徑,所以這里直接提供圖片名稱即可;第二段內(nèi)容是圖片中的每一個字符(按順序)對應(yīng)的自己在字符庫char.txt中的索引。
3、 chinese_ocr
項目地址:https://github.com/YCG09/chinese_ocr
這個項目有CTPN文字檢測部分和DenseNet文字識別部分,這兩部分都可以自己進(jìn)行訓(xùn)練。
- 先說CTPN文字檢測,這部分提供的數(shù)據(jù)集鏈接失效了,我沒有找到,所以就無法知道數(shù)據(jù)集如何組織的,所以這個暫且就不自己訓(xùn)練了。而且提高識別率主要是需要重新訓(xùn)練文字識別部分,所以文字檢測我們可以直接使用作者已經(jīng)訓(xùn)練好的模型。
- DenseNet文字識別部分,如果我們想要訓(xùn)練自己的數(shù)據(jù)集,我們就下載教程中提供的數(shù)據(jù)集,看一下數(shù)據(jù)集組織形式,按照其所述方法進(jìn)行訓(xùn)練即可。
4、crnn_ctc_ocr_tf
項目地址:https://github.com/bai-shang/crnn_ctc_ocr_tf
這個項目只有CRNN文字識別部分,并且支持訓(xùn)練。訓(xùn)練數(shù)據(jù)集的組織方式是如下的圖片路徑 文字內(nèi)容的形式。可以使用自己的數(shù)據(jù)集按照這個形式進(jìn)行組織,訓(xùn)練自己的數(shù)據(jù)集。還需要注意的是,訓(xùn)練時該項目會把數(shù)據(jù)集轉(zhuǎn)變成tfrecord的形式。
90kDICT32px/1/2/373_coley_14845.jpg coley 90kDICT32px/17/5/176_Nevadans_51437.jpg nevadans總結(jié)
以上是生活随笔為你收集整理的驾驶证/行驶证信息提取与识别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网狐荣耀手机端内核源码
- 下一篇: 怎么做好看的ppt