當前位置:
首頁 > 科技 > 200美元「造」出一台可由語音控制外加能進行人臉識別的自主飛行無人機

200美元「造」出一台可由語音控制外加能進行人臉識別的自主飛行無人機

繼「如何用100美元和TensorFlow來造一個能『看』東西的機器人」 之後,Lukas又一最新力作。


結合深度學習和便宜硬體的更多探奇。


在「造」出能進行物體識別的機器人後,下一步就很清晰了,我要「造」一個能飛的東西!我決定搞一個能自主飛行的無人機,並要它能識別人臉和響應語音指令。

選擇一台成品無人機


開始「黑入」一台無人機的最難的部分就是如何開始。我最初的選擇是用零件組裝一台無人機。但和我完成的大部分的DIY項目一樣,從零開始一般都耗費了太多的時間,還不如直接買一個成品。實話實說,我自己組裝的無人機從來沒有正常的飛行過。而買一台成品機就既省事又省錢。


絕大部分無人機廠商都宣稱提供API介面,但對於業餘玩家來說就沒有一個明確的最佳選擇。大部分能提供貌似可用的API介面的無人機都要超過1000美元。這對於入門級的玩家來說就太貴了。


但經過搜索,我發現Parrot AR 無人機2.0版(見圖1)是一個低端可「黑」入無人機的極佳選擇。新的售價是200美元,不過很多人在買了以後就不怎麼再玩了,所以在eBay上花130美元或更少就能買到一個不錯的二手貨。

200美元「造」出一台可由語音控制外加能進行人臉識別的自主飛行無人機



圖1:我車庫裡的無人機收藏。最左邊的就是Parrot AR無人機。圖片由Lukas Biewald授權使用


論飛行穩定性,Parrot AR型不如更貴的Parrot Bebop 2型(550美元)。但是Parrot AR型所帶的叫node-ar-drone的node.js客戶端庫是非常好用的。


Parrot AR型的另外一個優點是它非常皮實、耐摔。在測試自主飛行代碼的時候,我的無人機頻繁地撞到牆、傢具、植物甚至是我們家的客人,並墜落。但它還是依舊能正常飛行。

比起「造」能在地上跑的機器人,「造」無人機最不爽的一點就是它的電池可用時間太短了。基本上是充電幾小時,飛行十幾分鐘。所以我建議多買兩塊電池,循環充電使用。


給我的無人機開發程序


我經過實踐發現,Javascript內在的事件驅動的特性使得它成為一種非常好的控制無人機的語言。請相信我,無人機飛行的時候,是有非常多的非同步事件發生。我寫Node.JS的時間並不長,但在這個項目過程中,我對它的印象非常深刻。上一次我正兒八經地為機器人寫程序用的是C語言。處理C語言的線程和異常是一件非常讓人頭疼的事,所以我盡量避免再使用它。我希望有人能為其他的機器人平台開發出JavaScript的介面,因為這會讓為機器人開發程序(完全無法預知會發生什麼事)變得更簡單更有趣。


架構設計


我決定在我的筆記本上運行控制邏輯,同時在雲端運行機器學習的部分。這種架構設計比在樹莓派板上直接運行神經網路的延遲要低。我認為這種架構對於業餘無人機項目而言是合適的。

微軟、谷歌、IBM和亞馬遜都提供快速且便宜的機器學習API。最終我選擇了微軟的認知服務API來完成這個項目,因為它是唯一提供定製化的人臉識別功能的API。


圖2里展示了整個無人機項目的系統架構。

200美元「造」出一台可由語音控制外加能進行人臉識別的自主飛行無人機


圖2:智能無人機的系統架構。圖片由Lukas Biewald授權使用開始動手


默認地,Parrot AR無人機2.0版自己可以提供一個無線網路,供客戶端接入,但是這個功能卻極度煩人。每次你要實驗點東西,你都需要從本地網路斷開,再連到無人機的無線網裡。好消息是,有一個叫ardrone-wpa2的項目,非常有用,用它你可以「黑」進無人機,並讓無人機連到你自己的無線網路里。


Telnet到無人機操作系統上並遊盪一番是挺有趣的。Parrot無人機使用的是一個簡化版的Linux操作系統。你上次Telnet到某個系統上是什麼時間哪?下面的命令例子就演示了如何打開一個終端並直接登錄到無人機的操作系統上。


% script/connect 「The Optics Lab」 -p 「particleorwave」 -a 192.168.0.1 -d 192.168.7.43


% telnet 192.168.7.43


通過命令行來控制飛行


在安裝了node庫之後,下一步就是生成一個node.js的命令行運行環境,然後就可以開始控制你的無人機了:


var arDrone = require(『ar-drone』);


var client = arDrone.createClient();


client.createRepl();


drone> takeoff()


true


drone> client.animate(『yawDance, 1.0)


