日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式微處理器
[導讀]來源 :機器之心編譯 原文地址:https://towardsdatascience.com/i-built-a-diy-license-plate-reader-with-a-raspberry-pi-and-machine-learning-7e428d3c7401 作者:Robert Lucian Chiriac 機器之心編譯 閑來無事,我們給愛車裝了樹莓派,配了攝像頭、設(shè)計

來源 :機器之心編譯

原文地址:https://towardsdatascience.com/i-built-a-diy-license-plate-reader-with-a-raspberry-pi-and-machine-learning-7e428d3c7401


作者:Robert Lucian Chiriac 機器之心編譯

閑來無事,我們給愛車裝了樹莓派,配了攝像頭、設(shè)計了客戶端,搞定了實時車牌檢測與識別系統(tǒng)。

怎樣在不換車的前提下打造一個智能車系統(tǒng)呢?一段時間以來,本文作者 Robert Lucian Chiriac 一直在思考讓車擁有探測和識別物體的能力。這個想法非常有意思,因為我們已經(jīng)見識過特斯拉的能力,雖然沒法馬上買一輛特斯拉(不得不提一下,Model 3 現(xiàn)在看起來越來越有吸引力了),但他有了一個主意,可以努力實現(xiàn)這一夢想。


所以,作者用樹莓派做到了,它放到車上可以實時檢測車牌。


在接下來的內(nèi)容里,我們將介紹項目中的每個步驟,并提供 GitHub 項目地址,其中項目地址只是客戶端工具,還其它數(shù)據(jù)集與預(yù)訓練模型都可以在原博客結(jié)尾處找到。

項目地址:
https://github.com/RobertLucian/cortex-license-plate-reader-client

下面,讓我們看看作者 Robert Lucian Chiriac 是如何一步步打造一個好用的車載檢測識別系統(tǒng)。

放一張成品圖鎮(zhèn)樓。

第一步:確定項目范圍

開始之前,我腦海里出現(xiàn)的第一個問題是這樣一個系統(tǒng)應(yīng)該能夠做到什么。如果說我活到現(xiàn)在學到了什么,那就是循序漸進——從小處著手永遠是最好的策略。所以,除了基本的視覺任務(wù),我需要的只是在開車時能清楚地識別車牌。這個識別過程包括兩個步驟:

  1. 檢測到車牌。

  2. 識別每個車牌邊界框內(nèi)的文本。


我覺得如果我能完成這些任務(wù),再做其他類似的任務(wù)(如確定碰撞風險、距離等)就會容易得多。我甚至可能可以創(chuàng)建一個向量空間來表示周圍的環(huán)境——想想都覺得酷。

在確定這些細節(jié)之前,我知道我得先做到:

  • 一個機器學習模型,以未標記的圖像作為輸入,從而檢測到車牌;

  • 某種硬件。簡單地說,我需要連接了一個或多個攝像頭的計算機系統(tǒng)來調(diào)用我的模型。


那就先從第一件事開始吧——構(gòu)建對象檢測模型。

第二步:選擇正確的模型

經(jīng)過仔細研究,我決定用這些機器學習模型:

  1. YOLOv3- 這是當下最快的模型之一,而且跟其他 SOTA 模型的 mAP 相當。我們用這個模型來檢測物體;

  2. CRAFT 文本檢測器 - 我們用它來檢測圖像中的文本;

  3. CRNN - 簡單來說,它就是一個循環(huán)卷積神經(jīng)網(wǎng)絡(luò)模型。為了將檢測到的字符按照正確的順序排成單詞,它必須是時序數(shù)據(jù);


這三個模型是怎么通力合作的呢?下面說的就是操作流程了:

  1. 首先,YOLOv3 模型從攝像機處接收到一幀幀圖像,然后在每個幀中找到車牌的邊界框。這里不建議使用非常精確的預(yù)測邊界框——邊界框比實際檢測對象大一些會更好。如果太擠,可能會影響到后續(xù)進程的性能;

  2. 文本檢測器接收 YOLOv3 裁剪過的車牌。這時,如果邊界框太小,那么很有可能車牌文本的一部分也被裁掉了,這樣預(yù)測結(jié)果會慘不忍睹。但是當邊界框變大時,我們可以讓 CRAFT 模型檢測字母的位置,這樣每個字母的位置就可以非常精確;

  3. 最后,我們可以將每個單詞的邊界框從 CRAFT 傳遞到 CRNN 模型,以預(yù)測處實際單詞。


有了我的基本模型架構(gòu)草圖,我可以開始轉(zhuǎn)戰(zhàn)硬件了。

第三步:設(shè)計硬件

