Author Archives: Yunfei

「机器说」- 机器人领域一周关键词 (170817)

# 智能语音音箱之争

最近几周“智能音箱”这个概念被炒得很火,各个公司都陆续推出/或宣布将要推出自己的智能音箱产品。本周的机器说就和大家聊聊我对智能音箱的看法。

使智能音箱成为现阶段焦点的起源,是亚马逊Amazon在2015年6月推出的Echo智能音箱。这款音箱在传统的无线音箱基础上,增加了语音交互的功能。借助内置的Alexa语音识别系统,Echo可以实现语音购物、定时提醒、音乐播放,以及通过第三方app与其他硬件设备对接等功能。


▲ 图. 亚马逊Echo音箱

亚马逊的Echo推出之后,又推出了一款名为Amazon Dot的小型设备(实际就是Echo去除了发声单元,保留360度全向麦克风)。谷歌也在去年11月宣布了自己的智能音箱产品:Google Home Smart Speaker. 这款设备是继Google Chromecast, Chromecast Audio和Pixel手机之后的又一个硬件产品。不得不说,谷歌的产品从设计感和美学的角度上就完爆了Amazon.


▲ 图. Google Home Smart Spearker

至此之后,今年6月在苹果的WWDC 2017发布大会上,苹果竟然也推出了自己的智能音箱产品:Apple HomePod. 与其他两家竞争对手主推“智能”不同,Apple打的一手苹果的情怀:HomePod是iPod的扩展和延续,是未来家庭中的新音乐中心。这就决定了Apple HomePod会更注重音质。苹果也是很早就在布局智能家居战略,其“HomeKit”系统正在扩大完善。有消息称,苹果将简化硬件验证环节,让更多的厂家可以加入到其智能家居的阵营。


▲ 图. Apple的HomePod


▲ 图. 官方的HomePod结构图

这样看来,各个公司卖音箱只是第一步,实际都是要和自己的虚拟/实体业务进行捆绑,扩大自己系统的影响力。从亚马逊来看,Echo是一个好的验证Alexa的平台。目前Alexa的用户数远比不上Google Assistant和Siri,所以亚马逊也希望通过这款产品,提高在智能硬件上的竞争力,与自己完全的虚拟经济实行对接。而谷歌则一直善于研发智能硬件设备,也有着把科技带入寻常家的愿景。至于苹果,自然不想在这场竞争中失利,何况自己的Siri和在AI领域的积累也不少。苹果也需要摆脱自己全靠系统集成的形象。

智能音箱实际上是之前智能家居浪潮的新一波,得益于基于深度学习的语音识别技术。未来以AI作为中控的智能家居系统,可能不仅仅是科幻电影里面的憧憬了。也许未来的中控系统不是智能音箱,也许每一个设备都可以作为控制的入口。未来生活的形式或许现在还很难想象的到。

附. 国内同类型产品

  • 京东:叮咚
  • 阿里:天猫精灵 x1
  • 百度:度秘(Duer)
  • 腾讯:智能音箱“耳朵”

「机器说」by 云飞机器人实验室

关注机器人技术的最新发展,三分钟为你解读每周机器人领域的核心关键词。每周一篇,在我的微博、知乎专栏和云飞机器人实验室网站同步更新。

更多机器人和嵌入式系统的技术文章可访问云飞机器人实验室


 

「机器说」- 机器人领域一周关键词 (170531)

# Alpha GO 2.0

上周最大的看点就是Alpha GO与柯杰的巅峰对战了。在经过一年的迭代之后,Alpha Go 2.0终于登上神坛,最终以三局全胜拿下了比赛。根据之前几个月Alpha GO在平台上对决的不败表现来看,柯杰本来就胜望不大,这次比赛的结果也就在预料之中了。然而这次Alpha GO的胜利却有标志性的意义:那就是人工智能已经可以挑战人类认为的“高级”活动了。随着这场胜利到来的是新的一波“人工智能威胁论”:如果机器不仅可以完成普通的体力劳动,还可以完成脑力甚至是创造力的活动,那么很多工作都会被机器人取代。每一次生产工具的革新都将带来社会分工的变革:从工业革命的历史中看,具有人工智慧的机器人势必会蚕食大量原本属于工人的工作;然而社会的进步就是以这种牺牲为代价的,通过工具改良提高的社会总体产值,会反过来影响这些因为新技术失业的人,迫使他们转向新的行业。我们不能还和18世纪一样,因为工具威胁到了自己的工作,就加入了反对的阵营。我们不能忽略这种革新是良性的。当然,想要机器与人和谐相处,我们需要对它们有足够多的认知和控制。但正如凯文凯利说的一样:我们为了达成目标所赋予机器的自由,最终会让我们失去对它们的控制,这是必然的、也是需要我们接受的。

