維多利亞警察局是澳大利亞維多利亞的主要執法機構。去年,發生在維多利亞的盜車數量達到了1.6萬輛,價值1700萬美元,因為發生了這些,我們的警察開始忙于測試各式各樣的技術和解決方案,嘗試去打擊那些偷車賊。
為了防止那些欺詐性質的,即售賣被盜竊車輛,一家叫做 VicRoads ,提供了基于web的服務,可以檢查車輛的注冊情況,該部門也投資了車輛牌照的掃描儀,一個固定的三腳架攝像頭,用于掃描過往的車流,以自動識別被盜車輛。
請不要問我發生過什么,有那么一天下午,我突發奇想,我自己何不做一個車載的車牌掃描儀,功能就是如果車主的車被盜或未注冊,車主將會自動得到通知。在理解了各個組件的工作情況之后,我試圖將它們組合起來,驗證一下是否可行。
在經過了一系列的Google搜索之后,我發現維多利亞警察最近也在試用一個類似的設備,他們預計的推出成本在8600萬美元左右。一位精打細算的評論員指出:“這筆8600萬美元,是為220輛汽車裝備此設備,相當于每臺設備花費390,909美元。”
相信我可以做的比這個更好!
成功的標準在開始做這個設備之前,我列舉了如下的一些關于產品設計的幾個關鍵需求。
圖像必須在本地處理將直播的視頻流上傳到中央服務器看起來是解決此問題的最差的選擇。除了數據流量大,需要花費的寬帶費用很高之外,網絡的延遲將無法保證最后的結果。
雖然說處于數據中心的機器學習算法會越來越準確,我以為能夠在本地處理就足夠了。
能夠處理低質量的圖片我既沒有樹莓派的相機,也沒有USB的攝像頭,我擁有的僅僅是普通的行車記錄儀,它可以隨車即時使用,是樣品數據的理想來源。另外還有一個好處,即行車記錄儀代表車載攝像頭的整體質量,具有普遍性。
需使用開源軟件構建依賴于專有軟件,也就意味著每次你有需求變更或增強功能,都得另外付費,——而且這個過程永無止境。毫無疑問,開源軟件是默認選項。
解決方案大體上來說,我的方案就是從行車記錄儀中讀取圖片,將之傳送到本地設備,本地的設備安裝有開源的牌照識別系統,然后去查詢注冊服務,然后返回結果并進行顯示。
返回到安裝在執法車輛中設備的數據包括車輛的制造廠商和型號(以驗證是否只是車牌被盜),注冊狀態,如果是被偷的車輛的話,就會發出通知。
聰明的讀者是不是覺得挺簡單的?是的,它確實也沒有那么的復雜。舉例來說,牌照的處理可以交由一個叫做 openalpr 的程序庫,這其實就是所涉及到的識別牌照上的字符全部:
openalpr.IdentifyLicense(imagePath, function (error, output) { // handle result});輕微警告 公開訪問 VicRoads 的 API 還不可用,因此此處涉及到的車輛牌照檢查的web只是一個原型,或許有人看不慣——這只是一個概念驗證,我并沒有黑進任何服務器。
下面就是我寫的用作概念驗證的略顯粗糙的代碼:
// 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 infofunction 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 };}結果我必須坦率的和大家說,結果著實令人吃驚。
我本以為開源的車輛牌照識別一定不怎么好用,另外,我甚至認為此程序未必正對澳大利亞的牌照進行過優化。
結果讓我想到的意外,如它可以在較開闊的視野識別到車牌。
(圖片說明:添加注釋生效,盡管有強光發射、鏡頭失真,但是依然識別到了車牌。)
雖然解決方案有些瑕疵,即對于特殊字母的處理不夠完美。
(圖片說明:讀牌照不夠精準,將M讀成了H)
但是,還是可以接受的,大多數時候能夠得出正確結果。
(圖片說明:幾幀之后,M被正確識別,并具有更高的置信度)
正如你所看到的上面的兩幅圖,在多處理了幾幀圖像之后,可信度從87%上升到了91%。
我開始對此方案有了足夠的信心,對于雙關語的處理,可以通過提高樣本率可以提高準確性,然后按最高置信度來排序。或者,在接受驗證注冊號之前,設置一個閾值,如僅接受大于90%的置信度的圖片。
當然,這些都是可通過修改代碼來讓軟件更加的完善,而且還可以使用本地的數據來訓練車輛識別軟件。
8600萬美元的問題公平地說,我完全不知道不知道8600萬美元都花在了哪里?我也不會說訓練本地的機器學習開源軟件,為了提高準確性,而毋需花費額外的金錢,或者是使用試驗性質的 BlueNet 系統。
我還可以預估出來,這些預算還會包括替代舊的數據庫和應用程序,從而能夠支持每輛車,每秒中的被頻繁的查詢,以達到低延時的效果。
換句話說,每輛車花費 ~$391k 是很奢侈的,尤其是如果BlueNet不是特別準確,而且還沒有大型的系統擴展,以及升級相關依賴的系統。
未來的應用盡管這個系統,很容易被人認為是奧威爾式的“永遠在線”的牌照網絡監視,但是此項技術仍然有很多正面的意義。可以想象一下,這個系統可以掃描到前方的被盜竊的車輛,然后會發送信息給丟失愛車的車主或家人,信息包括車輛目前的位置和要去往的目的地,車主找回自己愛車的幾率就會大很多。
特斯拉早已經實現了接收OTA更新功能的相機和傳感器,—— 想象一下,這是多么強大的一組守護者。Uber和Lyft的司機若配置了此設備,那么就可以覆蓋更大范圍的,讓偷車賊無處可遁。
使用開源技術和現成的組件,似乎有可能提供一個提供更高回報率的解決方案 - 投資遠低于8600萬美元。
關于作者Tait Brown,自稱是一名UX設計師和開發者,會做一些和用戶體驗有關的事情,并樂意分享tweet。
查看英文原文:How I replicated an $86 million project in 57 lines of code