手把手教你如何利用樹莓派和機器學習3D打印DIY一個車牌讀取器

作者一直特斯拉迷,特斯拉的自動駕駛能力非常的酷,雖然沒錢買,近來一直想讓汽車能夠檢測和識別物體的想法,所以只能自己動手盡力一半實現該夢想。

作者記錄了項目中的每個步驟。

步驟1.確定項目範圍

首先要考慮的是系統應該有什麼。作者一直相信小做起總是最好的策略:循序漸進。所以,除了明顯的車道保持任務(每個人都已經完成了)之外,作者只考慮在駕駛時清楚地識別車牌。識別過程包括兩個步驟:

  • 車牌檢測
  • 識別每個車牌邊界內的文本

如果我們能做到這一點,那麼其他任務應該相當容易(比如確定碰撞風險、距離等)。甚至可以創建環境的矢量空間表示,這可能是一個不錯的選擇。

在過分擔心細節之前,我們需要知道兩件事:

  • 一種以未標記圖像爲輸入並檢測車牌的機器學習模型。
  • 硬件。簡言之,我們需要一個計算機系統,可以鏈接到一個或多個攝像頭來查詢我們的模型。

首先,我們着手建立正確的目標檢測模型。

步驟2.選擇正確的模型

經過仔細研究,筆者決定採用以下機器學習模式:

  • YOLOv3這是迄今爲止速度最快的模型,它的地圖可以與其他探測物體的高級模型相媲美。
  • 文本檢測器用於檢測圖像中的文本。
  • CRNN基本上是一個遞歸卷積神經網絡(CNN)模型。卷積神經網絡必須是遞歸的,因爲它需要能夠以正確的順序排列檢測到的字符以形成單詞。

這三種模式將如何協同工作?操作流程如下:

  • 首先,YOLOv3模型檢測從攝像機接收到的每個幀中每個車牌的邊界框。建議不要非常精確地預測邊界框,最好包含比檢測到的對象更寬的邊界。如果太窄,可能會影響後續進程的性能。這是對下面模型的補充。
  • CRAFT文本檢測器接收來自YOLOv3的裁剪後的車牌。現在,如果裁剪後的幀太窄,很可能會丟失部分車牌文本,預測將失敗。然而,當邊界框較大時,我們可以讓工藝模型檢測字母的位置。這給了我們每個字母一個非常精確的位置。
  • 最後,我們可以將工藝中每個單詞的邊界框傳遞給我們的CRNN模型來預測實際單詞。

有了基本的模型架構,我們就可以把它移到硬件上。

第三步.硬件設計

我們需要低功耗的硬件,如樹莓派。它有足夠的計算能力以相當大的幀速率預處理幀,並且有一個Pi攝像機。Pi相機是樹莓派的實際相機系統。它有一個很棒的支持庫,而且非常成熟。

在網絡接入方面,我們可以提供EC25-E 4G接入,也可以嵌入GPS模塊。關於Raspberry Pi接入4G網絡的文章可以在這裏閱讀:

https://www.robertlucian.com/2018/08/29/mobile-network-access-rpi/

我們先從外殼開始,把它掛在汽車的後視鏡上。它應該工作得很好。讓我們設計一個由兩部分組成的支撐結構:

覆盆子Pi+GPS模塊+4G模塊將放置在後視鏡的一側。以上文章可以在EC25-E模塊上查看,查看所選的GPS和4G天線。

另一方面,圓周率攝像機是由一個帶有球關節的手臂固定的。

這些支架或外殼使用可靠的Prusa i3 MK3S 3D打印機打印。

圖1 樹莓派+4G/GPS防護罩的外殼

圖2 帶有球形接頭用於定向的Pi攝像機支架

圖1和圖2顯示了呈現時的結構。請注意,C-mount是可插入的,因此覆盆子Pi case和Pi camera支持不會隨mount一起打印。他們有一個插有支架的插座。如果讀者決定複製項目,這將非常有用。你只需要調整後視鏡支架就可以在車上工作了。目前,這個展臺在一輛路虎自由客汽車上運行良好。