# DJI Spark

“晓” (DJI Spark) 是大疆继Phantom和Mavic之后的新一代无人机。本次大疆瞄准了小型、自拍无人机市场,独特的人脸识别开机起飞与手势识别操控,彻底让Spark摆脱遥控器控制。“晓”的最终售价应该是在3000元左右,是Mavic的一半。当时Mavic出来的时候就心动的想买一个,这次Spark的定价总算是在一般用户的承受范围之内了。然而我还是对这款无人机的定位表示怀疑:

  • 体积上的缩小势必降低了整体性能(最高航速、续航时间、成像清晰度4K降到了1080P,抗风性也会下降);
  • 和Mavic相比,Spark的价格虽然亲民,但是功能上越来越接近“玩具”级别。普通人可能不愿意花这个价格买一个不上不下的产品,可能更愿意买各方面都比较成熟的Mavic,尤其是便携性上Spark也没有太大优势。加上现在越发收紧的无人机管制,可能真正的用户需求量不会很大。

无论如何,这是大疆从专业级向业余级过渡的产品,也让大疆产品线的层次越发分明。

(信息来源 – 机器人Robotics China)

# FCIS

FCIS (Fully Convolutional Instance-aware Semantic Segmentation) 是在COCO-16上获奖的图像分割算法,该算法可以识别、标记图像中的物体种类,从而进行精细的图像分割:

该项目最近在Github上开源了,项目地址在:https://github.com/msracver/FCIS. 我并不太了解图像分割技术,所以没有去了解具体的技术细节,有需要的读者请自行解读。

# Deep Voice 2.0

百度研究院近日发布了一款基于神经网络构建的文本-语音转化 (Text-to-Speech) 系统Deep Voice 2.0,这是今年二月份发布的Deep Voice的第二版。但当时的系统只能转化20小时语音,而且只有一种声音。不到三个月的时间,这个系统得到大幅升级,能够生成数百个小时的语音,拥有数百种声音。我去Baidu Research的相关网页体验了一下,生成的合成语音真假难辨:http://research.baidu.com/deep-voice-2-multi-speaker-neural-text-speech/. 这项技术配合已经比较成熟的Voice Recognition,就可以完成语音信息的输入-输出闭环了。然而相比主流的语音生成模型技术,通过神经网络生成似乎缺乏灵活性,这个技术百度要如何完善和应用也还不明朗。

(信息来源 – 新智元)


「机器说」by 云飞机器人实验室:关注机器人技术的最新发展,三分钟为你解读每周机器人领域的核心关键词。每周一篇,在我的微博、知乎专栏和云飞机器人实验室网站同步更新。


 

「机器说」- 机器人领域一周关键词 (170521)

# Google I/O大会

5月17日,谷歌在山景城举办了本年度的谷歌I/O开发者大会。本次大会上谷歌重申了自己AI first的战略,不断将最新的机器学习技术应用到语音识别和图像处理产品中。此外,谷歌宣布了下一代的TPU,Cloud TPU,其实是将多块TPU集成组合到一个TPU版图上:

这种任意组合的方式可以让谷歌根据应用需求更自由的选择配置,为自己的ML服务提供原动力。谷歌提到自己也将提供TPU云租赁服务。

谷歌将人工智能方面的工作综合到Google.ai之下,并提出AutoML的方法 – 用神经网络(一个基于RNN的控制器)来设计神经网络的结构。 这种方法我理解的就是通过实验-反馈的方法来获得最优架构的过程。

最后,谷歌发布了用于移动端的机器学习库 – TensorFlowLite,希望助力移动端语音识别、视觉搜索和增强现实的发展。

谷歌在ML和AI上一直独领群雄,而且一直是做让大众和用户受益的产品。这次I/O大会提到的将Google Assitant广泛应用到硬件产品中,也是我十分看好的应用。虽然亚马逊现在先行一步,已经将Alexa做在Echo上。但是谷歌凭借其在语音识别和硬件上的经验,应该很容易就可以后来居上。

