本文作者是Lukas Biewald—CrowdFlower的創(chuàng)始人,Lukas曾被《Inc.》雜志評選為30歲以下杰出企業(yè)家。CrowdFlower成立于2009年,是一個按需勞動力的大數(shù)據(jù)平臺,幫助企業(yè)收集培訓數(shù)據(jù)并進行人機交互機器學習。
Lukas Biewald畢業(yè)于斯坦福大學,獲得數(shù)學學士學位和計算機科學碩士學位。Lukas曾任職Yahoo日本搜索團隊主管,之后作為高級數(shù)據(jù)科學家就職于Powerset,該公司于2008年被微軟收購。
深度學習和廉價硬件的探索
早期航空器,1818(來源:維基百科&美國國會數(shù)據(jù)庫)
在制造了一個圖像識別機器人后,顯然下一步是制作一個可飛行的版本。于是我決定打造一款能夠進行面部識別并響應語音命令的自動化無人機。
▍選擇一款預制無人機
對無人機進行編程,最難的部分是如何開始,我是從組裝無人機零件開始的。但是幾乎和之前所有DIY項目一樣,自己組裝無人機花了我很多的錢。而且坦白的說,我手工打造的無人機一直沒有穩(wěn)定飛行過。可以肯定的是,直接購買預制版本才是更加簡單經(jīng)濟的選擇。
大多數(shù)無人機制造商都聲稱提供API接口,但對于業(yè)余愛好者來說并沒有什么明顯的優(yōu)勢。市面上帶似乎可用的API接口的無人機,大多售價都超過1000美元,這是一個很高的進入門檻。
經(jīng)過一些調查以后,我發(fā)現(xiàn)了Parrot AR Drone 2.0(見下圖)。我認為對于業(yè)余愛好者來說,這是一款理想的機器。它的價格不高,還可以進行編程。你可以選擇花200美元買一臺新機器,但由于很多人買了無人機又從來不使用它們,因此購買一臺二手機器也是個不錯的選擇。在eBay上二手無人機的售價大約是130美元甚至更低。
△我收藏的各類無人機,Parrot AR Drone無人機掛在最左邊
Parrot AR無人機飛行的穩(wěn)定性沒有更貴的新款 Parrot Bebop 2.0 好(售價大約550美元),但是Parrot AR提供一個好用的node.js客戶端庫叫做node-ar-drone,很適合在上面進行開發(fā)。
另外一個優(yōu)勢:Parrot AR無人機很結實。在測試自動化程序的過程中,無論它被撞墻上、家具上、室內植物上和客人身上,他仍然能夠良好的飛行。
相比給地面機器人編程,給無人機編程最糟的地方是電池續(xù)航時間短。一塊電池需要充電幾個小時,才能飛行大約10分鐘的時間。因此我建議多買兩塊備用電池,測試的時候可以循環(huán)使用。
▍給我的無人機編程
由于Java天生的驅動能力,因此是非常理想的無人機編程語言。相信我,無人機飛行中會遇到很多異步事件。我雖然沒有在Node上花費很多時間,但這個語言讓我印象深刻。我最近一次認真的為機器人編程使用的是C語言。用C語言處理線程和各種異常是十分痛苦的,因此最好少用。我希望有人為其它無人機平臺建立Java開發(fā)包,因為這個語言讓我們處理不確定性的開發(fā)事件,變得簡單有趣。
架構
我決定在筆記本電腦上運行邏輯,在云端進行機器學習。比起直接在樹莓派硬件上運行神經(jīng)網(wǎng)絡,這種架構的延遲更低。我認為這種架構對目前的業(yè)余無人機開發(fā)項目來說是可行的。
微軟、谷歌、IBM和亞馬遜都有快速、廉價的云端機器學習API。最終,我選擇了微軟認知服務API(Cognitive Service API)。因為這是唯一一個提供定制面部識別功能的API。
△無人機的架構
入門
默認情況下,Parrot AR Drone2.0帶有可供客戶端連接的無線網(wǎng)絡。這個功能對編程者來說非常麻煩。每次你希望嘗試什么的時候,需要先斷開你的網(wǎng)絡然后連上無人機的網(wǎng)絡。幸運的是,有一個名叫ardrone-wpa2的項目非常有用。它可以通過腳本讓無人機加入你自己的WiFi網(wǎng)絡。
遠程登錄到無人機是件十分有趣的事。Parrot運行在一個剝離版本的Linux上。你最近一次使用遠程登錄功能是什么時候?連接了什么東西?以下是打開終端并直接登錄無人機的示例。
% /connect "The Optics Lab" -p "particleorwave" -a 192.168.0.1 -d 192.168.7.43
% telnet 192.168.7.43
用命令行模式飛行
安裝node庫以后,創(chuàng)建一個node.js REPL(Read-Evaluate-Print-Loop)并用它引導無人機:
var arDrone = require('ar-drone');
var client = arDrone.createClient({ip: '192.168.7.43'});
client.createRepl();
drone> takeoff()
true
drone> client.animate(‘yawDance, 1.0)
如果你一直跟著做到這步,那么現(xiàn)在你的無人機肯定已經(jīng)摔過至少幾次了。我上千次重新粘貼了安全殼,直到它徹底損壞,不得不買一個新的。我猶豫要不要提這個,實際上Parrot AR在不安裝安全殼的情況下飛得更好。但無人機在沒有安全殼的情況下更加危險,因為當無人機撞上什么東西時,螺旋槳可能會折斷,而且會在家具上留下痕跡。
通過網(wǎng)頁控制飛行
為無人機構建基于web的操作界面并不困難,而且結果令人滿意(見下圖)。使用Express.js框架可以輕松的構建一個漂亮的web服務器。
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 () {
});
我設置了一個按鈕來實現(xiàn)AJAX請求。
<html>
< language='java'>
function call(name) {
var xhr = new ();
xhr.open('GET', name, true);
xhr.send();
}
</>
<body>
<a onclick="call('takeoff');">Takeoff</a>
<a onclick="call('land');">Land</a>
</body>
</html>
從無人機上獲得視頻流
我發(fā)現(xiàn)使用無人機攝像頭發(fā)送反饋的最佳方法是打開一個連接,并將我的網(wǎng)絡服務器中的PNG連續(xù)發(fā)送到我的網(wǎng)站。我的網(wǎng)絡服務器使用AR無人機庫從無人機攝像頭中連續(xù)拉取PNG圖片。
var pngStream = client.getPngStream();
pngStream
.on('error', console.log)
.on('data', function(pngBuffer) {
sendPng(pngBuffer);
}
function sendPng(buffer) {
res.write('--daboundary\nContent-Type: image/png\nContent-length: ' + buff
er.length + '\n\n');
res.write(buffer);
});
在無人機圖像上運行人臉識別
Azure的面部API功能強大且易用。它可以識別你上傳的朋友照片,也可以猜測年齡和性別,我發(fā)現(xiàn)這兩個功能的準確率高得令人驚訝。延遲時間約為200毫秒,費用是1.5美元/1,000次。對我開發(fā)的這個程序來說,這是完全合理的。下面是關于如何發(fā)送一個圖像并進行面部識別的代碼。
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";
oxc.face.faceList.create('myFaces');
oxc.face.faceList.addFace('myFaces', {url => chris_url, name=> 'Chris'});
oxc.face.faceList.addFace('myFaces', {url => lukas_url, name=> 'Lukas'});
}
oxc.face.detect({
path: 'camera.png',
analyzesAge: true,
analyzesGender: true
}).then(function (response) {
if (response.length > 0) {
drawFaces(response, filename)
}
});
我使用ImageMagick庫來注釋PNG圖片中的面孔。在這點上有很多可以擴展的方向,如使用情感API確定面部的情緒等。
運行語音識別控制無人機
語音識別部分最棘手的不是語音識別本身,而是以微軟的Speech API要求的格式將音頻流從網(wǎng)頁傳輸?shù)奖镜胤掌鳎罱K代碼的大部分是為了實現(xiàn)這個功能。一旦你能夠通過單通道采集到正確頻率的音頻,這個API就可以很好的工作,而且非常容易使用。它的價格是4美元/1000次請求,這對于業(yè)務愛好者的應用來說,基本上算是免費的。
RecordRTC有一個很好的庫,這是客戶端網(wǎng)絡音頻錄制的好起點。在客戶端上,我們可以添加代碼來保存音頻文件:
app.post('/audio', function(req, res) {
var form = new formidable.IncomingForm();
// specify that we want to allow the user to upload multiple files in a single request
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));
});
// log any errors that occur
form.on('error', function(err) {
console.log('An error has occured: \n' + err);
});
// once all the files have been uploaded, send a response to the client
form.on('end', function() {
res.end('success');
});
// parse the incoming request containing the form data
form.parse(req)
speech.parseWav('uploads/audio.wav', function(text) {
console.log(text);
controlDrone(text);
});
});
我使用FFmpeg程序減少音頻采樣點,并將其合并為一個通道,上傳到微軟:
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);
});
自主搜索路徑
我用ardrone-autonomy庫為我的無人機繪制自動尋徑地圖。在無人機無數(shù)次墜落在客廳的家具和植物上后,我妻子好心的建議我把我的項目搬到車庫里去。那里沒有太多可破壞的東西了,但也沒有太多的空間(見下圖)。
△在我的“實驗室”里試飛無人機
如果我能獲得更大的實驗空間,我會繼續(xù)研究智能搜索算法。但現(xiàn)在我只需要讓我的無人機能夠起飛、旋轉,去尋找我的朋友和敵人:
var autonomy = require('ardrone-autonomy');
var mission = autonomy.createMission({ip: '10.0.1.3', frameRate: 1, imageSize: '640:320'});
console.log("Here we go!")
mission.takeoff()
.zero() // Sets the current state as the reference
.altitude(1)
.taskSync(console.log("Checkpoint 1"))
.go({x: 0, y: 0, z: 1, yaw: 90})
.taskSync(console.log("Checkpoint 2"))
.hover(1000)
.go({x: 0, y: 0, z: 1, yaw: 180})
.taskSync(console.log("Checkpoint 3"))
.hover(1000)
.go({x: 0, y: 0, z: 1, yaw: 270})
.taskSync(console.log("Checkpoint 4"));
.hover(1000)
.go({x: 0, y: 0, z: 1, yaw: 0
.land()
把所有的東西放在一起
看看這個視頻,我?guī)е业臒o人機起飛去尋找我的朋友克里斯:
小結
一旦建立好一切,你可以通過API控制無人機視頻源,無人機編程就變得非常有趣。伴隨著新的圖像識別技術,給我們提供了各種應用的可能,無論從觀察地面植物到在墻壁上作畫。Parrot無人機不是為在室內小空間飛行設計的,一個價格更高的無人機能讓整個應用變成現(xiàn)實。最終,無人機會變得更加穩(wěn)定,現(xiàn)實世界中將出現(xiàn)大量類似的應用。
微軟的認知服務云API易于使用而且價格便宜。首先,我擔心無人機的異常廣角攝像頭會影響面部識別,而無人機螺旋槳的噪音會干擾語音識別。但總體來說,表現(xiàn)要好于預期。延遲問題也不像我所擔心的那樣。使用云計算處理實時圖像流看起來似乎是個奇怪的架構,但它可能是許多應用的未來之路。
編譯:媛媛
招聘 志愿者
希望你有穩(wěn)定輸出的時間,英文能力佳,從業(yè)者優(yōu)先。
加入「AI從業(yè)者社群」請備注個人信息
添加小雞微信 liulailiuwang
轉載請注明來自夕逆IT,本文標題:《【W(wǎng)inEdt怎么用】WinEdt好不好_使用技巧》

還沒有評論,來說兩句吧...