如果你按照我上面所說的一步一步地實驗到這裡,你的無人機肯定已經墜落過了——至少好幾次。我已經無數次地把我的無人機的保護外殼給它粘回機身上,直到它徹底解體,隨後我只好再買了一個新的。我不得不說,其實Parrot AR型在沒有保護外殼的時候飛行得更好。但這種方式會使無人機變得很危險。因為沒有保護外殼的話,一旦無人機撞到東西,它的螺旋槳就會直接打到物體上,並留下刮痕。


從網頁上控制無人機飛行


為無人機開發一個基於網頁的控制頁面挺簡單且效果不錯。用如下所示的express.js框架就可以搭建一個很小巧的網頁伺服器。


var express = require(『express』);


app.get(『/』, function (req, res) {


res.sendFile(path.join(__dirname + 『/index.html』));


});


app.get(『/land』, function(req, res) {


client.land();


});


app.get(『/takeoff』, function(req, res) {


client.takeoff();


});


app.listen(3000, function () {


});


我用下面的代碼來通過一個按鈕發送AJAX請求。


Takeoff


Land


從無人機上導出視頻流


我發現把無人機上的攝像頭拍攝的視頻導出的最佳方法就是:建立一個持續的連接,並把攝像頭拍攝的PNG圖片發送到我的網站的網頁上。通過使用AR無人機的庫(見下面的代碼),網頁伺服器不斷地把無人機攝像頭拍攝的PNG畫面拉取出來。


var pngStream = client.getPngStream();


pngStream


.on(『error』, console.log)


.on(『data』, function(pngBuffer) {


sendPng(pngBuffer);


}


function sendPng(buffer) {


res.write(『–daboundary
Content-Type: image/png
Content-length: 『 + buff


er.length + 『

』);


res.write(buffer);


});


對從無人機獲取的圖像進行人臉識別


微軟的Azure Face API系統很容易上手,且功能強大。你上傳你朋友的照片給它,這個系統就能識別出他們是誰。它也能猜測人物的年齡和性別。我發現這兩個功能的識別準確率是驚人的高。整個識別的延遲大概是200毫秒。識別1000次請求花費1.5美元。對我而言,這個價格對於這種應用是相當合理的。下面是我的代碼,它實現了發送圖片給API來做人臉識別的功能。


var oxford = require(『project-oxford』),


oxc = new oxford.Client(CLIENT_KEY);


loadFaces = function() {


chris_url = 「https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAALyAAAAJGMyNmIzNWM0LTA5MTYtNDU4Mi05YjExLTgyMzVlMTZjYjEwYw.jpg」;


lukas_url = 「https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/3/000/058/147/34969d0.jpg」;


}


path: 『camera.png』,


analyzesAge: true,


analyzesGender: true


}).then(function (response) {


if (response.length > 0) {


drawFaces(response, filename)


}


});


我用了ImageMagick庫來對我收集的PNG圖片做打標籤,效果相當好。對於這個部分其實可以有很多的擴展可能。比如用一個情感API來識別人臉所表現出來的情感。


運用語音來控制無人機


進行語音識別部分開發的難點並不是識別本身,而是如何把語音流從運行在我本地伺服器上的網頁里轉換成微軟Speech API可以使用格式。下面的代碼就是實現這個功能的。一旦你能把語音保存成單聲道和以正確的採樣頻率採樣後,這個語音識別API就能很方便地識別語音內容。這個API的花費是1000次請求4美元。對於業餘應用來說,基本相當於是免費了。


RecordRTC是一個很好的庫,可以用來作為以網頁為客戶端的語音採集的新手入門的工具。在客戶端,我就加入了保存語音文件的代碼。


app.post(『/audio』, function(req, res) {


var form = new formidable.IncomingForm();


// 設定允許客戶在一個請求里上傳多個文件


form.multiples = true;


form.uploadDir = path.join(__dirname, 『/uploads』);


form.on(『file』, function(field, file) {


filename = 「audio.wav」


fs.rename(file.path, path.join(form.uploadDir, filename));


});


// 記錄發生的錯誤日誌


form.on(『error』, function(err) {


console.log(『An error has occured:
』 + err);


});


// 一旦所有文件上傳完成,才給客戶端發相應


form.on(『end』, function() {


res.end(『success』);


});


// 解析出請求里包含的表單數據


form.parse(req)


speech.parseWav(『uploads/audio.wav』, function(text) {


console.log(text);


controlDrone(text);


});


});


我使用FFmpeg工具來降低音頻的採樣率,並把多聲道合并成單聲道,以供微軟API使用。


exports.parseWav = function(wavPath, callback) {


var cmd = 『ffmpeg -i 『 + wavPath + 『 -ar 8000 -ac 1 -y tmp.wav』;


exec(cmd, function(error, stdout, stderr) {


console.log(stderr); // command output is in stdout


});


postToOxford(callback);


});


