訂閱
糾錯(cuò)
加入自媒體

使用Python和docTR提取車輛識(shí)別號(hào)

VIN(車輛識(shí)別號(hào))是一個(gè)17個(gè)字符的字符串,由數(shù)字和大寫字母組成,用作汽車的指紋。

它可以幫助識(shí)別任何一輛汽車的壽命,并獲得有關(guān)它的具體信息。該唯一標(biāo)識(shí)符在制造過程中打印在車輛的某個(gè)位置,以便人們?cè)谧廛嚮蜾N售等過程中需要時(shí)讀取。

幾個(gè)月前,我們的朋友聯(lián)系了我們,他們來自Monk:一家AI公司,為汽車、保險(xiǎn)和移動(dòng)市場(chǎng)提供最先進(jìn)的計(jì)算機(jī)視覺解決方案。他們正在開發(fā)一種視覺智能技術(shù),能夠在車輛生命周期的每個(gè)階段對(duì)車輛進(jìn)行檢查。

他們唯一的重點(diǎn)是建立檢測(cè)、分類和評(píng)估車輛損壞的最佳技術(shù)。能夠自動(dòng)讀取VIN對(duì)他們來說很重要。

VIN用例

請(qǐng)注意,本文中VIN的任何照片都是偽造或模糊的。問題的定義很簡(jiǎn)單:

· 輸入是寫在汽車上的VIN的照片

· 輸出是一個(gè)17個(gè)字符長(zhǎng)的字符串:VIN

以高精度自動(dòng)執(zhí)行此任務(wù)比看起來要困難。主要困難是:

輸入的照片大多是在室外拍攝的,有很多噪音(亮度、水漬、陰影等),這會(huì)使車輛識(shí)別碼的檢測(cè)和識(shí)別變得困難

· 雖然VIN是以相當(dāng)標(biāo)準(zhǔn)的格式書寫的,但所使用的字體并不標(biāo)準(zhǔn),也不總是相同的,字母間距可能會(huì)有很大差異。

· 存在一種校驗(yàn)和驗(yàn)證方法來驗(yàn)證VIN,但它并不適用于所有車輛。我們拒絕了這個(gè)后處理解決方案。

· 最后但并非最不重要的一點(diǎn)是,VIN并不總是照片中唯一的文字,使用傳統(tǒng)的OCR方法是不夠的,因?yàn)槲覀冃枰砑右粚雍筇幚韥磉^濾掉不需要的字符。

以下是一些噪聲圖像的示例:

我們做的第一件事就是運(yùn)行現(xiàn)成的OCR,既可以從開源庫中運(yùn)行,也可以從基于云的API中運(yùn)行。

VIN是寫在汽車上的,而不是寫在紙上的,而且它不是字符識(shí)別技術(shù)的常見用例。我們必須找到另一種使用Python和docTR的方法。

為什么要使用docTR?

DocTR是一個(gè)面向數(shù)據(jù)科學(xué)家和開發(fā)人員的Python光學(xué)字符識(shí)別庫。端到端OCR使用兩個(gè)階段的方法實(shí)現(xiàn):文本檢測(cè)和文本識(shí)別。

DocTR包括用于檢測(cè)和識(shí)別任務(wù)的預(yù)訓(xùn)練模型。任何人都可以使用它從圖像或pdf中提取單詞。你可以非常輕松地測(cè)試它(更多信息請(qǐng)參閱docTR文檔)

1.安裝

pip install python-doctr

2.Python hello world

from doctr.io import DocumentFile

from doctr.models import ocr_predictor

model = ocr_predictor(pretrained=True)

# PDF

doc = DocumentFile.from_pdf("path/to/your/doc.pdf").a(chǎn)s_images()

# Analyze

result = model(doc)

但正如我們之前提到的,沒有OCR能很好地解決我們的VIN問題。通用OCR不是這個(gè)用例的好解決方案,因?yàn)椋?/p>

· OCR應(yīng)該是通用的,而文本檢測(cè)和文本識(shí)別的問題在涉及“野外”數(shù)據(jù)(如VIN的照片)時(shí)非常困難。

· 通用OCR的輸出列出了寫入圖像中的字符,即使所有字符都被準(zhǔn)確檢測(cè)到,如何從中重建VIN字符串?

為了擺脫這些限制,我們決定對(duì)VIN數(shù)據(jù)上的docTR模型進(jìn)行微調(diào),以實(shí)現(xiàn)檢測(cè)和識(shí)別任務(wù),從而獲得更好的性能。

