使用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)
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)
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-10.29立即報(bào)名>> 2024德州儀器嵌入式技術(shù)創(chuàng)新發(fā)展研討會(huì)
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月14日立即報(bào)名>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國智造CIO在線峰會(huì)
推薦專題
- 1 Intel宣布40年來最重大轉(zhuǎn)型:年底前裁員15000人、拋掉2/3房產(chǎn)
- 2 因美封殺TikTok,字節(jié)股價(jià)骨折!估值僅Meta1/5
- 3 宏山激光重磅發(fā)布行業(yè)解決方案,助力智能制造產(chǎn)業(yè)新飛躍
- 4 國產(chǎn)AI芯片公司破產(chǎn)!白菜價(jià)拍賣
- 5 具身智能火了,但規(guī)模落地還需時(shí)間
- 6 國產(chǎn)英偉達(dá)們,抓緊沖刺A股
- 7 三次錯(cuò)失風(fēng)口!OpenAI前員工殺回AI編程賽道,老東家捧金相助
- 8 英特爾賦能智慧醫(yī)療,共創(chuàng)數(shù)字化未來
- 9 英偉達(dá)的麻煩在后頭?
- 10 將“網(wǎng)紅”變成“商品”,AI“爆改”實(shí)力拉滿
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市