2016年终总结

这是我的2016年终总结,也是我第一次写技术相关的总结,希望以后每年我都能写一个总结,总结这一年来做的工作,反思有哪些做的不够好的地方,在新的一年里加油做好。

在2016这一年来,我做了一些项目,给开源社区贡献了一些代码(大多数都是简单的代码格式和规范方面的改进),学习了一些新的技术。同时,在实验室的科研项目上,却没有太大的进展,我做的视频中动作识别的方向没有成果,实在是很担心下一年的情形。下面,我从开源贡献、自己做的项目、学习的技能、阅读的书籍、实验室研究进展5个方面做详细的总结。

1. 开源贡献

在这一年里,我在GitHub上总共贡献了642个Contribution,如下图所示。
GitHub Contribution 2016
给包括tensorflow、Paddle、C3D、tflearn等项目提交来一些代码,主要都是typo、格式上的问题,虽然实际意义不是很大,但总算开始能够参与到开源社区的活动中去, 这也是很值得高兴的事情。最激动的是在Tensorflow的0.10.0 RC0 和0.11.0 RC0发布的贡献者感谢中提到了我的名字,感觉还是挺有成就感的。
Tensorflow 0.10.0 RC0 thanks
Tensorflow 0.11.0 RC0 thanks

下面是今年我在开源项目中所做的代码修改(点击链接即可跳转到我的Commit):

  1. tensorflow
  2. Paddle
  3. tflearn
  4. facebook/C3D
  5. cs231n.github.io
  6. tensorflow/models
  7. openai/universe
  8. githug
  9. docker_practice
  10. Ruby-tutorial
  11. learnxinyminutes-docs
  12. TensorFlow-Examples

参与开源社区的活动,既可以提高自己的编程水平,也可以和世界各地的人们一起交流,提高自己的英语水平,也能了解到最新的技术,所以我觉得是一件很有意义的事情。但由于我水平有限,实质的改进并不多,希望在2017年努力提高自身水平,更多地参与到开源社区的活动中去。

2. 我和小伙伴们做的项目

1. CaptchaLess

研一上学期在上《视频技术基础》课程的时候,我和蒲俊福、黄志华三个人做了一个Chrome插件CaptchaLess,来完成我们学校网站的验证码的自动识别,蒲俊福负责算法,黄志华负责将算法部署到Django搭建的后台,我负责前端的Chrome的插件,包括和用户交互、验证码图片的提取、发送到服务器端、将服务器端识别的结果返回给网页、渲染出结果。
一开始我们针对比较简单的验证码(只有0-9这10个数字),采用来模板匹配的算法,即爬取一些验证码图片,手工标记是什么字符并保存为模板,当识别验证码的时候,先进行二值化、高斯模糊等处理,去除噪声,将验证码图片和标记好的图片进行比较,寻找模板中最相似的,作为识别结果。由于这一类验证码几乎没有形变,只有少量的噪声,所以使用这种方法就足够了,识别结果几乎是100%(到现在为止貌似我只遇到1,2次)。
然后我们又考察了另一类比较复杂的验证码,其中包含0-9和24个字母(为了避免和某些数字混淆,删去了一些字母),而且有比较大的旋转。我们是了一些基于匹配的改进算法,但识别率还是不高。当时由于时间比较紧,需要在课程结束前进行答辩,我们就先没有完善这部分。
$后来我又想起这回事,尝试来一次,没有成功。又过了很长时间,我又想起这个事,又尝试了一些方法,发现采用局部二值匹配能够较好地解决后面一种验证码的问题,所以改进了下代码,更新了插件。测试的时候,在比较复杂的验证码上,能够达到67%的准确率,单个字符的识别更高些,算是一个比较好的结果。当然还是可以再改进的。
所以从这个项目中,我发现对于一个暂时没能搞定问题,可能需要时不时地去思考怎么解决,有的时候思维比较局限,想不出法子来解决,可以先放一放,但不要忘掉,等思维比较活跃的时候再来看看,说不定可以很快就解决掉。正所谓“念念不忘,必有回响”,就是这个道理吧。

