My travel through hackathons

我的黑客松之旅

Posted by Jianfei on September 22, 2016

夜深了,我坐在宿舍的电脑旁,疲倦的敲完今天的最后一行代码,准备关机上床睡觉。还处在大三的我对Opencv充满了兴趣,还在自己研究这个新奇又实用的库。突然,“叮——”一声,邮箱来了一封邮件,“中国最大的黑客马拉松——HackShanghai”黑客马拉松是什么,是黑客们的集会吗?我重新打开浏览器,决定探个明白。

“黑客马拉松概念源自美国,随着智能手机风行,黑客马拉松逐渐成为插件开发的主要形式:一群高手云集一堂,几十个小时里开发出一款插件,累了或坐或卧,现场休息,做完当场交作品,是世界上最酷的开发者狂欢。”百科上是这样解释的。在我看来,黑客松就是极客们的Party,在这里用短短的一两天进行头脑风暴,用自己的想法和技术改进生活甚至改变世界。看到这里,好奇心与兴趣充满了我的内心,我一扫倦意,想看看国外的hackathons上开发者和设计者们做出了什么样的杰作。

世界上最大的黑客松是宾夕法尼亚大学的PennApps,现场提供了一些最新的智能硬件,全美感兴趣、会编程的学生皆可以参加,他们三五个人组队,在几十个小时里完成了自己有关健康、科技、经济和游戏等想法的项目,有的用Web展现,有的做成App,还有的做出了可以应用的硬件。

面对这样有趣而又富有技术气息的别开生面的开发者集会,我迫不及待地写了application给HackShanghai,并成功的得到了参赛机会还有机票报销。就这样,我踏上了第一次黑客马拉松的旅途。

初出茅庐

HackShanghai 2014由上海纽约大学举办,迎接我们register的是来自五湖四海的留学生,而来参赛的二百五十名同学也遍布五个大洲的大学,会场每个队伍一张长桌,整个会场被各种知名抑或是创业IT企业包围,可以随时去了解它们的最新技术和企业文化,更可以免费使用到它们所提供的智能硬件或API接口。比赛时间是24个小时,代码要求被提交到Gitcafe赞助商的托管网站上,在demo展示后,会有10个组被选中进入上台评比的阶段,再从它们当中选出最后的前三名,奖励非常丰厚。

比赛现场!

在比赛开始前,主办方提供了组队的时间,你可以在众多参赛者中找到你想要的开发者,也可以作为懂某个技术的开发者加入其他队伍当中。我与来自上海交通大学的高策和周嘉俊组队,想共同利用主办方提供的手势体感设备Leap Motion开发一套云端文件管理系统。

基于手势识别的云端文件管理系统,顾名思义,就是模仿电影《钢铁侠》中Tony Stark酷炫的操作台,全凭手势即可完成各种工作。

我们先进行了分工,我负责使用Leap Motion的JS接口与Javascript的文件管理系统相融合对接,实现前端的手势化操作,他们两个负责后台服务器和demo展示的设计。在文件管理系统中实现了文件的上传下载、文本与图片的预览和网页分享等功能。经过24小时的奋战,我们成功完成了前端与后端的代码,欣喜地与周围的队伍开始交流。来自加拿大的一位外国小哥提建议说可以做成chrome插件或者sublime插件,在办公室中如果要分享文档、代码等资源时只需要用手轻轻一滑就可以了,就像打乒乓球一样。所以我们同样写了实现此功能的两个插件,心满意足地去参加demo展示了。

然而结果差强人意,我们并没有通过海选进入最后的前十名,我们走访了其他队伍,觉得我们的实现程度高,代码量大,创意也不差,为什么没有得到青睐呢?

原因在于,我们做的是系统,而黑客马拉松更看重的是别出心裁的创意和酷炫的展示,代码要通过精彩的展示秀出来,而我们冗长而繁琐的系统很难给人有趣的感觉从而落败。尽管如此,我们还是因为做得个人体验好而被一位记者看中,我们的作品因此登上了上海日报、腾讯新闻、搜狐科技等媒体网站和报纸。而这第一次参加比赛见识到了来自各地高手的创意和代码能力,认识了一群好朋友,并清醒地懂得了在短时间内做出一个可用、有趣又吸人眼球的产品有多么重要。

转战机器人马拉松

第二次黑客马拉松,是一场别开生面的机器人马拉松,全球知名的人型机器人公司ALDEBARAN来到中国举办的第一场黑客松,而机器人黑客松已经成功在欧洲和美国举办了许多起。这种由企业举办的黑客马拉松往往有个主题或者题目,比如“饿了吗黑客马拉松”是处理刷单问题的,大众黑客马拉松是做智能车载应用的等,而这次机器人马拉松则必须使用机器人Nao来实现相关想法!