(信息来源 – 机器之心)

# Google Lens

Google Lens是在本次谷歌I/O大会上发布的一款图像识别和理解软件。发布会上demo了这款软件实现拍照识花、拍WiFi密码自动连接路由、通过店面照片调取评价等功能。

之所以单独说这个软件,是因为我个人觉得这个会是划时代的killer级应用。目前谷歌积累了大量图像识别和图像语义理解的技术,和Google Assistant的语音技术结合后,实际上就解决了机器人的一个大问题 – 自然语言交互接口。通过看和听两种感官,实现对命令和意图的理解。虽然这个demo展示的功能很少,但是如果这个idea实现,那么机器可以将“视听 – 理解 – 行动”这个链条中最重要的“理解”给填补上。我们离真正的通用人工智能也就不远了。至少,可以通过视觉的额外输入,来和语音形成互补或加强。比如拍一张照片后问:“这个狗的品种是什么?”未来可应用的空间其实非常大。

(信息来源 – Techcrunch)

# 激光雷达之争

近日Waymo指控Uber盗用激光雷达专利的官司有了新进展。涉事前Waymo员工被停工,相关窃取机密文件也被要求归还Waymo. 这起案件被看作自动驾驶专利案的开端。激光雷达在整个自动驾驶层面的地位毋庸置疑,也是各大公司在实现自动驾驶道路上的兵家必争之地。相比国外公司,中国公司在自动驾驶专利上的布局还不足。等到技术差异化越来越小时,势必需要依赖核心专利来增强自己的竞争力,国内的自动驾驶公司现在要慢慢在技术专利上积攒优势。

(信息来源 – 车云)

关注「机器说」by 云飞机器人实验室:关注机器人技术的实际发展,三分钟看完每周机器人领域的核心关键词。每周一篇,微博、知乎专栏、博客同步更新。

使用Markdown进行写作和文字记录

1. 背景

Markdown是一种语法简洁的标记语言 (Markup Language)。Markdown可以使用任何一种纯文本编辑器进行编辑,同时可以渲染、生成HTML。Markdown虽然是标记语言,但是和HTML比起来具有更好的可读性。与富文本(Rich Format Text, RTF)格式相比,Markdown的纯文本特性让使用者可以更加关注内容,专注于文字的表达。我多年前在友人的推荐下开始尝试用Markdown写作。我一开始并不习惯这种所写和所得分离的方式,但是之后也慢慢习惯、喜欢上了这种内容与格式分离的文字编辑方式。此文我整理了我关于Markdown的认识(本文也是通过Makrdown书写的),同时我推荐大家开始尝试用Markdown生产笔记、日记、文档、博客等文字信息。

2. 使用Markdown的好处

先说一下Markdown语言的优势:

  • 记录速度快:比起其他文字格式,Markdown可以更快地记录信息,编辑过程只需要键盘参与。基本的文字格式 (如标题,粗体,斜体等)可以通过快捷键实现,利用序号、列表功能还可以快速生成层次化的段落结构。
  • Markdown是纯文本格式,可以用普通文本编辑器编辑(nano, VIM, Notepad++等),方便修改和共享。
  • 可移植性好。工具是不断变迁的,对于富文本工具而言,更换工具就意味着文字格式无法完美保留(当初从写字板到word);而对于Markdown而言,因为源文件本身并没有格式编码,所以更换工具几乎不会影响版式。不同工具的渲染结果也几乎没有差别。
  • 重内容,轻版式。很多时候我们会浪费很多精力在文字的排版和格式统一上,而Markdown简单清晰的编辑方式,让我们可以集中于内容的编辑。
  • 可以生成HTML。Markdown在设计时就完全兼容HTML,可以直接插入HTML代码(但是不推荐,会影响纯文本的优点)。Markdown配合不同的CSS可以渲染成不同风格的网页,Markdown还可以导出为pdf。除此之外还可以渲染成多种格式(大多数编辑器有导出功能,或者用Pandoc转换)。
  • 图文分离,备份或者传播时简单、信息的体积小。

3. 使用Markdown的坏处

