/ Hackathon

Penta-Hackathon 2016 参赛总结

11月26 - 27号参加了人生中第一次 Hackathon 类比赛,主题是 Hack for AI (both artificial intelligence and 「愛」),坐标上海闵行区紫星路999号微软亚太技术支持中心(MS APGC CSS)。

Day 0: Preparation

赛前组队可以说是一个赶鸭子上架的过程,我们 Effervesce 队的四个队员——我、毛毛、小金、一非——都是 freshmen,而且是在报名截止的当天才决定参赛,所以直到参赛之前都觉得有点虚。赛前我们开了一次组会,收集了大家的想法,决定利用微软提供的 HoloLens 开发一个入口类应用,但是由于经验不足,我们的想法显然非常 naive,在手头没有 simulator,完全不会 Unity 建模,完全不熟悉 API 的情况下一天时间上手 HoloLens 几乎是个不可能的任务。因此在与一些朋友交流过后我决定完全推翻 HoloLens 的开发计划。于是赛前又临时开了一个组会,在这个组会中我们保留了入口类应用的开发想法,但是组会的方向转向了技术实现方向的讨论。最后我们决定利用 Arduino 或者 Ruff(主办单位提供)以及 Raspberry Pi 开发一个智能家居组件。

具体来说,我们的设想借鉴了 RPi 官网上提供的一个想法,用一面半透镜实现一个智能助手,提供简单的语音交互、面部识别,还可以针对脸部表情进行识别,提供多样化的交互方案(利用 Microsoft Face & Emotional Recognition)。

开完组会以后已经周三深夜,我们的精力放在了研究镜子材料的问题上。一非有一个闲置不用的 22 寸显示屏,这样在显示屏上面覆盖一面镜子就可以解决问题。实际上,我们最初的想法就是购买一面普通的双面镜,但是考虑到透光率以及不方便购买等问题,改为使用一面亚克力全透镜上覆一层镜面贴膜,这种方案淘宝上的报价相对低廉,嘉定也有很多生产厂家,但是考虑到透光率和实际效果不好把握,最后只能作为 Plan B。这个时候询问了很多朋友,发现这种材料实际上是一种半透镜,同时两面镀膜,达到反射部分光线和透过部分光线的作用。(工业上来说其实生活中相当多场景利用到了这种材料,比如汽车的反光镜上同时可以有时间显示,以及机皇 Nokia 在多年以前就推出了镜面手机等等)在淘宝和 1688 上找到了比较多的供应商,但是报价非常贵,而且还要求批发。另外一个问题是 22 寸显示屏的尺寸对于玻璃厂商来说并非常规,需要单独定制,耗时周期就更长了。我在淘宝上联系了 20 多家亚克力厂商,最后只有 1 家能够提供尽快的定制,同时报价还比较便宜,我们算了一下使用顺丰次日到应该能在周五的时候送到学校,这样就废弃了 Plan B。

周五的时候顺丰给我们带来了好消息,亚克力的材料天生就能带来好感,而且出于直觉,我要求厂商定制的是 16:9 对角线长 21 英寸的镜子,比对显示器发现非常合适,没有超过显示器边框的范围。如果当初真按 22 寸进行定制,在没有专业切割工具的情况下我们只能把显示器的边框全部拆除才能安装镜子,现在想想还是非常后怕。

Day 1

周六清晨包车到了微软厂房,不得不说田牌按照 Seattle 原样设计的厂房非常优美,不像 Google 在环球金融中心的厂房有一种身处钢铁之间的冷漠和压抑,在闵行一片绿色之中工作应该会舒适很多。之后进行开幕式、物资发放等环节,微软亚洲研究院学术合作部刘康平博士、交大软院院长到场致辞(从中可以一窥交大对本次比赛的重视程度)。

之后就开始了 Coding 的过程,我们进行了简单分工,小金和毛毛负责人脸识别等 API 的研究,我负责 IoT components 的调试,一非进行前端 UI 设计。下午 2 点,我们发现忽略了最重要的一个问题:架构设计。我们当时完全没有架构的概念,缺少对整个项目的规划。因此我们立即开始设计,出于简化考虑,设计为 C-S 架构,Client 端负责调用各个 API 并且与 Server 进行通讯。由于现场物料有限,我们手中仅有一个 RPi 专用的 WebCam,这样的话就不得不将 RPi 独立出来,单独作为一个服务端提供拍照,顺便提供人脸识别等功能。Arduino 接温度和人体红外感应部件,通过 USB 与 Client 进行串口通讯。下午 3 点左右我们基本上完成了 REST-like 接口的规定。

