「57行代碼搞定8600萬美元項目」用開源工具DIY車牌識別系統

圖像處理 HTML 掃描儀 Gecko 新智元 新智元 2017-09-03
「57行代碼搞定8600萬美元項目」用開源工具DIY車牌識別系統

新智元編譯

「57行代碼搞定8600萬美元項目」用開源工具DIY車牌識別系統

(文/Tiait Brown)維多利亞警察局是澳大利亞維多利亞州的主要執法機構。過去一年,維多利亞州共有超過1.6萬輛車被盜,費用約為1.7億美元,警方正在試驗各種技術驅動的解決方案來打擊汽車盜竊。

為了防止盜用車輛的欺詐性銷售,管理部門VicRoads啟用了一項基於網絡的服務來檢查車輛註冊狀況。VicRoads還投資購買了一個固定牌照掃描儀——一個固定的三腳架攝像機,可以掃描過往車輛,自動識別被盜車輛。

不要問我為什麼,但有天下午,我突然想要製作一個車載車牌掃描儀,如果有車輛被盜或被未註冊,這個掃描儀將自動通知你。我知道有一些單獨的組件存在,於是想知道將它們組裝在一起會有多難。

但是,谷歌搜索一番後我發現,維多利亞警察局已經就投資類似裝置進行了問詢,估計的費用在8600萬美元左右。 一位精明的評論員指出,這個系統要配置在220輛車上,由於成本總共8600萬美元,相當於每輛車支出390,909美元。

當然,我們能比這做得更好。

「57行代碼搞定8600萬美元項目」用開源工具DIY車牌識別系統

現有的車牌識別系統(白車+攝像頭)

成功方案

在開始之前,我簡要介紹了產品設計的幾個關鍵要求。

1. 圖像處理必須在本地處理 將直播視頻流傳給中央處理器似乎是解決這個問題最沒有效率的方法。除了數據流量帶來的鉅額帳單,還會產生網絡延遲問題,何況速度可能原本就不高。雖然集中式的機器學習算法隨著時間的推移會變得更加準確,但我想知道使用本地的設備實現會不會“就夠了”。

2. 必須能夠處理低質量的圖像 因為我沒有Raspberry Pi攝像頭或USB網絡攝像頭,所以我使用 dashcam 鏡頭——隨時可用,而且是個理想的樣本數據源。此外,dashcam視頻也代表了從車載攝像頭能夠獲得的視頻的整體質量水平。

3. 需要使用開源技術搭建 不可能使用有專利的技術,否則每次都會收費。使用開源技術是沒的說的選擇。

解決方案

從一個高的層面看,我的解決方案從一個 dashcam 視頻中獲取圖像,通過一個安裝在本地設備上的開源車牌識別系統,請求註冊檢查服務,然後返回結果,進行顯示。

返回到安裝在執法車輛上的設備的數據,包括車輛製造商和型號(只有被盜時才會進行驗證)、登記狀態和車輛報告被盜時的通知。

如果你覺得聽起來很簡單,那是因為這確實很簡單。例如,圖像處理都可以由openalpr庫處理。涉及到識別車牌上的字符,你需要做的真的就是這樣了:

openalpr.IdentifyLicense(imagePath, function (error, output) { // handle result });

一個小小的警告

VicRoads API 公開訪問不可用,因此我這款原型的牌照檢測需要從網上扒下來再做。雖然一般人都不太認可這個行為,但我這只是一個概念的證明,我也沒攻擊任何人的服務器。

以下是我的概念驗證:

「57行代碼搞定8600萬美元項目」用開源工具DIY車牌識別系統「57行代碼搞定8600萬美元項目」用開源工具DIY車牌識別系統

看不清?沒關係,可以再來一次(因為真的不長):

// Open form and submit enquire for `rego` function getInfo(rego) { horseman .userAgent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0') .open(url) .type('#registration-number-ctrl input[type=text]', rego) .click('.btn-holder input') .waitForSelector('.ctrl-holder.ctrl-readonly') .html .then(function(body) { console.log(processInfo(body, rego)); return horseman.close; }); } // Scrape the results for key info function processInfo(html, rego) { var $ = cheerio.load(html); var vehicle = $('label.label').filter(function { return $(this).text.trim === 'Vehicle:'; }).next.text.trim; var stolen = $('label.label').filter(function { return $(this).text.trim === 'Stolen status:'; }).next.text.trim; var registration = $('label.label').filter(function { return $(this).text.trim === 'Registration status & expiry date:'; }).next.text.trim; return { rego, vehicle, stolen, registration }; }

結果

我必須說結果是個驚喜。

我預計開源車牌識別相當垃圾。此外,圖像識別算法可能沒有針對澳大利亞牌照進行優化。

結果,我的解決方案能夠在各種視野中識別車牌。

「57行代碼搞定8600萬美元項目」用開源工具DIY車牌識別系統

當然,個別字符識別起來還是有問題。

「57行代碼搞定8600萬美元項目」用開源工具DIY車牌識別系統

但是……算法最後還是成功了。

「57行代碼搞定8600萬美元項目」用開源工具DIY車牌識別系統

正如你在上述兩幅圖像中看到的那樣,幾秒鐘後的圖像處理從87%的置信度評分上升到超過91%

我相信準確性可以通過提高採樣率來提高,然後按最高置信度排序。或者,可以調整閾值,在置信度超過90%的情況下才接受驗證註冊號。

這些都是很直接的 code-first 修復,並且不排除使用本地數據集訓練車牌識別軟件。

一個 8600萬美元的問題

公平起見,我完全不知道8600萬美元這個數字都包含了些什麼,也不知道本地化訓練的開源工具的準確性跟 pilot BlueNet 系統相比會有什麼結果。

我預計這一預算裡包括更新幾個遺留數據庫和軟件應用程序,支持每秒對多輛車進行高速、低延遲的車牌查詢。

另一方面,每輛車的識別成本在 39.1萬美元左右看上去真的挺貴——特別是如果BlueNet的識別結果不是特別準確,而且沒有大規模的IT項目停產或升級相關係統。

未來應用

雖然在想法上很容易陷入喬治奧威爾式的“總是看著你”,但這種技術還時有很多積極的應用。試想,一個被動識別摩托車的系統,在掃描到綁匪後自動通報當局和家屬綁匪目前的位置和方向。

特斯拉斯車輛已經有攝像頭和傳感器,能夠接收OTA更新——想象一下把這些車都變成虛擬的綁匪監測器(samaritans)會怎樣。Uber 和 Lyft 司機也可以配備這些設備,大大增加覆蓋面積。

總之,使用開源技術和現有組件,做出一個回報率更高的解決方案是有可能的——而投資遠遠低於8600萬美元。

編譯來源:https://medium.freecodecamp.org/how-i-replicated-an-86-million-project-in-57-lines-of-code-277031330ee9

點擊閱讀原文可查看職位詳情,期待你的加入~

相關推薦

推薦中...