opencv 車牌識別 開源_純手工打造車載車牌識別檢測系統,現已開源!
技術標籤:opencv 車牌識別 開源python的opencv 車牌識別 開源
點選上方“CVer”,選擇加"星標"或“置頂”
重磅乾貨,第一時間送達
本文轉載自:機器之心 |參與:王子嘉、思、一鳴 作者:Robert Lucian Chiriac閒來無事,我們給愛車裝了樹莓派,配了攝像頭、設計了客戶端,搞定了實時車牌檢測與識別系統。
怎樣在不換車的前提下打造一個智慧車系統呢?一段時間以來,本文作者 Robert Lucian Chiriac 一直在思考讓車擁有探測和識別物體的能力。這個想法非常有意思,因為我們已經見識過特斯拉的能力,雖然沒法馬上買一輛特斯拉(不得不提一下,Model 3 現在看起來越來越有吸引力了),但他有了一個主意,可以努力實現這一夢想。
檢測到車牌。
識別每個車牌邊界框內的文字。
一個機器學習模型,以未標記的影象作為輸入,從而檢測到車牌;
某種硬體。簡單地說,我需要連線了一個或多個攝像頭的計算機系統來呼叫我的模型。
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 都已經被平臺解決了),這個有效負載來可以來預測結果,然後返回預測結果。就這麼簡單!
#predictor.pyimportboto3
importpicklelabels=["setosa","versicolor","virginica"]
classPythonPredictor:
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"))defpredict(self,payload):
measurements=[
payload["sepal_length"],
payload["sepal_width"],
payload["petal_length"],
payload["petal_width"],
]label_id=self.model.predict([measurements])[0]
returnlabels[label_id]
為了做預測,你只需要像下面這樣使用 curl 就行了:
curlhttp://***.amazonaws.com/iris-classifier\
-XPOST-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,但此時的質量變低了很多。
推薦閱讀
2020年AI演算法崗求職群來了(含準備攻略、面試經驗、內推和學習資料等)
重磅!CVer-學術微信交流群已成立
掃碼新增CVer助手,可申請加入CVer大群和細分方向技術群,細分方向已涵蓋:目標檢測、影象分割、目標跟蹤、人臉檢測&識別、OCR、姿態估計、超解析度、SLAM、醫療影像、Re-ID、GAN、NAS、深度估計、自動駕駛、強化學習、車道線檢測、模型剪枝&壓縮、去噪、去霧、去雨、風格遷移、遙感影象、行為識別、視訊理解、影象融合、影象檢索、論文投稿&交流等群。
一定要備註:研究方向+地點+學校/公司+暱稱(如目標檢測+上海+上交+卡卡),根據格式備註,可更快被通過且邀請進群
▲長按加群
▲長按關注我們
麻煩給我一個在看!