然而Markdown也并非完美:

  • 所见非所得。编辑器和Live Preview是独立的系统,如果需要实时预览,则需要编辑工具的支持。
  • 插图不方便。在富文本系统中可以直接copy + paste,而一般的Markdown系统则需要单独的文件夹存储图片,还需要额外输入图片路径。
  • 文字的表示形式有限。相比富文本,Markdown无法随心所欲地修改文字的属性(字体、颜色、大小等)。如果需要特殊的文字格式,需要插入额外的html属性,但是这些会破坏纯文本的移植性。
  • 页面版式、布局相对固定。总体来说只能是线性的记录方式。如果需要自由的图文混排,其他工具如Word或者Onenote是更好的平台。

Read more »

如何构建和管理自己的知识系统

1. 背景

三年前,我在做硕士毕业设计的时候第一次使用Evernote(印象笔记)收集资料,之后就一直使用Evernote记录一些备忘和生活琐事,但也没有形成相对完整的系统。开始读博士之后,我习惯随手在论文上记批注和笔记,觉得这样个人观点和原文的耦合度会比较高。但是等到要检索和引用资料时,脑中对这些知识点有些印象,可很多资料就是找不到出处,这时又要重新谷歌或者去翻文件夹。这让我思考是否需要将笔记做成电子形式,这样检索和使用的时候会比较方便,知识也能线性积累。去纸化的过程是比较痛苦的,因为我们从小到大习惯了纸质笔记这种记录方式。我们的工具十分简单(纸和笔),却可以记录各种类别的信息(文字、结构图、流程图、批注)。然而到了电子时代,我们可用的工具很多,但却很难形成和纸质笔记相比的“灵活性”。当然,相比传统的笔记方式,电子笔记可以多次修改、任意排序和整理、发布和分享、互相引用与检索,但有的时候却不如传统笔记那么“直观”和“简单”(想想用pdf做标注 v.s. 在书上直接做批注 或是 用画图软件画一个流程图 v.s. 在纸上随手画一个流程图)。在过去的一年时间里,我一直在思考和实践电子化笔记系统的可行性,以及如何凸显和最大程度发挥电子笔记的优势。而我发现,电子笔记不仅有上述提到的几个优势,还可以成为构建和强化知识系统的有力工具。

这里,我将一切广义上可以提高人对某一事物或领域的认知或记忆的信息(以文字为主)称为知识,而将通过计算机、平板、手机等手段记录个性化知识的方式称为电子笔记。此文分享了我对于知识和记笔记的理解,以及通过电子化工具构建知识系统的思考和经验。

2. 为什么需要记笔记?

上一节聊了我为什么需要将笔记电子化的动机,现在简单说一下我们为什么需要记笔记。每个人都有这样的经历:和别人聊天时,总是有一些感觉在嘴边的东西,大脑却无法回忆起来;或者某天去超市购物时,明明觉得需要买什么,却怎么也想不起来。不管我们认不认同,人脑的潜力不是无限的。理解我们自身局限性的其中之一,就是认识到人脑是有局限性的,并且记忆的容量是有限的。所以构建一个笔记/知识信息系统,就是要补偿人脑的这种局限性,将笔记系统作为我们的第二大脑。这个观点已经得到了主流大众的认可。我们知道记笔记需要花费时间,这种时间实际上是一种对未来的投资。我们一般记录事情的动机有两个:一是为了增强对摄取信息的认知;二是为了日后需要的时候可以回想起来。大部分人也应该可以认同记笔记是强化知识的重要手段。除此之外,记笔记的核心价值是“使用”。也就是说,一个好的笔记应该是有使用价值的。一个shopping list可以让你在逛超市的时候买齐所有的东西;一篇日记让你可以回忆过去自己经历的事情;一篇论文笔记让人在需要的时候可以快速回忆起论文的核心观点;一个programming reference可以让你在编程的时候快速想起API的用法,而不用每次都去Google. 这些都是使用价值,是你记录时投资时间换来的回报。记录信息的本质是提供使用价值,所以评价一个笔记系统也应该用”可使用性”为评价方式。有一种观点是:现在(几乎)所有的信息都能在因特网上搜索到,所以需要信息的时候都可以即刻去搜索。这种观点本身没有问题,但是以目前的搜索技术和因特网的归档程度而言,这种方式的时间开销更高:因为你要从海量信息中筛选、判断、提炼出你想要的那一部分信息。而笔记则是“一次记录,多次使用”,一劳永逸。并且有新的知识点时,可以修改、完善之前的知识(另一点电子笔记的优势就是修改起来十分简单)。我们记笔记,就是让笔记成为知识的载体,也是为了日后需要这个知识时提供便捷。