圖3 Pi 相機支撐結構的側視圖

圖4 Pi相機的支撐結構和RPi支架的前視圖

圖5 攝像機視野的富有想象力的表示

圖6 包含4G / GPS模塊、Pi攝像頭和樹莓派的嵌入式系統的特寫照片

顯然,這些模型需要一些時間,需要多次迭代才能得到一個堅實的結構。使用200微米高的PETG材料層,PETG可以在80-90攝氏度下很好地工作,並且具有很強的抗紫外線輻射能力。雖然不如阿Sa,但它有很高的強度。

這是在SolidWorks中設計的,因此所有SLDPRT/SLDASM文件以及所有STL和gcode都可以在下面的鏈接中找到,或者您可以使用它們打印版本。

https://www.dropbox.com/sh/fw16vy1okrp606y/AAAwkoWXODmoaOP4yR-z4T8Va?dl=0

第四步.訓練模特

一旦你有了硬件,你就可以開始訓練模型了。

最好不要重新發明輪子,儘可能多地重用工作。這都是關於轉移學習利用其他非常大的數據集的分析。幾天前,作者讀到一篇關於轉移學習的相關文章,文章中提到哈佛醫學院的一個附屬團隊能夠對模型進行微調,以預測“從胸部X光”的長期死亡率,包括非癌性死亡他們只有一個只有50000張標籤圖片的小數據集,但是他們使用的預訓練模型(Inception-v4)大約有1400萬張圖片。這比原來的模型花費更少的訓練時間和金錢,但是獲得的精度仍然很高。

  • YOLO3

很多經過預訓練的車牌模型都可以在網上找到,但沒有預想的那麼多,但其中一個已經訓練了約3600幅車牌圖像。雖然不多,但總比沒有強。此外,它還使用了Darknet的預先訓練模型進行訓練。我們可以用這個模型:

https://github.com/ThorPham/License-plate-detection

作者用VOTT註釋了收集的幀(當然還有車牌)。最終的結果是一個由534幅圖像組成的小數據集,其邊界標記爲車牌。數據集鏈接如下:

https://github.com/RobertLucian/license-plate-dataset

然後作者找到了YOLOv3網絡的Keras實現。使用它來訓練數據集,然後將模型預發佈到此存儲庫,以便其他人也可以使用它。測試集得到的映射爲90%,考慮到數據集很小,這是很好的。

  • CRNN和CRNN

在無數次試圖尋找一個好的網絡來識別文本之後,作者偶然發現了keras ocr,一個打包的靈活版本CRAFT和CRNN。還有他們預先訓練過的模特。這項工作非常有效,作者決定不微調模型,讓它保持原樣。

最重要的是,使用keras ocr預測文本非常簡單。基本上只是幾行代碼。查看他們的主頁瞭解如何操作:

https://github.com/faustomorales/keras-ocr

第五步.部署我的車牌探測器模型

模型部署有兩種主要方法:

在本地進行所有推理。

在雲中推斷。

兩種方法都具有挑戰性。

第一種方法是擁有一個龐大的“大腦”計算機系統,既複雜又昂貴。第二個問題是延遲和基礎設施挑戰,特別是使用gpu進行推理。

在這項研究中,作者偶然發現了一個名爲cortex的開源項目。它對遊戲來說是很新的,但是作爲人工智能開發工具的下一個發展方向,它確實有意義。

基本上,cortex是一個將機器學習模型部署爲生產web服務的平臺。這意味着我們可以專注於我們的應用程序,剩下的留給Cortex。在這種情況下,它在AWS上執行所有配置,我們只需要使用模板模型編寫一個預測器。非常方便,只需爲每個模型編寫幾十行代碼。

這是從GitHub存儲庫中提取出來的終端中的皮層:

https://GitHub.com/cortexlabs/cortex

如果這不美觀也不簡單,不知道怎麼稱呼它:

因爲自動駕駛儀不使用這種計算機視覺系統,所以潛伏期對我們來說並不重要,所以我們可以使用大腦皮層。如果它是自動駕駛系統的一部分,那麼使用通過雲提供商提供的服務不是一個好主意,至少現在不是。

使用cortex部署機器學習模型只需要兩件事:

定義cortex.yaml文件,這是我們的API的配置文件。每個API處理一個任務。我們指定的yolov3 API用於檢測給定幀上的車牌邊界框,crnn API用於使用CRAFTtext檢測器和crnn預測車牌號。

爲每個API定義預測值。基本上,在cortex中定義了一種特定的預測方法來接收有效載荷(平臺已經處理了所有的服務部件),使用有效載荷來預測結果,然後返回預測結果。就這麼簡單!

下面是一個經典iris數據集的預測器示例,但它沒有詳細說明作者是如何做到的(並保持文章的適當長度)。這兩個api的cortex實現的鏈接可以在它們的資源庫中找到:這個項目的所有其他資源都在本文的末尾。

https://github.com/cortexlabs/cortex/tree/master/examples/tensorflow/license-plate-reader

然後進行預測,你只需要像這樣使用curl:

預測響應看起來像是簡單!

第6步.開發客戶端

我們可以考慮以下架構:

以適當的分辨率(800x450或480x270)從Pi相機以30 FPS的速度收集幀,並將每個幀放入一個公共隊列中。

在一個單獨的進程中,我們從隊列中提取幀並將它們分發到不同線程上的多個工作線程。

每個工作線程(或推斷線程)向cortexAPI發出一個API請求。首先,向我們的yolov3API發送一個請求,然後,如果檢測到任何許可證,則使用一批裁剪的許可證向我們的crnn API發送另一個請求。響應將包括文本格式的預測車牌號。

將檢測到的每個車牌(帶或不帶可識別文本)推到另一個隊列中,並最終將其廣播到瀏覽器頁面。同時,車牌號預測被推送到另一個隊列中,然後保存到磁盤(csv格式)。

廣播隊列將接收一組無序的幀。它的使用者的任務是通過每次向客戶機廣播新的幀時將它們放在一個非常小的緩衝區(幾個大小的幀)中來重新排序。使用者正在另一個進程上運行。用戶還必須嘗試將隊列上的大小保持爲指定的值,以便以一致的幀速率(即30 FPS)顯示幀。顯然,如果隊列大小減小,則幀速率的減小是成比例的,反之亦然,當隊列大小增大時,它成比例地增大。最初,作者想實現一個滯後函數,但意識到它會給流一個非常波動的感覺。

同時,另一個線程正在主進程中運行,它從另一個隊列和GPS數據中提取預測。當客戶端接收到終止信號時,預測、GPS數據和時間也將被轉儲到csv文件中。

下面是與AWS上的Cloud API相關的客戶端流程圖

圖7 客戶端流程圖以及隨cortex設置的雲API

在我們的例子中,客戶端是一個Raspberry-Pi,發送推斷請求的Raspberry-Pi和雲api由cortex在Amazon Web服務AWS上提供。

客戶端的源代碼也可以複製到其GitHub存儲庫中:

https://github.com/RobertLucian/cortex-license-plate-reader-client

我們必須克服的一個特殊挑戰是4G帶寬。最好減少此應用程序所需的帶寬,以減少潛在的掛起或過度使用可用數據。作者決定在Pi相機上使用一個非常低的分辨率:480x270(我們可以使用較小的分辨率,因爲Pi相機的視野非常狹窄,所以我們仍然可以很容易地識別車牌)。即使在這種分辨率下,該幀的JPEG大小在10位時仍約爲100KB。乘以每秒30幀,得到3000KB,大約24Mb/s,沒有HTTP開銷,這太大了。

  • 相反將寬度減小到416像素,這正是YOLOv3模型調整圖像大小的寬度。比例顯然保持不變。
  • 將圖像轉換爲灰度。
  • 刪除了圖像頂部的45%。當時的想法是,車牌不會出現在車架上,因爲這輛車沒有在飛行中。據作者所知,裁剪45%的圖像不會影響預測器的性能。
  • 再次將圖像轉換爲JPEG格式,但質量較低。
  • 生成的幀大小約爲7–10KB,非常好。這相當於2.8Mb/s。但是加上所有開銷,大約是3.5Mb/s(包括響應)。
  • 對於crnn-API,即使不應用壓縮技術,裁剪後的車牌也不會花很多錢。它們的大小約爲2-3KB。