這樣,檢測(cè)將只提取VIN字符(而不是周圍的字符),我們將有一個(gè)用于讀取它們的微調(diào)模型。該庫包括基于預(yù)訓(xùn)練模型的檢測(cè)和識(shí)別能力。

由于這些預(yù)訓(xùn)練的模型,我們可以很容易地對(duì)VIN數(shù)據(jù)進(jìn)行微調(diào):我們應(yīng)該獲得較高的精度,因?yàn)樗鼈冾A(yù)訓(xùn)練了數(shù)以百萬計(jì)的各種數(shù)據(jù)。

我們的貢獻(xiàn)者經(jīng)常向庫添加最先進(jìn)的模型。以下是截至今天的可用模型列表:

文本檢測(cè)

· Real-time Scene Text Detection with Differentiable 

Binarization(https://arxiv.org/pdf/1911.08947.pdf).

· LinkNet: Exploiting Encoder Representations for Efficient Semantic 

Segmentation(https://arxiv.org/pdf/1707.03718.pdf)

文本識(shí)別

· An End-to-End Trainable Neural Network for Image-based Sequence 

Recognition and Its Application to Scene Text 

Recognition(https://arxiv.org/pdf/1507.05717.pdf).

· Show, Attend and Read: A Simple and Strong Baseline for Irregular Text 

Recognition(https://arxiv.org/pdf/1811.00751.pdf).

· MASTER: Multi-Aspect Non-local Network for Scene Text 

Recognition(https://arxiv.org/pdf/1910.02562.pdf).

我們的數(shù)據(jù)集

我們有5000張使用不同設(shè)備拍攝的VIN照片,所有這些照片都來自不同的車輛。這是一個(gè)好的開始!

Nicolas告訴我們,他們的移動(dòng)應(yīng)用程序中有一個(gè)用于拍照的布局模板,強(qiáng)制用戶以正確的方向拍照。這使問題變得更容易,因?yàn)槲覀兛梢约僭O(shè)輸入圖像的方向正確。它也有助于我們確保VIN不太傾斜:我們可以考慮最大絕對(duì)斜席角約5°。

我們的數(shù)據(jù)集包含方向錯(cuò)誤的照片和角度超過5°的傾斜VIN。我們從數(shù)據(jù)集中刪除了5°以上的傾斜照片,并改變了方向以使每張照片都筆直。

我們將75%的數(shù)據(jù)用于訓(xùn)練,15%用于驗(yàn)證,10%用于測(cè)試。

注釋文本檢測(cè)數(shù)據(jù)集

DocTR文本檢測(cè)模型輸出圖像的分割熱圖。

為了訓(xùn)練這個(gè)模型,我們需要為每個(gè)圖像提供對(duì)應(yīng)于我們正在尋找的文本位置的多邊形集。

在我們的例子中,每個(gè)圖像的標(biāo)簽都是一個(gè)多邊形,表示VIN在圖像中的位置。訓(xùn)練和驗(yàn)證集的文件夾結(jié)構(gòu)必須如下所示:

├── images

│   ├── sample_img_01.png

│   ├── sample_img_02.png

│   ├── sample_img_03.png

│   └── ...

└── labels.json

labels.json文件將輸入文件名映射到其多邊形標(biāo)簽:

   "sample_img_01.png" = {

       'img_dimensions': (900, 600),

       'img_h(yuǎn)ash': "theimagedumpmyhash",

       'polygons': [[[x1, y1], [x2, y2], [x3, y3], [x4, y4]],...]

    },

    "sample_img_02.png" = {

       'img_dimensions': (900, 600),

       'img_h(yuǎn)ash': "thisisahash",

       'polygons': [[[x1, y1], [x2, y2], [x3, y3], [x4, y4]],...]

    }

    ...

我們使用了我們的內(nèi)部工具來注釋這些數(shù)據(jù),但是你可以找到很多很好的商業(yè)軟件。

注釋文本識(shí)別數(shù)據(jù)集

在docTR端到端管道中,文本識(shí)別模型將在第一個(gè)文本檢測(cè)階段檢測(cè)到的輸入圖像作為輸入。然后,該算法將對(duì)這些作物執(zhí)行“讀取”任務(wù),以獲得機(jī)器編碼的字符串。

對(duì)識(shí)別數(shù)據(jù)集進(jìn)行注釋比檢測(cè)更加繁瑣。我們?cè)俅问褂昧宋覀兊膬?nèi)部工具,其中包括一個(gè)預(yù)注釋功能,使用通用文本識(shí)別算法使其更容易。更正幾個(gè)字符確實(shí)比從頭開始手動(dòng)鍵入所有字符更容易。你可以在許多商業(yè)注釋軟件中找到此功能。

對(duì)于文本識(shí)別任務(wù),docTR要求數(shù)據(jù)集文件夾的結(jié)構(gòu)與文本檢測(cè)的結(jié)構(gòu)相同。

├── images

       ├── img_1.jpg

       ├── img_2.jpg

       ├── img_3.jpg

       └── ...

├── labels.json

labels.json文件將輸入文件名映射到其輸出字符串:

   labels = {

   'img_1.jpg': 'I',

   'img_2.jpg': 'am',

   'img_3.jpg': 'a',

   'img_4.jpg': 'Jedi',

   'img_5.jpg': '。,

   ...

訓(xùn)練模型

現(xiàn)在讓我們跳到有趣的事情!正如你可能想象的那樣,實(shí)際的過程實(shí)際上是在訓(xùn)練實(shí)驗(yàn)和數(shù)據(jù)清理之間來回多次,以提高性能。但是為了這篇文章,讓我們考慮數(shù)據(jù)集第一次被完全注釋。

我們將使用TensorFlow 2(TF)后端來訓(xùn)練我們的模型:這也可以使用PyTorch后端來實(shí)現(xiàn),因?yàn)椴襟E非常相似。你可以通過以下方式使用TF或PyTorch后端安裝docTR

Tensorflow

pip install python-doctr[tf]

PyTorch

pip install python-doctr[torch]

確保你有4個(gè)必需的帶注釋數(shù)據(jù)文件夾,例如:

├── detection_train

   ├── images

├── train_det_img_1.jpg

└── ...

└── labels.json

├── detection_val

   ├── images

├── val_det_img_1.jpg

└── ...

└── labels.json

├── recognition_train

   ├── images

├── train_rec_img_1.jpg

└── ...

└── labels.json

├── recognition_val

   ├── images

├── val_rec_img_1.jpg

└── ...

└── labels.json

文本識(shí)別模型訓(xùn)練

讓我們從文本識(shí)別算法開始。

1.安裝docTR

pip install python-doctr[tf]

2.在筆記本電腦上的某個(gè)地方克隆存儲(chǔ)庫

git clone https://github.com/mindee/doctr

3.導(dǎo)航到剛剛克隆的docTR repo,進(jìn)入recognition references文件夾。references/recognition文件夾包含TensorFlow和PyTorch的訓(xùn)練腳本。

cd /path/to/doctr/references/recognition

4.使用sar_resnet31啟動(dòng)訓(xùn)練(此模型使用Resnet 31)

python train_tensorflow.py model=sar_resnet31  train_path=/path/to/your/train/recognition/dataset val_path=/path/to/your/val/recognition/dataset --vocab legacy_french --pretrained --wb --epochs 50

— pretrained:將從docTR-SAR開始,使用Resnet31預(yù)訓(xùn)練模型。

— wb:將開展一項(xiàng)關(guān)于權(quán)重和偏置的實(shí)驗(yàn)。

— tb:如果你想改用TensorBoard 。

根據(jù)機(jī)器規(guī)格,如果內(nèi)存不足,可能會(huì)出現(xiàn)內(nèi)存不足(OOM)錯(cuò)誤。如果出現(xiàn)此錯(cuò)誤,請(qǐng)使用-b參數(shù)減小批次大。

python train_tensorflow.py model=sar_resnet31 train_path=/path/to/your/train/recognition/dataset

val_path=/path/to/your/val/recognition/dataset --vocab legacy_french --pretrained --wb --epochs 50 -b 16

-b:批量大小

驗(yàn)證步驟發(fā)生在每個(gè)epoch之后,如果驗(yàn)證丟失是所有epoch中最低的,則檢查點(diǎn)將保存在references文件夾中。

該模型收斂速度非?欤軌蛟隍(yàn)證集上實(shí)現(xiàn)80%的準(zhǔn)確率。這看起來可能沒有那么多,但這是因?yàn)槲覀儗⑴で臄?shù)據(jù)放入訓(xùn)練集中。我們后面計(jì)算端到端的指標(biāo),這是最重要的指標(biāo),了解整體進(jìn)展情況。