2. EasyDict

在做CaptchaLess项目的过程中,我熟悉了Chrome插件的开发方法,所以在后来用扇贝背单词的时候,看了看扇贝网的API,突然想,能不能做一个基于扇贝网的Chrome查词插件呢?于是这个功能简单的查词工具EasyDict就产生了。目前提供的功能比较少,仅仅包括中文释义、英文释义、英式发音、美式发音。期望的后续工作还包括:增加浏划词查询,鼠标右键查询。

3. cool_certificate

某次有同学给我发了一个网页,上面时一张无人机驾驶证的图片,只要在网页下面的输入框上写上你的名字,就可以生成专属于自己的驾驶证,确实挺装逼的哈哈。我在想,能不能自己做一个呢?于是想了想,其实比较简单,只需要将用户输入的名字写入到照片上,然后生成新的照片即可。于是我立即动手,采用Python的PIL包和Django网站架构,制作了一个可以公开访问的站点,输入名字就可以生成酷酷的照片,包括无人机驾驶证,潜水证和帅哥证,你可以在这里试着玩一玩。
总体来说这个项目比较简单,比较好玩。还有两个可以改进的地方:一是字体写入到照片的时候可以进行一定的旋转,以显得更真实。二是采用与图片文字更相似的字体,同样可以提高真实性。

4. travel_record

某天实验室的小伙伴告诉我有个叫ClustrMaps的工具,可以记录你的网站上的访客的IP地址,然后他说,能不能用这个来记录旅行的足迹呢?比如建立一个只有自己可以访问的网站,每到一个新的地方,就访问这个网站,这样地图上就可以显示自己的IP的所在地,这样等周有完世界后,就可以看到世界各地的属于自己的足迹了。于是我们就开始做了,采用Django框架,制作了一个简单的登录页面,输入正确的密码就跳转到一个包含ClustrMaps的代码的页面,就可以实现签到;如果输入密码不对,就一直跳转到登录页面,这样别人的IP就显示不到ClustrMaps地图上。

5. HackxFDU 黑客马拉松比赛

有一次在微博上我偶然看到了GitHub赞助的HackxFDU黑客马拉松比赛,在复旦大学举办,于是和伟哥一起报名,希望能组队取参加一下,增加一些项目经验。最后只有我入选了,去上海临时和4位复旦的学生组了队,想做一个基于大疆无人机和深度学习的行人跟踪应用。因为无人机是通过手机控制的,所以我们开始的设想是在手机上完成整个深度学习的计算,包括采集无人机发送的图片,将图片输入到深度学习的网络中,识别图片中的行人,对其进行tracking。
我们团队的小伙伴和GitHub的工作人员
因为我们听过tensorflow可以在Android设备上运行,所以在讨论方案的时候,我们觉得这个方案是可行的。后来在实现的时候,才发现有很多问题。一是Tensorflow在Android上面的程序也是在电脑上训练好model后,将model导入到Android应用中,所以在Android端是没有训练过程的。二是tensorflow从PC到Android的迁移问题很多,没有成熟的解决方案,向Bazel的编译很容易出错,而且错误不好解决。最后我们的很多时间都是花费在了解决各种奇怪的问题上,到项目结束的时候,我们组的完成度很低,几乎没办法展示,在最后的展示阶段,显得特别尴尬。不过最后我们组因为创意比较好,获得来大疆的企业奖,奖品是一个Osmo+手持拍摄云台。
这个项目过后,我思考了挺多东西,觉得要做好一个项目,我还有很长的路要走。
首先是“领导力”和自身想法的缺乏。因为在团队中,我是年级最高的,而且技术了解比其他几位队友稍微多一点,如果在选择项目的时候,说出自己的想法,选择比较成熟的方法,可能后面做起来会容易些。因为我平时习惯了听别人的做法,没有思考过自己的想法,很多时候都是选择沉默或者跟随别人的意见,所以在关键时刻也没能站出来,这是我以后一定要改进的地方,否则真的成不了大事。
还有和队友沟通太少或者沟通效果不佳。因为我们是当时才组建的队伍,之间大家相互都不认识,所以在讨论项目的时候都比较含蓄,没有太直接地提出自己的想法。这也是我以后应该改善的地方。
还有最重要的是,对目标的坚持程度。整个黑客马拉松共经历了2天2夜,第一天晚上,在半夜2,3点,实在不知道接下来该怎么做的时候,开始思考人生了。从大学期间开始,我陆陆续续做了一些项目,有大有小,大多数项目都算失败了,做着做着就没有下文了,我想这次也估计是这样了。为什么最后都做不下去呢?有各种各样的表面上的原因,但归根结底,还是自己对目标的坚持程度不够吧,习惯了惰性心理,不肯花太多时间,习惯避重就轻,遇到困难很容易退缩,没有坚持下去的决心。想想确实挺担心,如果一直这样下去的话,我这一辈子肯定做不成什么大事。更悲哀的是,在平日许许多多的日子里,我完全每想过这些事情,而是在茫茫小事中度过了一年又一年。新的一年里面,改进这些方面吧。

