标签:
SpecFlame是我自研究生阶段加入浙大GAPS实验室以来所做的第一个实战性质的项目。该项目我负责的部分的持续时间为2015年7月13日~2015年8月30日。项目的目标是通过Kinect fusion强大的建模功能,根据其扫描的人体特征,自动化地生成适合不同人的眼镜。下面我将对我参与该项目的历程进行介绍,并总结其中的经验教训。
7月13日,还带着点毕业时淡淡忧伤的我再一次来到杭州,正式开始了自己的研究生生涯。我接到的任务是继续ZS学长之前做过的眼镜项目,重写并按照新的算法实现该项目。
第一周(7月13~7月19)的时间里,我主要是在阅读老项目的代码。通过学习MFC机制,我大致上对该项目所采用的生成眼镜的流程有了初步的了解。但有一个地方其实是存在问题的,那就是我并没有一开始就尝试编译运行程序,而是自己闷头读代码。这样做实际上很不利于我对具体功能的实现和代码的理解。
在第二周(7.20~7.26)的时间里,我接到了导师交给我的具体开发任务:先初步实现一个基于四面体网格的镜框,并写一个简单地界面来显示它。因为我六月份刚刚学习了DirectX11编程,因此打算用DirectX+QT来实现。由于我对QT中实现DirectX并不是很熟悉,因此做这个简单的工作实际上花费了我不少时间。并且,可能由于我和导师都属于性子比较急的类型,我在和导师的沟通过程中经常存在一些障碍,导致我做出来的效果往往并不是导师想要的,为此还被挨了好几顿批。当时心情也比较郁闷,自己也在反思今后如何能够更准确地理解导师真正的想法。
在第三周(7.27~8.1),我的工作状态渐渐步入正轨,利用STASM算法得到了人脸的特征值,并将kinect fusion的功能成功整合到了项目中。
第四周(8.3~8.9),我尝试计算特征点,并生成了眼镜的镜片和镜框。在计算特征点的过程中,我遇到了一个很诡异的bug:计算的特征点和利用kinect扫描出的mesh始终对不上。当时我调了很久的bug都没能搞定,直到导师提醒我应该和旧项目的代码进行替换,去确定到底是哪方面的问题。通过这么做,我发现原来旧项目和我的项目所利用的Kinect fusion程序是不同的,旧项目的Kinect fusion程序修复了image和depth图片对准的bug,而我采用的版本则没有修复这个bug,这就是导致特征点和mesh偏差问题的原因。
之后,我开始设计生成镜片和镜框的代码,vertex的构建并没有花费多少时间。比较麻烦的是normal的计算过程,因为我当时并没有按照标准的流程(顶点->构建四面体->生成四面体的法向量->计算顶点的法向量)来做,而是通过顶点间的位置关系来强行计算normal,这样做的难度就要大很多了。再加上我采用的都是一些比较原始的Debug方法(单步观察数据),导致我迟迟找不到问题存在的原因。导师建议我利用一些debug工具,将normal在图像中显示出来。我利用这种方法调试了一天多,最终终于确定了问题存在的原因,也使得光照彻底没有问题了。
第五周(8.10~8.16),周老师来看了我目前的效果,表示对我的界面设计不满意,并总结了七条需要进行修改的list。其中一条便是将DX的版本转成OpenGL版本。而由于我之前写的代码太过于耦合,使得我光是完成这一条就花费了自己很长时间。(期间还经历过一次电脑崩溃,当时没有备份代码把我吓得不轻,幸亏代码被我抢救出来了>.<)。
后来,感觉项目就越做越崩,旧的bug没有完全消除,导师对自己新的要求又一个接一个,压力也越来越大,每天几乎都要忙活到凌晨3、4点。然而即使如此,仍然不断遭到导师的批评,当时自己的心情也是极度的郁闷。最后,由于项目比较紧急,实验室最终让任老师来接手我的项目。我最后就做了一些代码交接的工作,这个项目我负责的部分就算是暂时告一段落了。
总体来说,我这次项目做得还是比较失败的,这在一开始让自己感到非常沮丧。自己本科做项目的时候,可能因为难度并不是很大的原因,尽管在做的过程中也遇到了很多困难,但最终还是和队友们一起将它们克服了。而这算是我第一次失败的项目。经过反思后,我总结了这几条经验和教训:
1、在听取别人要求的时候不要急,要尽可能准确地把握住他想要的,必要的时候需要将他的需求复述给他听,以尽可能地防止误解他的意思。
2、在写代码的时候,要遵循一定的代码规范,尽量让自己的代码可读,耦合性不要太高。要时刻记住自己的代码不仅仅是给自己看的,之后可能会有很多人接手自己的代码,你希望你接手的项目代码是一团浆糊吗?
3、要学会借助一些Debug工具来帮助自己更有效率地debug。所谓“代码能力强”,不仅仅指你手速快,实现地快,更看重你代码的品质,以及你debug的能力。(所以说,我现在越来越觉得只会搞ACM的人并不能算是真正地会写代码)。
4、在做项目的过程中,并不是说一定要用最新的技术,最酷炫的实现,而是应当与团队大部分成员使用的开发工具相契合。比如我一开始用DX11去实现,但实际上以这个项目所需要的渲染要求,OpenGL固定流水线完完全全够了;但由于我使用了DX来做,反而导致导师有很多不错的代码实现不能分享给我,一定程度上延后了项目的进展。
5、在项目过程中,有一些工作,做了之后可以使之后写代码更加方便。对于这样的事情,不要嫌麻烦,只要有时间就可以去做。正所谓“磨刀不误砍柴工”,你做这样的工作提高的效率将远远压过做它所花费的时间。
6、做事情不要再“差不多”,要以一个处女座的标准来要求自己,对自己狠一些,这样才能逼迫自己真正地得到成长。
7、代码应当做好备份,哪怕是本地备份也行,不要再出现电脑崩溃代码没存的局面。当然最好能使用一些版本管理工具(例如git)来辅助。
总而言之,就是今后要渐渐学会更加聪明、更有效率地去做事。反思一下之前做项目以及做事情的过程,自己确实就有点“漩涡鸣人流”的感觉:“凭借着自己的皮厚属性和大量的九尾查克拉,不管三七二十一冲上去一阵猛干”。也许在本科阶段,由于做得项目难度并不是很大,用这种方式还能应付;但随着自己学习的深入,这样做就会凸显出很大的问题。从这个方面来讲,我这个“漩涡鸣人”应当向技术流的“宇智波佐助”、“宇智波鼬”包括“卡卡西”学习,去学习他们做事的方法,提高自己的工作效率和靠谱程度。
在研究生阶段,在纵深专业领域的同时,我需要给自己定下一个学习计划,阅读一些有关代码规范以及软件工程方面的书籍(例如《Code Complete》、《Design pattern》等),并尽力将它们融入到自己的编程思想中,真正提高自己写代码的能力。这个目标我会时刻记在心里,并在研究生阶段开始着手实施。
标签:
原文地址:http://www.cnblogs.com/wickedpriest/p/4771139.html