文本檢測(cè)模型訓(xùn)練

對(duì)于文本檢測(cè)模型,以下是步驟:

1.導(dǎo)航到/references/detection文件夾

cd /path/to/doctr/references/detection

2.使用db_resnet50啟動(dòng)訓(xùn)練(此模型使用Resnet 50主干)

python train_tensorflow.py model=db_resnet50 train_path=/path/to/your/train/detection/dataset val_path=/path/to/your/val/detection/dataset --pretrained --wb

檢測(cè)模型比識(shí)別模型大:這一模型更可能出現(xiàn)OOM錯(cuò)誤。同樣,如果出現(xiàn)這種情況,可以考慮減少批量大小。

為這項(xiàng)任務(wù)使用預(yù)訓(xùn)練的模型是非常重要的。docTR模型的訓(xùn)練是檢測(cè)圖像中的任何單詞,我們只尋找VIN。通過僅在VIN上重新訓(xùn)練此模型,我們正在微調(diào)模型,以僅檢測(cè)VIN,并過濾掉任何周圍的文本。

檢測(cè)指標(biāo)比識(shí)別指標(biāo)更難分析。雖然精度看起來很高,但由于IoU不容易操作,我們將通過測(cè)試端到端管道來了解模型的性能。

測(cè)試經(jīng)過訓(xùn)練的模型