顺带一说,伙食往往是评价一个 Hackathon 好坏的维度之一,本次比赛的伙食虽然是盒饭,但是基本做到了荤素搭配,还有奶茶,晚餐还提供意大利面和 Pizza 可选。这一点上 Penta-Hackathon 做得非常不错。

在比赛间隙有 HoloLens 开发指导和体验,试玩了一把 HoloLens 感觉确实相当惊艳,沉浸体验非常不错。唯一的缺点:买不起。

晚上一非进度比较快,UI 部分实现了多个 API,而我这里除了要把 IoT 部分的各项麻烦事解决,还要帮毛毛和小金调试他们的代码,进展相对比较慢。晚餐过后我负责的硬件部分基本上已经调试完毕,人脸识别和语音录制、识别也基本完成。由于微软的场地不允许过夜,我们晚上转场酒店,在此之前还举行了一个纸飞机比赛,由于进度缓慢没有参加。隔壁的山东小伙儿取得了第五名,一个不错的成绩。

Day 2

酒店选择交大旁边的 IU 酒店,我们住的单间比较小(本来也不是给四个人睡觉的),但是上网速度比较快。RPi 连接微软认知服务 API 需要的时间非常短,几乎秒出结果。这比在微软的场地要快不少,在微软厂区里完成拍摄、上传再获得结果需要 6 秒多,这也给我们后来的 Demo 带来了麻烦。转场以后我的目标就集中在整个 Client 上,一非继续完成 Server 端。晚上 3 点左右集中睡了一觉,4 点半起来起来写。在酒店的时间里基本上将 Client 部分完成。

回到微软的场地,首次揭开了镜子的保护膜,效果确实非常惊艳。完成接线以后进一步对程序进行调试。遗憾的是,由于网速、场地吵闹等原因,我们自己调试的效果也非常不好,特别是人脸识别速度慢,语音识别效果差。此外,本来打算使用一非的 Windows 本跑 Client,由于 pySerial 在 Windows 下的问题,始终无法获得 Arduino 的串口输出。事实上,这个问题在 macOS 上也存在,只是我通过 time.sleep() 等待一定时间之后可以获得输出。

最后接线的成品图:

再接下来的时间里在外面的沙发上睡了一会儿,午饭过后就等待答辩了。第一轮答辩在小房间内进行,准备不充分,非常紧张,评委主要针对项目的商业价值进行提问,这使得我略有一丝不悦,毕竟这只是一个 Geek 的项目,并不在乎商业的价值。

再之后意外的进入了第二轮 Public demonstration and presentation,由于会议室网速慢,Server 和 Client 之间的通讯甚至都出现严重丢包的情况。最后,拿到了一个“最受欢迎”奖,奖品四块 TicWatch,具体过程也没什么好写的了,毕竟人在熬夜之后思考和记忆能力都下降了,我也不太记得那个时候在干嘛……

总结

整体上来说,我们作为第一次参赛的选手,最后能进入第二轮答辩并拿到一个奖非常不容易。整个过程上没有出现大的沟通问题,合作比较愉快,在 24 小时内能将整个项目做完,并且项目总体完成度不错,基本完成最初的设想,这是不容易的。从技术角度来看,整个开发过程勉强符合流程,但是依旧存在非常多的不足。比如整个架构在异步处理上很是问题,Client 和 Server 在消息处理上几乎可以说是 P2P 的结构,应该可以设计一个调度器来完成异步消息事件的处理,等等。

总结经验如下:

  1. 赛前组会讨论的目标应该着眼于具体实现,项目的规模不宜太大,不然 24 小时无法完成;
  2. 架构应该尽早提出,在确定好要使用的技术以后应该讨论具体架构,而不是闷头开始写;
  3. 分工合作应该更加明确,这样可以合理安排休息和睡眠时间。

总的来说,两天的比赛收获不少,希望明年有机会再参加。

附:Presentation Slides (Keynote template credit: breeswish)

注:图摄自 Microsoft APGC CSS,一个阳光灿烂的下午😊。