當我發(fā)現(xiàn)我需要的是一種低功耗的硬件時,我想起了我的舊愛:樹莓派。因為它有專屬相機 Pi Camera,也有足夠的計算能力在不錯的幀率下預(yù)處理各個幀。Pi Camera 是樹莓派(Raspberry Pi)的實體攝像機,而且有其成熟完整的庫。

為了接入互聯(lián)網(wǎng),我可以通過 EC25-E 的 4G 接入,我以前的一個項目里也用過它的一個 GPS 模塊,詳情可見:

博客地址:https://www.robertlucian.com/2018/08/29/mobile-network-access-rpi/

然后我要開始設(shè)計外殼了——把它掛在汽車的后視鏡上應(yīng)該沒問題,所以我最終設(shè)計了一個分為兩部分的支撐結(jié)構(gòu):

  1. 在后視鏡的方向上,樹莓派+ GPS 模塊+ 4G 模塊將保留下來。關(guān)于我使用的 GPS 和 4G 天線,你可以去看一下我關(guān)于 EC25-E 模塊的文章;

  2. 在另一側(cè),我用一個利用球關(guān)節(jié)活動的手臂來支撐 Pi Camera


我會用我可靠的 Prusa i3 MK3S 3D 打印機來打印這些零件,在原文文末也提供了 3D 打印參數(shù)。

圖 1 :樹莓派+4G/GPS 殼的外形

圖 2: 利用球關(guān)節(jié)活動臂支撐 Pi Camera

圖 1 和圖 2 就是它們渲染時候的樣子。注意這里的 c 型支架是可插拔的,所以樹莓派的附件和 Pi Camera 的支撐物沒有和支架一起打印出來。他們共享一個插座,插座上插著支架。如果某位讀者想要復現(xiàn)這個項目,這是非常有用的。他們只需要調(diào)整后視鏡上的支架就可以了。目前,這個底座在我的車(路虎 Freelander)上工作得很好。

圖 3:Pi Camera 支撐結(jié)構(gòu)的側(cè)視圖

圖 4:Pi Camera 支撐結(jié)構(gòu)和 RPi 底座的正視圖

圖 5:預(yù)計的相機視野

圖 6:內(nèi)置 4G/GPS 模塊、Pi Camera,樹莓派的嵌入式系統(tǒng)近照

顯然,這些東西需要一些時間來建模,我需要做幾次才能得到堅固的結(jié)構(gòu)。我使用的 PETG 材料每層高度為 200 微米。PETG 在 80-90 攝氏度下可以很好地工作,并且對紫外線輻射的抵抗力很強——雖然沒有 ASA 好,但是也很強。

這是在 SolidWorks 中設(shè)計的,所以我所有的 SLDPRT/SLDASM 文件以及所有的 STLs 和 gcode 都可以在原文末找到。你也可以用這些東西來打印你自己的版本。

第四步:訓練模型

既然硬件解決了,就該開始訓練模型了。大家應(yīng)該都知道,盡可能站在巨人的肩膀上工作。這就是遷移學習的核心內(nèi)容了——先用非常大的數(shù)據(jù)集來學習,然后再利用這里面學到的知識。

YOLOv3

我在網(wǎng)上找了很多預(yù)先訓練過的車牌模型,并沒有我最初預(yù)期的那么多,但我找到了一個在 3600 張車牌圖上訓練過的。這個訓練集并不大,但也比什么都沒有強。除此之外,它也是在 Darknet 的預(yù)訓練模型的基礎(chǔ)上進行訓練的,所以我可以直接用。

模型地址:https://github.com/ThorPham/License-plate-detection

因為我已經(jīng)有了一個可以記錄的硬件系統(tǒng),所以我決定用我的系統(tǒng)在鎮(zhèn)上轉(zhuǎn)上幾個小時,收集新的視頻幀數(shù)據(jù)來對前面的模型進行微調(diào)。

我使用 VOTT 來對那些含有車牌的幀進行標注,最終創(chuàng)建了一個包含 534 張圖像的小數(shù)據(jù)集,這些圖像中的車牌都有標記好的邊界框。

數(shù)據(jù)集地址:https://github.com/RobertLucian/license-plate-dataset

然后我又找到利用 Keras 實現(xiàn) YOLOv3 網(wǎng)絡(luò)的代碼,并用它來訓練我的數(shù)據(jù)集,然后將我的模型提交到這個 repo,這樣別人也能用它。我最終在測試集上得到的 mAP 是 90%,考慮到我的數(shù)據(jù)集非常小,這個結(jié)果已經(jīng)很好了。

  • Keras 實現(xiàn):https://github.com/experiencor/keras-yolo3

  • 提交合并請求:https://github.com/experiencor/keras-yolo3/pull/244


