<optgroup id="m04aa"><small id="m04aa"></small></optgroup><center id="m04aa"><wbr id="m04aa"></wbr></center><center id="m04aa"></center>
<optgroup id="m04aa"><small id="m04aa"></small></optgroup>
<noscript id="m04aa"></noscript>
<optgroup id="m04aa"></optgroup>
訂閱
糾錯
加入自媒體

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

2022-03-25 11:41
磐創AI
關注

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

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

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

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

VIN用例

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

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

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

以高精度自動執行此任務比看起來要困難。主要困難是:

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

· 雖然VIN是以相當標準的格式書寫的,但所使用的字體并不標準,也不總是相同的,字母間距可能會有很大差異。

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

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

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

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

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

為什么要使用docTR?

DocTR是一個面向數據科學家和開發人員的Python光學字符識別庫。端到端OCR使用兩個階段的方法實現:文本檢測和文本識別。

DocTR包括用于檢測和識別任務的預訓練模型。任何人都可以使用它從圖像或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").as_images()

# Analyze

result = model(doc)

但正如我們之前提到的,沒有OCR能很好地解決我們的VIN問題。通用OCR不是這個用例的好解決方案,因為:

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

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

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

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

由于這些預訓練的模型,我們可以很容易地對VIN數據進行微調:我們應該獲得較高的精度,因為它們預訓練了數以百萬計的各種數據。

我們的貢獻者經常向庫添加最先進的模型。以下是截至今天的可用模型列表:

文本檢測

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

我們的數據集

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

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

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

我們將75%的數據用于訓練,15%用于驗證,10%用于測試。

注釋文本檢測數據集

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

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

在我們的例子中,每個圖像的標簽都是一個多邊形,表示VIN在圖像中的位置。訓練和驗證集的文件夾結構必須如下所示:

├── images

│   ├── sample_img_01.png

│   ├── sample_img_02.png

│   ├── sample_img_03.png

│   └── ...

└── labels.json

labels.json文件將輸入文件名映射到其多邊形標簽:

   "sample_img_01.png" = {

       'img_dimensions': (900, 600),

       'img_hash': "theimagedumpmyhash",

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

    },

    "sample_img_02.png" = {

       'img_dimensions': (900, 600),

       'img_hash': "thisisahash",

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

    }

    ...

我們使用了我們的內部工具來注釋這些數據,但是你可以找到很多很好的商業軟件。

注釋文本識別數據集

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

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

對于文本識別任務,docTR要求數據集文件夾的結構與文本檢測的結構相同。

├── 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': '。,

   ...

訓練模型

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

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

Tensorflow

pip install python-doctr[tf]

PyTorch

pip install python-doctr[torch]

確保你有4個必需的帶注釋數據文件夾,例如:

├── 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

文本識別模型訓練

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

1.安裝docTR

pip install python-doctr[tf]

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

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

3.導航到剛剛克隆的docTR repo,進入recognition references文件夾。references/recognition文件夾包含TensorFlow和PyTorch的訓練腳本。

cd /path/to/doctr/references/recognition

4.使用sar_resnet31啟動訓練(此模型使用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預訓練模型。

— wb:將開展一項關于權重和偏置的實驗。

— tb:如果你想改用TensorBoard 。

根據機器規格,如果內存不足,可能會出現內存不足(OOM)錯誤。如果出現此錯誤,請使用-b參數減小批次大。

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:批量大小

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

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

文本檢測模型訓練

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

1.導航到/references/detection文件夾

cd /path/to/doctr/references/detection

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

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

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

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

測試經過訓練的模型

我們的模型保存在克隆的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)

為了找到最佳參數,我們根據驗證集微調了Unprex_ratio參數。這是用于從檢測模型擴展輸出多邊形的因子,以便生成可輸入文本識別模型的方形框。

由于這兩個模型是分別訓練的,因此沒有理由默認參數是優化文本識別性能的最佳參數。

在我們的測試集中測試了經過訓練的模型之后,我們實現了90%的端到端準確率,考慮到數據量少和用例的復雜性,這是非常好的。如果我們愿意,我們本可以花更多時間用一些想法優化模型:

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

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

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

· 當然,更多的數據…

結論

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

使用通用的OCR并試圖提取所需的關鍵信息可能非常乏味。你需要在原始OCR結果的基礎上構建大量的后處理,而且它不太可能在簡單的文本檢測和識別任務中表現良好。

感謝閱讀!

       原文標題 : 使用Python和docTR提取車輛識別號

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

發表評論

0條評論,0人參與

請輸入評論內容...

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

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

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網
獲取更多精彩內容
文章糾錯
x
*文字標題:
*糾錯內容:
聯系郵箱:
*驗 證 碼:

粵公網安備 44030502002758號

太大太粗太爽免费视频
<optgroup id="m04aa"><small id="m04aa"></small></optgroup><center id="m04aa"><wbr id="m04aa"></wbr></center><center id="m04aa"></center>
<optgroup id="m04aa"><small id="m04aa"></small></optgroup>
<noscript id="m04aa"></noscript>
<optgroup id="m04aa"></optgroup>