儘管我開發的功能就是這些,但是還是可以繼續擴展。比如用微軟的文字變語音的API來讓無人機說話!


開發自主搜索路徑


我使用ardrone-autonomy庫來為無人機開發自主搜索路徑。在此過程中,我無數次地把無人機弄得撞到了客廳的傢具和植物上。最後,我妻子很「客氣」地建議我去車庫裡繼續我的項目,因為那裡沒多少可以撞的東西。但是車庫的地方有點小,使得操控空間有限。

200美元「造」出一台可由語音控制外加能進行人臉識別的自主飛行無人機



圖3:在我的「實驗室」里試飛無人機。圖片由Lukas Biewald授權使用


在我能有一個更大的實驗空間後,我會嘗試更智能的搜索演算法。不過,現在我還是只會讓無人機做起飛和旋轉的動作,以此來搜索發現人,並識別是敵還是友。


var autonomy = require(『ardrone-autonomy』);


var mission = autonomy.createMission();


console.log(「Here we go!」)


mission.takeoff()


.zero() // 把當前狀態作為參考基準


.altitude(1)


.taskSync(console.log(「Checkpoint 1」))


.go()


.taskSync(console.log(「Checkpoint 2」))


.hover(1000)


.go()


.taskSync(console.log(「Checkpoint 3」))


.hover(1000)


.go()


.taskSync(console.log(「Checkpoint 4」));


.hover(1000)


.go({x: 0, y: 0, z: 1, yaw: 0


.land()


全都搞定後的效果


看下面的視頻。我讓無人機起飛並去找我的朋友Chris:


結論




200美元「造」出一台可由語音控制外加能進行人臉識別的自主飛行無人機



在一切都配置妥當之後,就可以通過API來控制無人機,獲得拍攝到的視頻圖片,這一切都爽爆了!隨著新的圖像識別技術可供使用,可能的應用必將越來越多。比如,讓無人機根據房屋平面圖來刷牆。雖然Parrot無人機並不是設計來為在狹小空間(比如我的房子)里安全飛行的,但隨著無人機越來越皮實,價格變得更低,我相信真正有用的應用將會進入爆發期。


微軟的認知服務雲API是相當得好用且便宜。最初我比較擔心無人機所用的廣角攝像頭所拍攝的圖片會影響人臉識別的準確度,另外螺旋槳的雜訊可能會對語音識別產生干擾。但整體而言,這兩個API的表現遠超我的期望。同時處理延遲也低於我的預期。從架構設計角度來看,在雲端運行機器學習實時圖像處理似乎是一個奇怪的選擇,但它可能會成為未來很多應用的架構選擇。

200美元「造」出一台可由語音控制外加能進行人臉識別的自主飛行無人機



Lukas Biewald


Lukas Biewald是CrowdFlower的創始人兼CEO。CrowdFlower始於2009年,是一個數據增強的平台,可以幫助企業獲得隨需的人力來收集、產生訓練數據,以及參與人-機器學習循環的工作。 在從斯坦福大學拿到數學學士和計算機科學碩士學位後,Lukas領導了雅虎日本的搜索相關團隊。隨後他去了Powerset,作為一個資深數據科學家進行工作。2008年Powerset被微軟收購。Lukas還被《公司》雜誌評選為30位30歲以下的著名人士。 Lukas還是一位專家級的圍棋選手。


請您繼續閱讀更多來自 董老師在矽谷 的精彩文章:

移民火星 — SpaceX公司的方法和理由(1)

TAG:董老師在矽谷 |

您可能感興趣

斑馬線不讓行人200元3分,開車時我挺車主,步行時我支持行人
美國行人死亡人數創紀錄 電子設備普遍使用是增速迅猛「唯一主因」
AI發展出了自己的語言,人類無法理解不得不對其進行人工干預
令人恐懼:AI發展出了自己的語言,人類無法理解;不得不進行人工干預
修行人與「手機控」
倫敦貨車衝撞行人超過10人被撞 警方出動直升機
外行人受訓5天 就敢做微整形手術
我亦是行人
欠債70萬卻住的豪宅,等強制執行時,執行人員傻了!
銀行人員監守自盜,133萬元的現金不翼而飛
行人和無人駕駛的對抗
這個和尚不一樣,顛覆90%的修行人
寫給30歲的自己:人生如逆旅,我亦是行人
四維度打造律所品牌,「外行人」操刀,律所大變樣
自動駕駛汽車如何與行人進行溝通?福特想出這招進行測試
美國多機場試行人臉識別託運 優化乘機體驗
出行人工智慧公司「我愛出行」獲千萬天使投資!
銀行人眼裡的16幅世界名畫,錯過就太可惜了
開抓了!汽車不讓行人扣3分罰款200元,已經有115位車主被抓