我們的模型保存在克隆的docTR存儲(chǔ)庫的參考文件夾中。

要查看模型的實(shí)際工作情況,代碼非常簡(jiǎn)單:

from doctr.io import DocumentFile

from doctr.models import ocr_predictor

DET_CKPT = "file:///path/to/detection/model/db_resnet50_XXXX/weights"

REC_CKPT = "file://path/to/recognition/model/sar_resnet31_XXXX/weights"

model = ocr_predictor(det_arch='db_resnet50', reco_arch='sar_resnet31',pretrained=True)

model.det_predictor.model.load_weights(DET_CKPT)

model.det_predictor.model.postprocessor.unclip_ratio = 2

model.reco_predictor.model.load_weights(REC_CKPT)

if __name__ == "__main__":

   # Image loading

   doc = DocumentFile.from_images("./path/to/image")

   # Models inference

   result = model(doc)

   # Max proba post processing rule for selecting the right VIN value among docTR results

   vin = ""

   for word in result.pages[0].blocks[0].lines[0].words:

       if word.confidence > confidence:

     vin = word.value

     confidence = word.confidence

   # Display the detection and recognition results on the image

   result.show(doc)

為了找到最佳參數(shù),我們根據(jù)驗(yàn)證集微調(diào)了Unprex_ratio參數(shù)。這是用于從檢測(cè)模型擴(kuò)展輸出多邊形的因子,以便生成可輸入文本識(shí)別模型的方形框。

由于這兩個(gè)模型是分別訓(xùn)練的,因此沒有理由默認(rèn)參數(shù)是優(yōu)化文本識(shí)別性能的最佳參數(shù)。

在我們的測(cè)試集中測(cè)試了經(jīng)過訓(xùn)練的模型之后,我們實(shí)現(xiàn)了90%的端到端準(zhǔn)確率,考慮到數(shù)據(jù)量少和用例的復(fù)雜性,這是非常好的。如果我們?cè)敢,我們本可以花更多時(shí)間用一些想法優(yōu)化模型:

· 檢測(cè)模型在方形框上訓(xùn)練。DocTR將很快支持旋轉(zhuǎn)框,這將使我們對(duì)傾斜的照片有更好的魯棒性。

· 超參數(shù)微調(diào):我們沒有在這方面花費(fèi)太多時(shí)間。例如,我們注意到dropout和學(xué)習(xí)率對(duì)訓(xùn)練有很大影響。我們手動(dòng)測(cè)試了一些值,但我們本可以花更多時(shí)間對(duì)這些參數(shù)進(jìn)行網(wǎng)格搜索。輸入大小也很重要,我們使用了默認(rèn)的docTR參數(shù)。

· 文本識(shí)別只針對(duì)算法的主干部分預(yù)訓(xùn)練模型:雖然有預(yù)訓(xùn)練的模型很好,但在使用它們時(shí),我們不能自由地使用我們想要的詞匯表。我們?cè)儐杁ocTR團(tuán)隊(duì),是否有可能只為文本識(shí)別算法的主干部分獲得預(yù)訓(xùn)練模型,這樣我們就可以用我們的特定詞匯訓(xùn)練分類頭。他們很快就會(huì)解決這個(gè)問題。

· 當(dāng)然,更多的數(shù)據(jù)…

結(jié)論

本例是,該問題需要對(duì)檢測(cè)層和識(shí)別層進(jìn)行重新訓(xùn)練,以獲得更好的性能。

使用通用的OCR并試圖提取所需的關(guān)鍵信息可能非常乏味。你需要在原始OCR結(jié)果的基礎(chǔ)上構(gòu)建大量的后處理,而且它不太可能在簡(jiǎn)單的文本檢測(cè)和識(shí)別任務(wù)中表現(xiàn)良好。

感謝閱讀!

       原文標(biāo)題 : 使用Python和docTR提取車輛識(shí)別號(hào)

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)