Nao是在学术领域世界范围内运用最广泛的类人机器人。

Aldebaran Robotics公司将Nao的技术开放给所有的高等教育项目,并于2010年成立基金会支持在机器人及其应用领域的教学项目,曾于上海世博会展出。它提供了C++、Python和JS接口供开发者使用。价值几万元的机器人作为智能硬件给每个马拉松团队免费使用着实让人兴奋,而马拉松开始前则进行了一天的基本培训,对Nao中Unix系统的架构进行了详细解释。

机器人Nao的开发中,ALDEBARAN公司开发了一套类似于G语言的编程模式,通过简单的连线定义其系统的架构,再对每一个模块用Python进行编程即可。如果要自己开发一些预定义的模块的话,则要通过修改Unix系统中的模块来实现。机器人有头上和胸前两个摄像头,预定义了人脸和标志识别的函数;机器人的几十个关节也就是步进电机可以用来转动来设计舞蹈等动作;脚底下的两个压力传感器用来调节其平衡。之前的马拉松中有人做了用于自闭症儿童的应用、机器人荡秋千(这是数学模型和控制算法的精准)和爬梯子等动作,实验时各种滑稽的摔倒让人啼笑皆非。

这次我们的创意出奇,因为我在培训课的时候与一位音响公司老总交流过,他提出建议可以让Nao在博览会上做产品的推广和宣传。我想这是一个好的主意,但是对于不会编程的人来说太难了,找团队做的话呢开发成本又不低,定制化程度高。所以我想开发一套可以自定义的展示系统,人们只需要将PPT做好,每一页要让Nao说的话写好,再在每一页加几个动作就完成了。这样人人都可以使用我们的软件开发定制化的机器人展示系统,岂不是Nao非常好的应用!

所以我设计了整个代码框架,一个控制Powerpoint的Win32程序,一个后台服务器同步机器人的动作和ppt的播放,然后将Nao要说的话和动作设计用我们web课程中接触到的“标记语言”融合,用标记语言的方式清楚的给定每一页ppt机器人要做的动作和要说的话。这次我们团队3个人相对熟悉都来自中山大学,分工为任伟晗师兄写Win32程序,陈钰设计机器人的演讲动作和标记语言格式,我来写后台服务器同步播放ppt的电脑和机器人Nao,所有代码和调试大概在18个小时左右完成。而结果也是获得了一等奖的好成绩,我们的“自动讲述人”应用得到了ALDEBARAN公司中国区总经理的高度评价,而那位音响系统的老总也邀请我们去了广交会,我们把黑客马拉松中的作品真正带到了现实应用当中,看着在博览会上演讲的Nao和下面的观众新奇开心的样子,我开始懂得黑客马拉松的真正意义所在。

Nao and me!

更大的舞台——华科Unique Hack Day

广交会结束后,我又自己报名参加了华中科技大学的Unique Hack Day,这次的参与者与我第一次参加HackShanghai的选手有着很大的重叠,并有来自清华北大上交台大等名校高手。我作为已经参加过两届的黑客松选手,从很早就开始了筹划,我和同校的程序高手王钦和美女设计师一起,抱哈工大王潇雨的大腿在提前一个周就开始了讨论,最后我们决定做一个多人在线体感音乐游戏命名为SwordDancer,提前看好自己需要用到的编程技术,并开始学习。

到达武汉后,迎接我们的不但是闷热的天气,还有好吃的热干面,吃饱喝足后比赛开始。我们所构想的游戏是这样的,两名玩家在自己的电脑前面玩同一个游戏,两个人通过技能来使对方的血量降低,就像拳皇一样,而技能的释放则类似于《节奏大师》的模式,根据音乐和游戏中的提示做出相应的手势即可放出相应的技能。玩家体感自然是用我熟悉的leap motion,前端的工作量非常大由王钦完成,而经验丰富的王潇雨则负责游戏引擎也就是后台,美女设计师负责提供图片切片设计和手势动作设计,力求让游戏的界面和操作都引人入胜。

整个游戏包括了3个程序,一个前端JS web,一个由node js写的服务器引擎,和一个专门识别手势并发送相应手势代码给服务器的程序。在整个游戏做完后还有3个小时的时间,我们脑洞大开,又引入了一个真人版的概念,我们想让游戏更加有趣,就是屏幕中对战的玩家不再是动漫人物,而是自己,也许以后会有真人扫描的硬件就可以自动生成很多切片,而这里我们则自己拍摄照片并写入前端。在展示时,我们的“真人、在线、体感、音乐游戏”的概念深入人心,而demo展示时两位玩家玩得不亦乐乎,投影中两个真人的战斗配合音乐也十分有趣。我们成功击败各路豪强,获得第二名,8000元的奖金和一部智能钢琴也是让我们满载而归!

