使用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)
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提取車輛識別號
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市