CRAFT & CRNN

為了找到一個合適的網(wǎng)絡(luò)來識別文本,我經(jīng)過了無數(shù)次的嘗試。最后我偶然發(fā)現(xiàn)了 keras-ocr,它打包了 CRAFT 和 CRNN,非常靈活,而且有預(yù)訓練過的模型,這太棒了。我決定不對模型進行微調(diào),讓它們保持原樣。

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

最重要的是,用 keras-ocr 預(yù)測文本非常簡單?;旧暇褪菐仔写a。你可以去該項目主頁看看這是如何做到的。

第五步:部署我的車牌檢測模型

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

  1. 在本地進行所有的推理;

  2. 在云中進行推理。


這兩種方法都有其挑戰(zhàn)。第一個意味著有一個中心「大腦」計算機系統(tǒng),這很復雜,而且很貴。第二個面臨的則是延遲和基礎(chǔ)設(shè)施方面的挑戰(zhàn),特別是使用 gpu 進行推理。

在我的研究中,我偶然發(fā)現(xiàn)了一個名為 cortex 的開源項目。它是 AI 領(lǐng)域的新人,但作為 AI 開發(fā)工具的下一個發(fā)展方向,這無疑是有意義的。

cortex 項目地址:https://github.com/cortexlabs/cortex

基本上,cortex 是一個將機器學習模型部署為生產(chǎn)網(wǎng)絡(luò)服務(wù)的平臺。這意味著我可以專注于我的應(yīng)用程序,而把其余的事情留給 cortex 去處理。它在 AWS 上完成所有準備工作,而我唯一需要做的就是使用模板模型來編寫預(yù)測器。更棒的是,我只需為每個模型編寫幾十行代碼。

如下是從 GitHub repo 獲取的 cortex 運行時的終端。如果這都稱不上優(yōu)美簡潔,那我就不知道該用什么詞來形容它了:


因為這個計算機視覺系統(tǒng)不是為了實現(xiàn)自動駕駛而設(shè)計的,所以延遲對我來說不那么重要,我可以用 cortex 來解決這個問題。如果它是自動駕駛系統(tǒng)的一部分,那么使用云提供商提供的服務(wù)就不是一個好主意,至少現(xiàn)在不是。

部署帶有 cortex 的 ML 模型只需:

  1. 定義 cortex.yaml 文件,它是我們的 api 的配置文件。每個 API 將處理一種類型的任務(wù)。我給 yolov3 的 API 分配的任務(wù)是檢測給定幀上的車牌邊界框,而 crnn API 則是在 CRAFT 文本檢測器和 crnn 的幫助下預(yù)測車牌號碼;

  2. 定義每個 API 的預(yù)測器。基本上你要做的就是在 cortex 中定義一個特定類的 predict 方法來接收一個有效負載(所有的 servy part 都已經(jīng)被平臺解決了),這個有效負載來可以來預(yù)測結(jié)果,然后返回預(yù)測結(jié)果。就這么簡單!


這里有一個經(jīng)典 iris 數(shù)據(jù)集的預(yù)測器示例,但因為文章篇幅原因,具體細節(jié)在此就不做贅述了。項目鏈接里可以找到 cortex 使用這兩個 api 的方法——這個項目的所有其他資源都在本文的最后。

# predictor.pyimport boto3
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]

為了做預(yù)測,你只需要像下面這樣使用 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這樣的反饋,非常簡單!

第六步:開發(fā)客戶端

有了 cortex 來幫我進行部署之后,我就可以開始設(shè)計客戶端了——這算是比較棘手的部分。

我想到了以下架構(gòu):

  1. 從 Pi Camera 以可接受的分辨率(800x450 或 480x270)收集幀速率為 30 FPS 的幀,并將每個幀推入一個公共隊列;

  2. 在一個單獨的進程中,我將從隊列中取出幀,并將它們分發(fā)給不同線程上的多個工作站;

  3. 每個工作線程(或者我稱之為推斷線程)都會向我的 cortex API 發(fā)出 API 請求。首先,一個請求到我的 yolov3API,然后,如果有任何車牌檢測到,另一個請求會帶著一批裁剪的車牌發(fā)到我的 crnn API。預(yù)測的車牌號碼將以文本格式返回;

  4. 將每個檢測到的牌照(帶不帶識別后的文本都可以)推到另一個隊列,最終將其廣播到瀏覽器頁面。同時,還將車牌號碼預(yù)測推到另一個隊列,以便稍后將其以 csv 格式保存到磁盤;

  5. 廣播隊列將接收一組無序的幀。consumer 的任務(wù)是先把它們放在一個非常小的緩沖區(qū)(幾個幀的大小),每次廣播一個新的幀給 client 重新排序。這個 consumer 在另一個進程上單獨運行,它還必須嘗試保持隊列的大小固定為指定值,以便以一致的幀速率顯示幀。顯然,如果隊列大小下降,那么幀率的下降是成比例的,反之亦然;

  6. 與此同時,在主進程中還會運行另一個線程,從另一個隊列獲取預(yù)測和 GPS 數(shù)據(jù)。當客戶端收到終止信號時,預(yù)測、GPS 數(shù)據(jù)和時間也會被轉(zhuǎn)存到 csv 文件中。