这次马拉松给我的经验是,在生活中就要积累idea,很多想法记录下来,综合一下也许就可以借助马拉松的机会和队友一起完成自己的想法了。

国际黑客松——Hack NTU

由于获得了Unique Hack Day的前三名,我们获得了去台湾大学参加黑客松的机票报销,于是我们3个开发者又加上一个朋友Roy一起前往台湾参加比赛。

Hack NTU是我所见过最大的黑客马拉松,有来自世界各地的1000人参加,期间还有台北市市长出席参观,政府可谓非常重视。

我们到达台湾后,与提前到达的来自北美的小哥们一起去酒吧聊天,并一起在台湾大学体育馆中居住官方提供的宿舍,他们很多新奇的想法和晚上睡觉前看书的习惯让我们感受到了文化的差异。

这次比赛就在台湾大学体育馆举行,上面主场馆是千人比赛场馆,楼下的教室则是各个赞助公司和开发者的talk,有非常多有趣的话题和讨论,如果没有idea可以去楼下听。除了官方提供了本次黑客松的主题——Hack into city之外,众多赞助商提供了不同的悬赏主题,如果做悬赏主题的话则可以获得悬赏任务的奖励。我们走访了Microsoft、Intel等不同公司的展台,最终选定一个特殊的创业公司——Migo。Migo是一家刚刚成立2年的创业公司,主要业务是将Internet推广到不发达地区,比如东南亚再比如非洲,用低廉的价格推广慢速的网络。这次的悬赏问题则是解决菲律宾的问题,给出了菲律宾的人口、经济、交通、住房等信息,自己选定题目并实现。

根据数据,菲律宾目前还在使用2G网络,由于3G基础设施硬件铺设费用高,人们只能用慢速的网络从而也就无法访问丰富的视频资源。我们想到,高速网络一般用于看视频听音乐,而他们所缺的正是一个是数据中心,如果我们以社区为单位做数据中心,由人力来周期更新数据中心的数据,那么很多事情都可以实现!这正是以时间换空间。我们选用了Intel Edison的开发版,搭建了一套CDN并提供了一套SDK,CDN为使用者提供了高速便捷的资源访问,SDK则为开发者Hack into developing country提供了可能,我们的数据分发虽然靠人力而且慢了一些,但在短期使用比铺设网络要价格低廉的多,而且搭建CDN高速便捷,是个很好的想法。

我们给这个项目起名叫做Running Bit,奔跑的比特!

我们如愿得到了Migo公司的悬赏——去菲律宾参观他们的海外公司,并因为使用Intel开发版还意外获得了Intel开发奖。

这次黑客松更像是世界IT文化的交流,不同地区不同肤色的人们用代码书写着不同的未来,智慧城市的主题也更显得熠熠生辉了。

本科的结束——编程之美全国总决赛

到了即将毕业的时候,在这个炎热的五月,我迎来了本科阶段最后一场比赛——编程之美全国总决赛,巧合的是又在上海,正是我第一场黑客松比赛的地方。

这次比赛由微软与IEEE联合举办,比赛地点在微软上海紫竹园区,比赛时间是24小时,不算是单纯的黑客马拉松,却是黑客马拉松的性质。这次我带领两个大神学弟,并与山东大学的美女设计师殷锟组队。随着题目的发布,我们选择了“智能相框”的题目:通过一段语音在图片库中找到想要的图片,属于内容较为限定形式比较开放的半开放题目。

选题过后,作为队长我首先与三名队员进行技术讨论,确定了此题在我们技术范围内可以找到的应用点和创新点——_匹配算法与手势识别_的融入,之后迅速分配任务,明确每个人的职责,王钦负责前端和手势识别部分的构建,高逸斌负责后台服务器的逻辑和每个API接口的书写,美女设计师负责将想法可视化并提供网页前端的美工切片,我负责核心算法的模型训练和图片数据集的预处理,并充当产品经理的角色统筹决策。

按照我们的系统设计流程,语音作为原始输入后通过微软语音识别接口转化为文字,之后我们使用一个官方提供的LUIS语义理解模型将文字转化为语义,这时我们就找到了语音指令当中的命令和特征标签,比如“找到上海拍摄的下雨的图片”中“找到图片”是命令而“上海”、“下雨”是特征标签。这里的特征标签会与图片库中每张图片的特征标签做对比匹配,从而找到准确的匹配图片。除了队友们负责的如何更友好的呈现外,我在算法上要做的主要工作就是匹配算法和图片的预处理。