3. 学习到的技能

其实想了想,我几年没有学到特别多的大的技能,所以将一些细小的方面也都列出来吧。

  1. Chrome 插件开发,只能算是简单了解
  2. TensorFlow, 只能算简单了解
  3. RCNN, fast RCNN, faster RCNN, 了解了论文,大概看懂了代码
  4. Torch, 只知道怎么安装,跑了简单的示例程序
  5. Paddle, 只会安装
  6. Ruby, 学习了一段时间,现在又忘记了……
  7. Ruby on Rails, 学习来一段时间
  8. Lua, 在看Torch的时候学习了一下,现在忘差不多了……
  9. PIL, 大概了解简单用法
  10. Numpy, 了解基本数据类型和简单用法
  11. Git, 了解比之前加深了一些
  12. GAN, 了解了概念
  13. CUDA, 了解一些
  14. Spark, 跑了跑教程里面的例子
  15. OpenMP和MPI, 也是大概了解

发现我基本都是只了解一些,没有完全地静下心去掌握……

4. 阅读的书籍

今年偶然的机会了解到了微信读书这个app,用了一段时间后发现很不错,在手机上读书比读纸质书更方便,随时随地都可以看书,毕竟手机已经完全融入到每时每刻的生活中了。下面就是今年我所读完的书籍(包括微信读书上看的和电脑上看的PDF版和纸质版)。

  1. 《Pro Git中文版》, 非常棒的一本介绍Git的书,写的特别清楚,个人认为和《The Django Book中文版》是我看过的写得最好的技术书籍
  2. 《白鹿原》,熟悉的西北地域,陌生的魔幻现实风格
  3. 《呼兰河传》: 小孩子童年的记忆,小城里小人物的故事,和风土人情。全书笼罩在悲凉的气氛下
  4. 《边城》: 湘西风情画,赛舟,吊脚楼,山歌,河流,淳朴的水乡人民,单纯的爱情故事,描写方式很独特,所有的故事发展好像都是从写环境来展开的
  5. 《查令十字街84号》: 落魄美国女作家和英国书店绅士因购买书籍而开始的的书信集,活泼的女作家和谦谦有礼的已婚男绅士的反差很有趣,困境中相互帮助和美好的心灵。
  6. 《芙蓉镇》: 南方小镇的文革风云。
  7. 《追风筝的人》:阿富汗风情录,在历史变幻下的一个人的救赎之路,看完之后就会明白为什么评价这么高了
    2017年继续坚持阅读,希望能读一些关于商业和理财知识方面的书籍,了解基本知识,拓展视野。

5. 实验室的进展

其实这一年来实验室的工作进展很小,这一年里沿着2个思路做了工作,但结果都不好,实在不知道接下来该怎么走。

6. 总结

新的一年,继续加油,努力做好每件小事,改正前面提到的问题,相信肯定会有收获的。