訂閱
糾錯
加入自媒體

使用Python和docTR提取車輛識別號

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

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

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

他們唯一的重點是建立檢測、分類和評估車輛損壞的最佳技術(shù)。能夠自動讀取VIN對他們來說很重要。

VIN用例

請注意,本文中VIN的任何照片都是偽造或模糊的。問題的定義很簡單:

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

· 輸出是一個17個字符長的字符串:VIN

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

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

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

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

· 最后但并非最不重要的一點是,VIN并不總是照片中唯一的文字,使用傳統(tǒng)的OCR方法是不夠的,因為我們需要添加一層后處理來過濾掉不需要的字符。

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

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

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

為什么要使用docTR?

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

DocTR包括用于檢測和識別任務(wù)的預(yù)訓(xùn)練模型。任何人都可以使用它從圖像或pdf中提取單詞。你可以非常輕松地測試它(更多信息請參閱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不是這個用例的好解決方案,因為:

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

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

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

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

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

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

文本檢測

· 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)

文本識別

· 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照片,所有這些照片都來自不同的車輛。這是一個好的開始!

Nicolas告訴我們,他們的移動應(yīng)用程序中有一個用于拍照的布局模板,強制用戶以正確的方向拍照。這使問題變得更容易,因為我們可以假設(shè)輸入圖像的方向正確。它也有助于我們確保VIN不太傾斜:我們可以考慮最大絕對斜席角約5°。

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

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

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

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

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

在我們的例子中,每個圖像的標(biāo)簽都是一個多邊形,表示VIN在圖像中的位置。訓(xù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ù)據(jù)集

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

對識別數(shù)據(jù)集進行注釋比檢測更加繁瑣。我們再次使用了我們的內(nèi)部工具,其中包括一個預(yù)注釋功能,使用通用文本識別算法使其更容易。更正幾個字符確實比從頭開始手動鍵入所有字符更容易。你可以在許多商業(yè)注釋軟件中找到此功能。

對于文本識別任務(wù),docTR要求數(shù)據(jù)集文件夾的結(jié)構(gòu)與文本檢測的結(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)在讓我們跳到有趣的事情!正如你可能想象的那樣,實際的過程實際上是在訓(xùn)練實驗和數(shù)據(jù)清理之間來回多次,以提高性能。但是為了這篇文章,讓我們考慮數(shù)據(jù)集第一次被完全注釋。

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

Tensorflow

pip install python-doctr[tf]

PyTorch

pip install python-doctr[torch]

確保你有4個必需的帶注釋數(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

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

讓我們從文本識別算法開始。

1.安裝docTR

pip install python-doctr[tf]

2.在筆記本電腦上的某個地方克隆存儲庫

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

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

cd /path/to/doctr/references/recognition

4.使用sar_resnet31啟動訓(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:將開展一項關(guān)于權(quán)重和偏置的實驗。

— tb:如果你想改用TensorBoard 。

根據(jù)機器規(guī)格,如果內(nèi)存不足,可能會出現(xiàn)內(nèi)存不足(OOM)錯誤。如果出現(xiàn)此錯誤,請使用-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:批量大小

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

該模型收斂速度非常快,能夠在驗證集上實現(xiàn)80%的準(zhǔn)確率。這看起來可能沒有那么多,但這是因為我們將扭曲的數(shù)據(jù)放入訓(xùn)練集中。我們后面計算端到端的指標(biāo),這是最重要的指標(biāo),了解整體進展情況。

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

對于文本檢測模型,以下是步驟:

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

cd /path/to/doctr/references/detection

2.使用db_resnet50啟動訓(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

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

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

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

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

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

要查看模型的實際工作情況,代碼非常簡單:

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ù)驗證集微調(diào)了Unprex_ratio參數(shù)。這是用于從檢測模型擴展輸出多邊形的因子,以便生成可輸入文本識別模型的方形框。

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

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

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

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

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

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

結(jié)論

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

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

感謝閱讀!

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

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

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

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

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