sim插拔识别时间_特斯拉+树莓派实现车牌识别检测系统
轉自機器之心 |?作者:Robert Lucian Chiriac |?參與:王子嘉、思、一鳴
怎樣在不換車的前提下打造一個智能車系統呢?一段時間以來,本文作者 Robert Lucian Chiriac 一直在思考讓車擁有探測和識別物體的能力。這個想法非常有意思,因為我們已經見識過特斯拉的能力,雖然沒法馬上買一輛特斯拉(不得不提一下,Model 3 現在看起來越來越有吸引力了),但他有了一個主意,可以努力實現這一夢想。
所以,作者用樹莓派做到了,它放到車上可以實時檢測車牌。在接下來的內容里,我們將介紹項目中的每個步驟,并提供 GitHub 項目地址,其中項目地址只是客戶端工具,還其它數據集與預訓練模型都可以在原博客結尾處找到。項目地址:https://github.com/RobertLucian/cortex-license-plate-reader-client下面,讓我們看看作者 Robert Lucian Chiriac 是如何一步步打造一個好用的車載檢測識別系統。放一張成品圖鎮樓。第一步:確定項目范圍開始之前,我腦海里出現的第一個問題是這樣一個系統應該能夠做到什么。如果說我活到現在學到了什么,那就是循序漸進——從小處著手永遠是最好的策略。所以,除了基本的視覺任務,我需要的只是在開車時能清楚地識別車牌。這個識別過程包括兩個步驟:檢測到車牌。
識別每個車牌邊界框內的文本。
一個機器學習模型,以未標記的圖像作為輸入,從而檢測到車牌;
某種硬件。簡單地說,我需要連接了一個或多個攝像頭的計算機系統來調用我的模型。
YOLOv3- 這是當下最快的模型之一,而且跟其他 SOTA 模型的 mAP 相當。我們用這個模型來檢測物體;
CRAFT 文本檢測器 - 我們用它來檢測圖像中的文本;
CRNN - 簡單來說,它就是一個循環卷積神經網絡模型。為了將檢測到的字符按照正確的順序排成單詞,它必須是時序數據;
首先,YOLOv3 模型從攝像機處接收到一幀幀圖像,然后在每個幀中找到車牌的邊界框。這里不建議使用非常精確的預測邊界框——邊界框比實際檢測對象大一些會更好。如果太擠,可能會影響到后續進程的性能;
文本檢測器接收 YOLOv3 裁剪過的車牌。這時,如果邊界框太小,那么很有可能車牌文本的一部分也被裁掉了,這樣預測結果會慘不忍睹。但是當邊界框變大時,我們可以讓 CRAFT 模型檢測字母的位置,這樣每個字母的位置就可以非常精確;
最后,我們可以將每個單詞的邊界框從 CRAFT 傳遞到 CRNN 模型,以預測出實際單詞。
在后視鏡的方向上,樹莓派+ GPS 模塊+ 4G 模塊將保留下來。關于我使用的 GPS 和 4G 天線,你可以去看一下我關于 EC25-E 模塊的文章;
在另一側,我用一個利用球關節活動的手臂來支撐 Pi Camera
Keras 實現:https://github.com/experiencor/keras-yolo3
提交合并請求:https://github.com/experiencor/keras-yolo3/pull/244
在本地進行所有的推理;
在云中進行推理。
定義 cortex.yaml 文件,它是我們的 api 的配置文件。每個 API 將處理一種類型的任務。我給 yolov3 的 API 分配的任務是檢測給定幀上的車牌邊界框,而 crnn API 則是在 CRAFT 文本檢測器和 crnn 的幫助下預測車牌號碼;
定義每個 API 的預測器。基本上你要做的就是在 cortex 中定義一個特定類的 predict 方法來接收一個有效負載(所有的 servy part 都已經被平臺解決了),這個有效負載來可以來預測結果,然后返回預測結果。就這么簡單!
import?picklelabels?=?["setosa",?"versicolor",?"virginica"]
class?PythonPredictor:
????def?__init__(self,?config):
????????s3?=?boto3.client("s3")
????????s3.download_file(config["bucket"],?config["key"],?"model.pkl")
????????self.model?=?pickle.load(open("model.pkl",?"rb"))????def?predict(self,?payload):
????????measurements?=?[
????????????payload["sepal_length"],
????????????payload["sepal_width"],
????????????payload["petal_length"],
????????????payload["petal_width"],
????????]????????label_id?=?self.model.predict([measurements])[0]
????????return?labels[label_id]為了做預測,你只需要像下面這樣使用 curl 就行了:curl?http://***.amazonaws.com/iris-classifier?\
????-X?POST?-H?"Content-Type:?application/json"?\
????-d?'{"sepal_length":?5.2,?"sepal_width":?3.6,?"petal_length":?1.4,?"petal_width":?0.3}'然后你會收到類似setosa這樣的反饋,非常簡單!第六步:開發客戶端有了 cortex 來幫我進行部署之后,我就可以開始設計客戶端了——這算是比較棘手的部分。我想到了以下架構:
從 Pi Camera 以可接受的分辨率(800x450 或 480x270)收集幀速率為 30 FPS 的幀,并將每個幀推入一個公共隊列;
在一個單獨的進程中,我將從隊列中取出幀,并將它們分發給不同線程上的多個工作站;
每個工作線程(或者我稱之為推斷線程)都會向我的 cortex API 發出 API 請求。首先,一個請求到我的 yolov3API,然后,如果有任何車牌檢測到,另一個請求會帶著一批裁剪的車牌發到我的 crnn API。預測的車牌號碼將以文本格式返回;
將每個檢測到的牌照(帶不帶識別后的文本都可以)推到另一個隊列,最終將其廣播到瀏覽器頁面。同時,還將車牌號碼預測推到另一個隊列,以便稍后將其以 csv 格式保存到磁盤;
廣播隊列將接收一組無序的幀。consumer 的任務是先把它們放在一個非常小的緩沖區(幾個幀的大小),每次廣播一個新的幀給 client 重新排序。這個 consumer 在另一個進程上單獨運行,它還必須嘗試保持隊列的大小固定為指定值,以便以一致的幀速率顯示幀。顯然,如果隊列大小下降,那么幀率的下降是成比例的,反之亦然;
與此同時,在主進程中還會運行另一個線程,從另一個隊列獲取預測和 GPS 數據。當客戶端收到終止信號時,預測、GPS 數據和時間也會被轉存到 csv 文件中。
將寬度減少到 416 像素,也就是 YOLOv3 模型所需要的大小,而且尺度顯然是完好無損的;
將圖像轉換為灰度圖;
移除圖片頂部 45% 的部分。這里的想法是車牌不會出現在車架的頂部,因為汽車不會飛,對吧?據我所知,刪除 45% 的圖像并不影響預測器的性能;
再次轉換圖像為 JPEG,但此時的質量變低了很多。
趣無盡 2019 年度熱門項目回顧
用樹莓派改造 NumWorks 計算器
用樹莓派 Zero 制造電動輪椅后視鏡用 LED 燈絲手工制作一盞「罐頭燈」樹莓派DIY真人CS裝備:紅外線激光槍總結
以上是生活随笔為你收集整理的sim插拔识别时间_特斯拉+树莓派实现车牌识别检测系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 坦克世界怎么没自动检测项
- 下一篇: 高考提前批可以公费师范生、军校、警校一起