總之,要以30FPS的速度運行,推理API所需的帶寬大約爲6Mb/s,這個數字是我們可以接受的。

結果

通過大腦皮層進行推理的實時示例。我需要大約20個GPU配置的實例才能順利運行。根據集羣的延遲,您可能需要更多或更少的實例。從捕獲一幀到將其廣播到瀏覽器窗口的平均等待時間約爲0.9秒,考慮到推斷髮生在很遠的地方,這是非常棒的。

文本識別部分可能不是最好的,但至少可以證明,通過提高視頻的分辨率、減小攝像機的視野或對其進行微調,可以使精度更高。

對於數量較多的gpu,可以通過優化來減少。例如,將模型轉換爲使用混合/全半精度(FP16/BFP16)。一般來說,讓模型使用混合精度對精度的影響最小,因此我們不會做出太多的權衡。

T4和v100gpu具有特殊的張量核,在半精度類型矩陣乘法上具有超快速的設計。在T4上,半精度加速度大約是單精度運算的8倍,在V100上,它是單精度運算的10倍。這是一個數量級的差異。這意味着,轉換爲使用單精度/混合精度的模型可以將推理時間減少8倍,而在V100上,每次減少十分之一。

作者沒有將模型轉換爲使用單精度/混合精度,因爲這超出了項目的範圍。就筆者而言,這只是一個優化問題。當Cortex版本0.14發佈時(具有真正的多進程支持和基於隊列的自動伸縮),作者可能會使用它,因此我們也可以利用多進程web服務器。

總而言之,如果所有優化措施都得到實施,那麼將集羣大小從20個GPU實例減少到一個實例實際上是可行的。通過適當的優化,甚至不可能使用單個GPU最大化實例。

爲了使成本更容易接受,在AWS上使用彈性推理可以將成本降低75%,這是非常好的。從視覺上看,您可能有一個管道來實時處理流。不幸的是,Cortex還不支持彈性推理,但由於它已經應用於雷達,我們可以在不久的將來看到它的支持。

注:YOLOv3和CRNN模型可以通過對更大的數據集(大約50-10萬個樣本)進行微調而得到很大改進。到那時,您甚至可以進一步減小幀的大小,以減少數據的使用,而不降低準確性:“補償某處,以便能夠將它帶到其他地方”。將所有這些模型結合起來使用半精確類型(可能還有彈性推理)可以形成一個非常高效/經濟的推理機。

資源

3D打印支架的所有SLDPRT / SLDASM / STL / gcode。

https://www.dropbox.com/sh/fw16vy1okrp606y/AAAwkoWXODmoaOP4yR-z4T8Va?dl=0

該項目的客戶端代碼:

https://github.com/RobertLucian/cortex-license-plate-reader-client

該項目的cortex實現在這裏找到:

https://github.com/cortexlabs/cortex/tree/master/examples/tensorflow/license-plate-reader

Keras的YOLOv3模型庫:

https://github.com/experiencor/keras-yolo3

CRAFT文本檢測器+ CRNN文本識別器的庫:

https://github.com/faustomorales/keras-ocr

車牌的數據集:

https://github.com/RobertLucian/license-plate-dataset

Keras(license_plate.h5)和SavedModel(yolov3文件夾/ zip)格式的YOLOv3模型:

https://www.dropbox.com/sh/4ltffycnzfeul01/AACe85GoIzlmjEnIhuh5JQPma?dl=0

更多論文地址源碼地址:關注“圖像算法”微信公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章