匹配算法决定了找到图像的准确率,经过询问专门做文本挖掘的朋友,我们选择了在这里非常适合应用的Word2Vec算法,这个算法是将词语转化为数学向量的一种算法,在K维的向量空间中,词语的语义信息更多地被提取了出来,从而可以度量两个词语间的相似程度,比如“动物”和“狗”,“牛排”和“刀叉”的相似度高,那么我们就可以更加精确而广泛地找到图片。我们使用维基百科中文数据进行训练,经过测试,模型对于生活词汇较为准确。

图片预处理地目的则在于给图片贴特征标签,那么我们直接通过微软认知服务提供的图像识别接口,将图片识别出的置信度大于0.5的物品作为标签加到json形式下的数据库中,并手动添加具体人物与时间地点信息。

经过一白天的努力,我们基本完成了每个部分的原生代码构建,在回酒店的车上我们商讨了如何结合并决定整夜奋战!负责前后端的两个学弟在努力地调试和对接,直到凌晨4点才完工,而我的模型依然在训练中,我在提前写好测试代码后也昏昏入睡,同房间的其它队同学也没有回来睡觉,直接去附近的上海交通大学闵行校区通宵编程去了,压力袭来,我们一张一弛,有条不紊。

程序框图!

第二天清晨,惊喜地看到模型训练结束,成功载入并查询相近词成功后,我兴奋地去找只睡了3个小时的学弟,将算法融入后布置了上午的任务,将Web前端的鼠标操作全部改成基于手势识别的操作!为了完成比赛所需的答辩文档与PPT,我转头投入到另一个问题中,如何更好更快地将我们的idea呈现给参观人员与大赛评委。

首先,我们给作品起名为“Percepicture”意为感知的图片,通过语音与手势灵活智能地寻找和操控图片,紧接着设计师殷锟将她设计的系统流程图和用户UI图展示给我看,设计图美观而详细地介绍了整个流程,我急忙配图书写了简洁的介绍文档:

基于Web前端和Python服务器所构建的“Percepicture”语音搜图系统,通过微软认知服务中的语音识别API和语言理解智能服务(LUIS)API将用户的语音通过理解、转化得到用户的意图。而图片库中的图片则是经过图像识别API进行预处理,将图片的特征信息提取出来。当系统将用户意图与图片库中的图片特征进行匹配就可以得到用户想要的图片了。在关键词匹配的算法方面,同学们创新地使用了word2vec深度学习模型。他们对图片的标签语料进行训练并把词语映射到高维向量空间中,将词语匹配过程转化成数学向量相似度计算。在当今的大数据时代,这既扩展了搜索的广度又加深了搜索的深度,从而提高了搜索的准确率。在UI方面,为了使交互更加友好同时符合展览应用场景,系统中植入了基于手势识别的体感操作,整个系统可以通过语音和体感两种方式进行控制,大大增强了趣味性和互动性。”

在跟美女设计师说明了ppt的制作顺序后,我急忙赶去学弟们一侧录制demo视频,视频中要测试和体现我们所说的一切功能,并让评委老师感觉到生动和有趣。

紧张的编程阶段结束后,即将迎来的是demo展示会,我们队队员为了准备好demo不出bug甚至没有去吃午饭。demo展示中每个队伍一个展板一张桌子,来自微软的员工和外界媒体评审来一一参观,在此期间我还惊喜地遇到了去年在台湾大学参加HackNTU认识的廖教授,原来这次的外卡题就是廖老亲自出的题目。demo展示环节中,我们也走访参观了其它队伍的作品,来自北大、北邮、上交、复旦等各大学校的选手都尝试用不同的解决办法进行技术攻坚,遇到难题时相互启发找到了突破方案。而来自台湾大学的创意赛选手则非常擅于展示和表达,也给人留下深刻的印象;来自江南大学的创意赛选手在短时间内理解了作品别后的算法并做了清晰地阐述和表达,让人佩服……

团队合影!

最后的评选中,我们亮点鲜明、界面友好而实现度高的作品获得了来自大中华区各位评委的认可成功夺魁,我们通过创新的设计、明确的分工、不懈的编程和细致的合作创造了团队的力量,赢得了比赛,赢得了前往美国微软总部游学的机会!

从上海到上海,从一个新手到受到认可到比赛冠军,差别并不是得奖与否,而是比赛的体验和自己的心态。如果比赛中你实现了自己的想法,见识到了大家头脑的风暴,结识了一帮在五湖四海共同奋斗的朋友,那就足够了,不是吗?
———后记