本文作者是LukasBiewald—CrowdFlower的首创人,Lukas曾被《Inc.》杂志评比为30岁以下精良企业家。CrowdFlower创建于2009年,是一个按需劳动力的大数据平台,资助企业网络培训数据并举行人机交互呆板学习。
LukasBiewald毕业于斯坦福大学,得到数学学士学位和盘算机科学硕士学位。Lukas曾任职Yahoo日本搜刮团队主管,之后作为高级数据科学家就职于Powerset,该公司于2008年被微软收购。
深度学习和便宜硬件的探索
早期航空器,1818(泉源:维基百科美国国会数据库)
在制造了一个图像辨认呆板人后,显然下一步是制作一个可飞行的版本。于是我决定打造一款可以或许举行面部辨认并相应语音下令的主动化无人机。
▍选择一款预制无人机
对无人机举行编程,最难的部分是怎样开始,我是从组装无人机零件开始的。但是险些和之前全部DIY项目一样,本身组装无人机花了我很多的钱。而且坦白的说,我手工打造的无人机不停没有稳固飞行过。可以肯定的是,直接购买预制版本才是更加简单经济的选择。
大多数无人机制造商都声称提供API接口,但对于业余爱好者来说并没有什么显着的上风。市面上带好像可用的API接口的无人机,大多售价都高出1000美元,这是一个很高的进入门槛。
颠末一些观察以后,我发现了ParrotARDrone2.0(见下图)。我以为对于业余爱好者来说,这是一款抱负的呆板。它的代价不高,还可以举行编程。你可以选择花200美元买一台新呆板,但由于很多人买了无人机又从来不利用它们,因此购买一台二手呆板也是个不错的选择。在eBay上二手无人机的售价约莫是130美元乃至更低。
△我收藏的各类无人机,ParrotARDrone无人机挂在最左边
ParrotAR无人机飞行的稳固性没有更贵的新款ParrotBebop2.0好(售价约莫550美元),但是ParrotAR提供一个好用的node.js客户端库叫做node-ar-drone,很得当在上面举行开辟。
别的一个上风:ParrotAR无人机很坚固。在测试主动化程序的过程中,无论它被撞墙上、家具上、室内植物上和客人身上,他仍旧可以或许精良的飞行。
相比给地面呆板人编程,给无人机编程最糟的地方是电池续航时间短。一块电池必要充电几个小时,才华飞行约莫10分钟的时间。因此我发起多买两块备用电池,测试的时间可以循环利用。
▍给我的无人机编程
由于Java天生的驱动本领,因此黑白常抱负的无人机编程语言。信托我,无人机飞行中会碰到很多异步变乱。我固然没有在Node上耗费很多时间,但这个语言让我印象深刻。我近来一次认真的为呆板人编程利用的是C语言。用C语言处理惩罚线程和各种非常黑白常痛楚的,因此最好少用。我盼望有人为别的无人机平台创建Java开辟包,由于这个语言让我们处理惩罚不确定性的开辟变乱,变得简单风趣。
架构
我决定在条记本电脑上运行逻辑,在云端举行呆板学习。比起直接在树莓派硬件上运行神经网络,这种架构的耽误更低。我以为这种架构对如今的业余无人机开辟项目来说是可行的。
微软、谷歌、IBM和亚马逊都有快速、便宜的云端呆板学习API。终极,我选择了微软认知服务API(CognitiveServiceAPI)。由于这是唯逐一个提供定制面部辨认功能的API。
△无人机的架构
入门
默认环境下,ParrotARDrone2.0带有可供客户端毗连的无线网络。这个功能对编程者来说非常贫苦。每次你盼望实行什么的时间,必要先断开你的网络然后连上无人机的网络。荣幸的是,有一个名叫ardrone-wpa2的项目非常有效。它可以通过脚本让无人机参加你本身的WiFi网络。
长途登录到无人机是件非常风趣的事。Parrot运行在一个剥离版本的Linux上。你近来一次利用长途登录功能是什么时间?毗连了什么东西?以下是打开终端并直接登录无人机的示例。
%/connect"TheOpticsLab"-p"particleorwave"-a192.168.0.1-d192.168.7.43
%telnet192.168.7.43
用下令行模式飞行
安装node库以后,创建一个node.jsREPL(Read-Evaluate-Print-Loop)并用它引导无人机:
vararDrone=require('ar-drone');
varclient=arDrone.createClient({ip:'192.168.7.43'});
client.createRepl();
dronetakeoff()
true
droneclient.animate(‘yawDance,1.0)
假如你不停跟着做到这步,那么如今你的无人机肯定已经摔过至少反复了。我上千次重新粘贴了安全壳,直到它彻底破坏,不得不买一个新的。我夷由要不要提这个,实际上ParrotAR在不安装安全壳的环境下飞得更好。但无人机在没有安全壳的环境下更加伤害,由于当无人机撞上什么东西时,螺旋桨大概会折断,而且会在家具上留下陈迹。
通过网页控制飞行
为无人机构建基于web的操纵界面并不困难,而且结果令人满意(见下图)。利用Express.js框架可以轻松的构建一个美丽的web服务器。
varexpress=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哀求。
html
language='java'
functioncall(name){
varxhr=new();
xhr.open('GET',name,true);
xhr.send();
}
/
body
aonclick="call('takeoff');"Takeoff/a
aonclick="call('land');"Land/a
/body
/html
从无人机上得到视频流
我发现利用无人机摄像头发送反馈的最佳方法是打开一个毗连,并将我的网络服务器中的PNG连续发送到我的网站。我的网络服务器利用AR无人机库从无人机摄像头中连续拉取PNG图片。
varpngStream=client.getPngStream();
pngStream
.on('error',console.log)
.on('data',function(pngBuffer){
sendPng(pngBuffer);
}
functionsendPng(buffer){
res.write('--daboundary\nContent-Type:image/png\nContent-length:'+buff
er.length+'\n\n');
res.write(buffer);
});
在无人机图像上运行人脸辨认
Azure的面部API功能强大且易用。它可以辨认你上传的朋侪照片,也可以推测年龄和性别,我发现这两个功能的正确率高得令人惊奇。耽误时间约为200毫秒,费用是1.5美元/1,000次。对我开辟的这个程序来说,这是完全公道的。下面是关于怎样发送一个图像并举行面部辨认的代码。
varoxford=require('project-oxford'),
oxc=newoxford.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.length0){
drawFaces(response,filename)
}
});
我利用ImageMagick库来解释PNG图片中的面貌。在这点上有很多可以扩展的方向,如利用感情API确定面部的感情等。
运行语音辨认控制无人机
语音辨认部分最棘手的不是语音辨认本身,而是以微软的SpeechAPI要求的格式将音频流从网页传输到本地服务器,终极代码的大部分是为了实现这个功能。一旦你可以或许通过单通道收罗到精确频率的音频,这个API就可以很好的工作,而且非常轻易利用。它的代价是4美元/1000次哀求,这对于业务爱好者的应用来说,根本上算是免费的。
RecordRTC有一个很好的库,这是客户端网络音频录制的好出发点。在客户端上,我们可以添加代码来生存音频文件:
app.post('/audio',function(req,res){
varform=newformidable.IncomingForm();
//specifythatwewanttoallowtheusertouploadmultiplefilesinasinglerequest
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));
});
//loganyerrorsthatoccur
form.on('error',function(err){
console.log('Anerrorhasoccured:\n'+err);
});
//onceallthefileshavebeenuploaded,sendaresponsetotheclient
form.on('end',function(){
res.end('success');
});
//parsetheincomingrequestcontainingtheformdata
form.parse(req)
speech.parseWav('uploads/audio.wav',function(text){
console.log(text);
controlDrone(text);
});
});
我利用FFmpeg程序镌汰音频采样点,并将其归并为一个通道,上传到微软:
exports.parseWav=function(wavPath,callback){
varcmd='ffmpeg-i'+wavPath+'-ar8000-ac1-ytmp.wav';
exec(cmd,function(error,stdout,stderr){
console.log(stderr);//commandoutputisinstdout
});
postToOxford(callback);
});
自主搜刮路径
我用ardrone-autonomy库为我的无人机绘制主动寻径舆图。在无人机无数次坠落在客堂的家具和植物上后,我老婆盛意的发起我把我的项目搬到车库里去。那边没有太多可粉碎的东西了,但也没有太多的空间(见下图)。
△在我的“实行室”里试飞无人机
假如我能得到更大的实行空间,我会继承研究智能搜刮算法。但如今我只必要让我的无人性能够腾飞、旋转,去探求我的朋侪和仇人:
varautonomy=require('ardrone-autonomy');
varmission=autonomy.createMission({ip:'10.0.1.3',frameRate:1,imageSize:'640:320'});
console.log("Herewego!")
mission.takeoff()
.zero()//Setsthecurrentstateasthereference
.altitude(1)
.taskSync(console.log("Checkpoint1"))
.go({x:0,y:0,z:1,yaw:90})
.taskSync(console.log("Checkpoint2"))
.hover(1000)
.go({x:0,y:0,z:1,yaw:180})
.taskSync(console.log("Checkpoint3"))
.hover(1000)
.go({x:0,y:0,z:1,yaw:270})
.taskSync(console.log("Checkpoint4"));
.hover(1000)
.go({x:0,y:0,z:1,yaw:0
.land()
把全部的东西放在一起
看看这个视频,我带着我的无人机腾飞去探求我的朋侪克里斯:
小结
一旦创建好统统,你可以通过API控制无人机视频源,无人机编程就变得非常风趣。陪伴着新的图像辨认技能,给我们提供了各种应用的大概,无论从观察地面植物到在墙壁上作画。Parrot无人机不是为在室内小空间飞行计划的,一个代价更高的无人性能让整个应用变成实际。终极,无人机遇变得更加稳固,实际天下中将出现大量雷同的应用。
微软的认知服务云API易于利用而且代价自制。起首,我担心无人机的非常广角摄像头会影响面部辨认,而无人机螺旋桨的噪音会干扰语音辨认。但总体来说,表现要好于预期。耽误题目也不像我所担心的那样。利用云盘算处理惩罚及时图像流看起来好像是个奇怪的架构,但它大概是很多应用的将来之路。
编译:媛媛
雇用志愿者
盼望你有稳固输出的时间,英文本领佳,从业者优先。
参加「AI从业者社群」请备注个人信息
添加小鸡微信liulailiuwang
我要评论