本文作者是 Lukas Biewald—CrowdFlower 的創始人,Lukas 曾被《Inc.》雜誌評選為30歲以下傑出企業家。CrowdFlower 成立於2009年,是一個按需勞動力的大數據平台,幫助企業收集培訓數據並進行人機交互機器學習。
Lukas Biewald 畢業於斯坦福大學,獲得數學學士學位和電腦科學碩士學位。Lukas 曾任職 Yahoo 日本搜尋團隊主管,之後作為高級數據科學家就職於 Powerset,該公司於2008年被微軟收購。
深度學習和廉價硬體的探索
▲早期航空器,1818(來源:維基百科&美國國會數據庫)
在製造了一個圖像識別機器人後,顯然下一步是製作一個可飛行的版本。於是我決定打造一款能夠進行面部識別並響應語音命令的自動化無人機。
選擇一款預製無人機
對無人機進行編程,最難的部分是如何開始,我是從組裝無人機零件開始的。但是幾乎和之前所有 DIY 項目一樣,自己組裝無人機花了我很多的錢。而且坦白的說,我手工打造的無人機一直沒有穩定飛行過。可以肯定的是,直接購買預製版本才是更加簡單經濟的選擇。
大多數無人機製造商都聲稱提供 API 接口,但對於業餘愛好者來說並沒有什麼明顯的優勢。市面上帶似乎可用的 API 接口的無人機,大多售價都超過1000美元,這是一個很高的進入門檻。
經過一些調查以後,我發現了 Parrot AR Drone 2.0(見下圖)。我認為對於業餘愛好者來說,這是一款理想的機器。它的價格不高,還可以進行編程。你可以選擇花200美元買一台新機器,但由於很多人買了無人機又從來不使用它們,因此購買一台二手機器也是個不錯的選擇。在eBay上二手無人機的售價大約是130美元甚至更低。
▲我收藏的各類無人機,Parrot AR Drone 無人機掛在最左邊
Parrot AR 無人機飛行的穩定性沒有更貴的新款 Parrot Bebop 2.0 好(售價大約550美元),但是 Parrot AR 提供一個好用的 node.js 客戶端庫叫做 node-ar-drone,很適合在上面進行開發。
另外一個優勢:Parrot AR 無人機很結實。在測試自動化程序的過程中,無論它被撞牆上、家具上、室內植物上和客人身上,他仍然能夠良好的飛行。
相比給地面機器人編程,給無人機編程最糟的地方是電池續航時間短。一塊電池需要充電幾個小時,才能飛行大約10分鐘的時間。因此我建議多買兩塊備用電池,測試的時候可以循環使用。
給我的無人機編程
由於 Javascript 天生的驅動能力,因此是非常理想的無人機編程語言。相信我,無人機飛行中會遇到很多異步事件。我雖然沒有在 Node上 花費很多時間,但這個語言讓我印象深刻。我最近一次認真的為機器人編程使用的是 C 語言。用 C 語言處理線程和各種異常是十分痛苦的,因此最好少用。我希望有人為其它無人機平台建立Javascript開發包,因為這個語言讓我們處理不確定性的開發事件,變得簡單有趣。
架構
我決定在筆電電腦上執行邏輯,在云端進行機器學習。比起直接在樹莓派硬體上執行神經網路,這種架構的延遲更低。我認為這種架構對目前的業餘無人機開發項目來說是可行的。
微軟、Google、IBM 和亞馬遜都有快速、廉價的云端機器學習 API。最終,我選擇了微軟認知服務API(Cognitive Service API)。因為這是唯一一個提供定製面部識別功能的 API。
▲無人機的架構
入門
默認情況下,Parrot AR Drone2.0帶有可供客戶端連接的無線網路。這個功能對編程者來說非常麻煩。每次你希望嘗試什麼的時候,需要先斷開你的網路然後連上無人機的網路。幸運的是,有一個名叫 ardrone-wpa2的項目非常有用。它可以透過腳本讓無人機加入你自己的 WiFi 網路。
遠程登錄到無人機是件十分有趣的事。Parrot 執行在一個剝離版本的 Linux 上。你最近一次使用遠程登錄功能是什麼時候?連接了什麼東西?以下是打開終端並直接登錄無人機的示例。
用命令行模式飛行
安裝 node 庫以後,創建一個 node.js REPL(Read-Evaluate-Print-Loop)並用它引導無人機:
如果你一直跟著做到這步,那麼現在你的無人機肯定已經摔過至少幾次了。我上千次重新粘貼了安全殼,直到它徹底損壞,不得不買一個新的。我猶豫要不要提這個,實際上Parrot AR在不安裝安全殼的情況下飛得更好。但無人機在沒有安全殼的情況下更加危險,因為當無人機撞上什麼東西時,螺旋槳可能會折斷,而且會在家具上留下痕跡。
透過網頁控制飛行
為無人機構建基於 web 的操作界面並不困難,而且結果令人滿意(見下圖)。使用 Express.js 框架可以輕鬆的構建一個漂亮的 web 服務器。
我設置了一個按鈕來實現 AJAX 請求。
從無人機上獲得影片流
我發現使用無人機鏡頭髮送反饋的最佳方法是打開一個連接,並將我的網路服務器中的 PNG 連續發送到我的網站。我的網路服務器使用AR無人機庫從無人機鏡頭中連續拉取 PNG 圖片。
在無人機圖像上執行人臉識別
Azure 的面部 API 功能強大且易用。它可以識別你上傳的朋友照片,也可以猜測年齡和性別,我發現這兩個功能的準確率高得令人驚訝。延遲時間約為200毫秒,費用是1.5美元/1,000次。對我開發的這個程序來說,這是完全合理的。下面是關於如何發送一個圖像並進行面部識別的程式碼。
我使用 ImageMagick 庫來註釋 PNG 圖片中的面孔。在這點上有很多可以擴展的方向,如使用情感 API 確定面部的情緒等。
執行語音識別控制無人機
語音識別部分最棘手的不是語音識別本身,而是以微軟的 Speech API 要求的格式將音訊流從網頁傳輸到本地服務器,最終程式碼的大部分是為了實現這個功能。一旦你能夠透過單通道採集到正確頻率的音訊,這個 API 就可以很好的工作,而且非常容易使用。它的價格是4美元/1000次請求,這對於業務愛好者的應用來說,基本上算是免費的。
RecordRTC 有一個很好的庫,這是客戶端網路音訊錄製的好起點。在客戶端上,我們可以添加程式碼來保存音訊文件:
我使用 FFmpeg 程序減少音訊採樣點,並將其合併為一個通道,上傳到微軟:
自主搜尋路徑
我用 ardrone-autonomy 庫為我的無人機繪製自動尋徑地圖。在無人機無數次墜落在客廳的家具和植物上後,我妻子好心的建議我把我的項目搬到車庫裡去。那裡沒有太多可破壞的東西了,但也沒有太多的空間(見下圖)。
▲在我的「實驗室」裡試飛無人機
如果我能獲得更大的實驗空間,我會繼續研究智慧搜尋算法。但現在我只需要讓我的無人機能夠起飛、旋轉,去尋找我的朋友和敵人:
小結
一旦建立好一切,你可以透過 API 控制無人機影片源,無人機編程就變得非常有趣。伴隨著新的圖像識別技術,給我們提供了各種應用的可能,無論從觀察地面植物到在牆壁上作畫。Parrot 無人機不是為在室內小空間飛行設計的,一個價格更高的無人機能讓整個應用變成現實。最終,無人機會變得更加穩定,現實世界中將出現大量類似的應用。
微軟的認知服務云 API 易於使用而且價格便宜。首先,我擔心無人機的異常廣角鏡頭會影響面部識別,而無人機螺旋槳的噪音會干擾語音識別。但總體來說,表現要好於預期。延遲問題也不像我所擔心的那樣。使用云計算處理即時圖像流看起來似乎是個奇怪的架構,但它可能是許多應用的未來之路。
- 本文授權轉載自:36kr(36氪)
請注意!留言要自負法律責任,相關案例層出不窮,請慎重發文!