下圖是客戶端與 AWS 上的云 api 之間的關(guān)系流程圖。

圖 7:基于 cortex 提供的云 api 與客戶端流程圖

在我們的例子中,客戶端是樹莓派,推理請求發(fā)送到的云 api 由 AWS 上的 cortex 提供。

客戶端的源代碼也可以在其 GitHub 中找到:https://github.com/robertlucian/cortex-licens-plate-reader-client

我必須克服的一個挑戰(zhàn)是 4G 的帶寬。最好減少此應(yīng)用程序所需的帶寬,以減少可能的 hangups 或?qū)捎脭?shù)據(jù)的過度使用。我決定讓 Pi Camera 使用一個非常低的分辨率:480x270(我們這里可以用一個小分辨率,因為 Pi Camera 的視野非常窄,所以我們?nèi)匀豢梢院苋菀椎刈R別車牌)。

不過,即使是在這個分辨率下,每一幀的 JPEG 大小也是大約 100KB(0.8MBits)。乘以每秒 30 幀就得到 3000KB,也就是 24mb /s,這還是在沒有 HTTP 開銷的情況下,這是很多的。

因此,我用了一些小技巧:

  • 將寬度減少到 416 像素,也就是 YOLOv3 模型所需要的大小,而且尺度顯然是完好無損的;

  • 將圖像轉(zhuǎn)換為灰度圖;

  • 移除圖片頂部 45% 的部分。這里的想法是車牌不會出現(xiàn)在車架的頂部,因為汽車不會飛,對吧?據(jù)我所知,刪除 45% 的圖像并不影響預(yù)測器的性能;

  • 再次轉(zhuǎn)換圖像為 JPEG,但此時的質(zhì)量變低了很多。


最終得到的幀的大小大約是 7-10KB,這是非常好的。這相當于 2.8Mb/s。但是考慮到響應(yīng)等所有的開銷,它大約是 3.5Mb/s。對于 crnn API,裁剪過的車牌根本不需要太多空間,即使沒有進行壓縮,它們的大小也就是 2-3KB 左右一個。

總而言之,要以 30FPS 的速度運行,推理 api 所需的帶寬大約是 6Mb/s,這個數(shù)字我可以接受。

結(jié)果

成功了!

上面這個是通過 cortex 進行實時推理的例子。我需要大約 20 個裝備了 gpu 的實例才能順暢地運行它。根據(jù)這一組 gpu 的延遲,你可能需要更多的 gpu 或是更少的實例。從捕獲幀到向瀏覽器窗口廣播幀之間的平均延遲約為 0.9 秒,考慮到推斷發(fā)生在很遠的地方,這真是太神奇了——到現(xiàn)在我還是覺得驚訝。

文本識別部分可能不是最好的,但它至少證明了一點——它可以通過增加視頻的分辨率或通過減少攝像機的視場或通過微調(diào)來更精確。

至于 GPU 需求數(shù)太高的問題,這可以通過優(yōu)化來解決。例如,在模型中使用混合精度/全半精度 (FP16/BFP16)。一般來說,讓模型使用混合精度對精度的影響很小,所以我們并沒有做太多的權(quán)衡。

總而言之,如果所有的優(yōu)化都到位,那么將 gpu 的數(shù)量從 20 個減少到一個實際上是可行的。如果進行了適當?shù)膬?yōu)化,甚至一個 gpu 的資源都用不完。

-END-




推薦閱讀



【01】35 美元的樹莓派是如何改變世界的?
【02】樹莓派4與英偉達Jetson Nano,誰是最佳嵌入式“電腦”?
【03】樹莓派4正式發(fā)布:性能飆升 配件豐富 35美元起售
【04】有了Python+樹莓派,我也做了款人工智能相機
【05】樹莓派可以當 PC 用嗎?這位仁兄以身試「莓」了一回


免責聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除

免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