Read more »

【C语言深入】陷阱:数组溢出导致内存被意外修改

C语言的指针在提供编程便利的同时,却带来了很多潜在的内存安全问题。见以下例子:

#include <stdio.h>

int main() {

	char string_buff[12];
	unsigned int i_not_zero = 0xFF;

	sprintf(string_buff, "Hello,world!");

	printf("i = %x\r\n", i_not_zero);

	return 0;
}

该程序(不正确)的输出为:

i = 0

上述代码使用sprintf修改了string_buff指针所指向的char型数组。但是由于在申明数组长度的时候,没有考虑到字符串结束符’\0’,所以实际写入时不慎篡改了下一位内存地址的内容(此例中为i_not_zero, 使用MinGW gcc)。在实际程序中,此类bug一般很难被发现,尤其是还有其他程序在正常修改该值时,一般先会去排查和该变量有关的程序。

这只是一个因为不慎所导致的内存溢出问题,而在一些极端的黑客代码中,经常会见到通过内存变量和函数的指针地址反向访问、修改堆栈,从而获得系统的权限。可见指针作为C语言的一个重要(但是晦涩的)组成部分,无形中降低了系统的可靠性和安全性,需要挑战programmer的debug能力。

你好,2017!

又是新的一年。岁月匆匆,不给人时间回头看看,就又让人上路了。

今年更新了10篇左右的博文:

  • 新增的”C语言深度”专题来源于我在嵌入式课程助教过程中发现的C语言的错误使用。我觉得C和C++是机器人领域最重要的两个语言,所以希望在这方面增加一些内容。
  • 另几篇博文是介绍新发布的树莓派3代的。今年除了树莓派3,还入手了若干树莓派Zero。因为Zero很难买到,所以一下屯了5、6个。这批Zero准备用在智能家庭的节点中,但是应用场景目前还不明确,所以没有给大家做专题介绍。

明年的工作计划:

  • 承诺的智能家庭系统还没有完全开发完成,全部完成后会找时间公布。目前已完成的部分:中心服务器的部署,NAS,多媒体中心,一个传感器节点部署好了(已经上报了半年的温湿度数据)。二氧化碳、PM2.5传感器和无线组网模块选购好了,但还没有时间调试。另一个困难是控制数据的下发和传感器数据、系统参数的展现,我想基于BS架构(Flask + socket.io / Node.js + Ajax)。我没有网页编程的基础,而且中间涉及Real-time和asynchronous的问题,所以还没有时间解决。
  • More topics on Robotics. 实验室还是以机器人为主题的,去年有点跑偏了(嵌入式系统),今年重新回归到主题上。重点我想要关注的内容点有:增强学习、概率决策、机器视觉、ROS、机器(深度)学习。
  • 博主现在长期在国外生活,关于将网站转换为全英文的想法已有很久。但是还是一直很挣扎,考虑到很多内容对国内的读者会有帮助,所以今年还是保留双语写作。

最后祝大家2017年工作、学习顺利!

【C语言深入】陷阱:数组指针作为函数参数返回

再来看一个指针问题,同样的来自一个本科生的代码。这段代码想要实现将一个全是小写字母的字符串转换成对应的大写字母字符串:

char *covert_to_upper_case(char *string) {
    char p[100];
    int i = 0;
    
    for(; i < strlen(string); i++ ) {
            p[i] = string[i] - ('a' - 'A'); 
    }
    p[i] = '\0';
    
    return p;
    
}

然而这段代码没有能实现期望的功能。原因如下:

  1. 主程序调用convert_to_upper_case()函数后,堆栈为p分配了内存空间;
  2. 函数体正确修改了p对应字符数组的内容,并将p的首地址作为指针返回;
  3. 函数返回后,所有临时变量从堆栈中弹出,包括p[100];
  4. 主程序得到返回的指针,对其进行解析。然而指针指向的字符数组此时已经从堆栈中弹出,解析后的数据无法被定义。

要想正确实现对应的功能,应该将目标指针作为额外参数传递给该函数,并由上层调用者提供内存空间的创建。当然也可以使用malloc()将内存分配在堆中,但是需要注意使用对应的free()释放空间,否则会有内存泄露的问题。