基于Pytorch框架实现ENAS算法优化的图像识别技术探索-α迭代随笔

设想和目标

1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述?

  • 我们希望通过将ENAS的网络架构优化算法转变为实例化项目,能够在有一定实际意义下解决对于Pytorch图像识别的探索问题。
  • 项目性质为科研项目,由于是依托算法研究产生产品,故对于产品本身性质并不明确,通过与老师交流后初步定义为基于微信前端与后台学习框架交互的识别平台,主要以微信小程序的交互形式开放给用户。
  • 对于典型用户,实质为使用微信且对于某些特定物品有识别需求的人。而对于典型场景来说,目标是达到对于非熟悉场景与非限定化场景下对于物品的认知服务,但由于时间与技术的限制,目前只能做到特定环境下对于数据集训练完成的少部分内容进行识别。

 

2. 我们达到目标了么(原计划的功能做到了几个?  按照原计划交付时间交付了么? 原计划达到的用户数量达到了么?)

  从项目完成情况来说,确实达到了预期的目标,本次迭代主要完成了基本CNN网络的构建,微信小程序前端界面的设计以及交互呈现,前后端交互以及服务器部署,为第二次迭代开发作为软件基础,主要实现了以下功能块:

  • 原计划功能:

    前端页面设计与页面交互,数据互通,服务器搭建及环境配置,实现手写体识别功能及服务器部署

  • 实现情况:

    前端页面除与数据库交互页面外均设计并完成,页面间逻辑关系通顺并具有良好的用户体验,但是数据连通性目前较差,数据库未建立。

    服务器搭建已经成功实现,并且已经成功将代码部署在服务器上,实现了对服务器的应用。

    能够成功实现手写体识别,并且实现了数据预处理,使得后台应用可以适应图像的大小,形状变化,对于特征明显的图片识别精度可以达到95%。

 

3. 用户量, 用户对重要功能的接受程度和我们事先的预想一致么? 我们离目标更近了么?

  • 对于用户量,项目目前处在未发布阶段,且成效未达到投产要求,用户量较低,并且对于类似的科研项目,用户量并不在我们的考虑范围内。
  • 前端、后端以及前后端框架实际上在本次迭代中都已经完全部署,我们的主要目标为ENAS的实现,其次为基本交互与数据通路的组建,现阶段已经完成对于平台的建立以及网络组建,与目标较为接近。

 

4.有什么经验教训? 如果历史重来一遍我们会做什么改进?

  首先,由于课程需要,我们不可能单独分出人员专门进行ENAS的算法实现,这势必会导致人员分工的不平衡。故在本次迭代内不可能将人员排除在外以专门进行研究类学习。其次,本项目中对于平台的建立涉及到框架搭建与环境配置,计算机网络基础,前端,后台,学习成本较高。α迭代中没有完全的实现前后端人员分离,大部分精力主要用在粘合性解决与框架学习上。如果重新进行一次迭代,首先要做的是前后端分离,同时对于β版本中涉及的算法应当组织五人一起进行讨论,最终由后端设计进行实现。前端负责数据库与页面的设计,保留接口文档。这都是我们需要做却没有做好的地方。

 

计划

1. 是否有充足的时间来做计划?  

  时间相对来说还是较为充足,平台搭建本身较为简单,主要时间花费在于填补知识盲区与实践。但是因为指导老师并没有给我们明确需求的原因,整个项目的计划并没有十分的明确,直到α迭代结束时,需求分析也并没有完全打磨结束,仍然呈现较为粗糙状态,具体的需求很多需要在项目跟进的过程中摸索。因此,我们将日程进行了大幅度推进,迅速进入开发状态,在不断的摸索过程中进行深度的动态需求分析。

 

2. 团队在计划阶段是如何解决同事们对于计划的不同意见的?

   团队实际上分工是由PM来决定,但是由于项目的算法性质,以及团队内有部分成员具有一定的深度学习基础,故项目时间主要依托我与另一位算法设计人员决定,对于设计与交互逻辑,主要由大家协商解决,根据不同方案所产生的后续开发利弊进行权衡。

 

3. 你原计划的工作是否最后都做完了? 如果有没做完的,为什么?

   团队的工作除数据库的部署和设计放在了第二次迭代计划中外,均全部完成。

 

4. 有没有发现你做了一些事后看来没必要或没多大价值的事?

   首先对于服务的配置,在没有完全进行需求分析的情况下盲目选取技术栈,导致我和另一位组员长时间纠结于使用哪一种后端框架,以及如何解决https请求的问题,在实验之初对于官方文档并没有很仔细的探查,导致数据类型出现不匹配或传输数据失败的状况,这些都是由于初期对于文档不够熟悉。对于基础知识不足而盲目进行探查,导致大量时间浪费,出现了Apache和Nginx同时安装的状况,项目进度停滞。

 

5. 是否每一项任务都有清楚定义和衡量的交付件?

   对于项目的检查基本处在动态平衡的状态,当某些功能块出现无法满足的需求时,会立即与开发负责者进行沟通,对模块进行动态的调整,保证标准的统一。

这是较为不规范的一点,希望在β迭代中能够以做好为标准,而不是可用。(引以为戒)

 

6. 是否项目的整个过程都按照计划进行,项目出了什么意外?有什么风险是当时没有估计到的,为什么没有估计到?

  •  是按照计划进行,但是计划不如变化快,在模型训练时起初未考虑数据预处理问题,而后投入了大量时间解决数据的处理。
  • 显然数据处理是未预估风险,对于计划重点,我们主要关注了模型与算法,但对于数据的本身分析不足,导致未考虑数据来源。

 

7. 在计划中有没有留下缓冲区,缓冲区有作用么?

  有留下缓冲区,在α阶段验收前一周项目进入冷却期,留出了充足的时间进行测试与修正。

 

8. 将来的计划会做什么修改?(例如:缓冲区的定义,加班)

   由于接下来的项目难度较大,所以可能会需要较长时间专注于项目,并且要着重实现完成项目,可能会减少缓冲区的设置,多加班。

 

我们学到了什么? 如果历史重来一遍我们会做什么改进?

  项目的完成过程中,首先我理解最深的应该是团队合作。即便一个人可以做到再多事情,它的精力也是有限的,而这时,团队合作的重要性便显得尤为重要。其次,在项目开发过程中,对沟通表达能力,基本的技术能力有了进一步提升,更加了解了项目的开发过程与基本框架的使用。如果再来一次,我一定会尝试将分工与计划落实到位,避免出现计划不如变化快的情况。

 

资源

1. 我们有足够的资源来完成各项任务么?

  时间资源上,我们的时间还是比较充分的,完成任务的过程中也没有时间紧张感。但相应的,造成了β阶段迭代任务过为艰巨。软件资源上,我们在项目开始之初就选择了购买服务器资源进行部署尝试。对于算法本身,通过对于ENAS的论文以及对于其引述论文的分析,基本了解了实现,但细节上需要其他资源进行丰富。

 

2. 各项任务所需的时间和其他资源是如何估计的,精度如何?

  • 各项任务主要以其任务总量与参与人员数目进行估计,而人员各自的时间则由个人独立决定。
  • 暂未寻求到其他资源。
  • 项目整体精度不好,不能总是保持高效与有序状态。对于整个迭代,只有总计的时间节点,并没有将分任务点的提交时间细化,同时也没有预留出分任务点的解决时间,这是不好的。

 

3. 测试的时间,人力和软件/硬件资源是否足够? 对于那些不需要编程的资源 (美工设计/文案)是否低估难度? 

  • 对于测试,没有进行完整的测试例设计。仅简单进行了测试集测试与负载测试。
  • 人力资源足够,对于硬件资源,主要缺少GPU实例,导致模型训练速度与开发速度不匹配。
  • 美工的任务量较少,需要完成的内容不是很多,但是对于页面设计与交互逻辑上需要下一定功夫,对于这方面估计与实际基本相符,故未产生较大阻碍。

 

4. 你有没有感到你做的事情可以让别人来做(更有效率)?

  我认为我们的分工较为合理,每个人各司其职,效率已经处于一种临近饱和的状态,故不存在类似状况。

 

有什么经验教训? 如果历史重来一遍我们会做什么改进?

  并没有认真进行资源 - 目标 -进度的负反馈调节,如果再来一遍我们会从三个方面入手,提高开发效率。

 

 

变更管理

1. 每个相关的员工都及时知道了变更的消息?

  每天都会在群里讨论,确保所有人的信息透明,准确,可达。

 

2. 我们采用了什么办法决定“推迟”和“必须实现”的功能?

   首先我们保证了用户的基本使用路线的联通,在此基础上添加其他功能模块,故其他功能模块为推迟,必须实现是用户的关键路径模块。

 

3. 项目的出口条件(Exit Criteria – 什么叫“做好了”)有清晰的定义么?

  完成CNN对图片的预处理,简单分析辨识后将结果通过微信小程序反馈给用户。

 

4. 对于可能的变更是否能制定应急计划?

   并没有制定应急计划,由于未碰到紧急变更状况,这部分弊端没有暴露出来,可能也是需求较为模糊导致的。

 

5. 员工是否能够有效地处理意料之外的工作请求?

   对于突然需要的数据集,我们可以做到紧急集合并且在三十分钟内完成了数据集的制作与预处理过程。

 

 

我们学到了什么? 如果历史重来一遍我们会做什么改进?

  首先对于可能遇到的突发状况应该有一定的处置措施,而不是遇到紧急需求时手忙脚乱的紧急集合。同时,我们应当区分紧急需求与可推迟需求,以便发生紧急状况时可以有预留时间进行处置。再来一遍我们一定会指定应急处理预案,保证项目进度有序

 

设计/实现

1. 设计工作在什么时候,由谁来完成的?是合适的时间,合适的人么?

  整个模式的设计是在项目初期,进行需求分析时,由pm和老师沟通商定的。实际上在前八周设计开发过程中都有设计工作,需求在动态的调整。由PM与老师进行沟通磨合我认为是较为合适的,同时我们积极与老师沟通了时间,确保了每一位成员都能准确的了解需求,第一时间提出自己的疑问。

 

2. 设计工作有没有碰到模棱两可的情况,团队是如何解决的?

  没有,每一个设计都需要详细的讨论是否可行,每一个做出的决定都带有很强的目的性和可行性,不存在模棱两可的情况。

 

3. 团队是否运用单元测试(unit test),测试驱动的开发(TDD)、UML, 或者其他工具来帮助设计和实现?这些工具有效么?

  我们的每一个模块都是进行单元测试后严格对照接口来进行使用的,但由于接口与接口之间的适配问题,导致对于集成测试的处置遇到了困难。

  小组使用UML图进行详细的项目分析管理,通过活动图、用例图等分析项目的需求和对象。下面是小组设计的整个信息流与UML图:

 

用例图:

泳道图:

时序图:

 

从这几个图例可以得到我们软件的使用流程,功能的划分,进而得到α迭代的任务。

 

4.比较项目开始的 UML 文档和现在的状态有什么区别?这些区别如何产生的?是否要更新 UML 文档?

  • 文档更加丰富了,会在项目推进中,不断完善、更新文档,丰富项目中的类构建。同时随着对项目的不断理解,对UML文档进行了更新与完善,加强了对UML文档的设计。
  • UML需要更新,我们没有设计ENAS算法的UML图,实际上整个算法才是项目的核心内容,在听取老师建议后需要对算法设计UML图,将核心算法分解为子模块与子算法,进一步细化功能。

 

5. 代码复审(Code Review)是如何进行的,是否严格执行了代码规范?

   通过组与组之间代码互审进行的。我们的代码的代码规范有些缺失。

 

我们学到了什么? 如果历史重来一遍我们会做什么改进?

   首先我们学会了使用UML图来指导项目设计,同时对于整个项目各个部件间的沟通也主要依据UML图来进行。其次需要对代码的规范性进行复查和严格审核,代码的规范性尚有待提高。我认为我们主要需要规范代码,同时严格按照UML图中的走向进行程序开发。

 

测试/发布

1. 团队是否有一个测试计划?为什么没有?

  有针对验收标准进行商议和参考,但是没有针对具体的计划。对于初期开发,整个团队并没有建立很强的自信心,整个项目从无到有我们很难说自己有一个可以拿出来进行测试的成品。当然第一次迭代之后会对项目设计测试计划,对ENAS的性能进行系统测试。

2. 是否进行了正式的验收测试?

  是

 

3. 团队是否有测试工具来帮助测试?

  没有

 

4. 团队是如何测量并跟踪软件的效能的?从软件实际运行的结果来看,这些测试工作有用么?应该有哪些改进?

  暂未考虑

 

5. 在发布的过程中发现了哪些意外问题?

  小程序的发布需要备案审核等,不考虑进行发布。

 

我们学到了什么? 如果重来一遍我们会做什么改进?

   程序的完成与测试还是重点,同时要合理安排时间,留下确切的冷却期。在单元模块的开发过程中进行单元测试,同时对于集成测试应当留有测试样例与接口文档,必要时可以安排专人进行测试样例设计。

 

团队的角色,管理,合作

1. 团队的每个角色是如何确定的,是不是人尽其才?

  团队角色确定,以尊重个人意愿为首要因素,再根据实际情况协商确定角色。参照自身的学生身份,现阶段我认为还是以开阔眼界,寻找自己感兴趣的方向为主,尽可能保证广泛涉猎,从而选择适合自己的方向。

 

2. 团队成员之间有互相帮助么? 

  有,诸如宋朝都同学与我积极探讨了关于ENAS的算法实现,以及颜岑同学曾与我探讨的对于图片的预处理的一些看法,都是可贵的帮助。

 

3. 当出现项目管理、合作方面的问题时,团队成员如何解决问题?

  大家共同商量,综合每一个人的意见,尽可能达到让每个人觉得公平,平衡。

 

总结:

你觉得团队目前的状态属于 CMM/CMMI 中的哪个档次?

  属于CMMI一级,完成级

 

你觉得团队目前处于 萌芽/磨合/规范/创造 阶段的哪一个阶段?

  磨合基本完成,接下来是规范

 

你觉得团队在这个里程碑相比前一个里程碑有什么改进? 

  大家彼此更加熟悉,互相的配合会比之前更有效率,同时渐渐有了明确的分工和侧重点,比如我们这边PM侧重前端开发,而其他人员多侧重于前后端连接与数据通路设计,我主要侧重算法分析与后端的建设。

 

 你觉得目前最需要改进的一个方面是什么?

  提高效率,划分分工界限。

 

对照敏捷开发的原则, 你觉得你们小组做得最好的是哪几个原则? 请列出具体的事例。 

  在团队内部,最具有效果并且富有效率的传递信息的方法,就是面对面的交谈。我们小组每周都有交流,也每周都会开会讨论,不管线上线下(虽然有的时候没有写会议记录)。大家相互之间的交流也有助于我们进步。而且大家相互帮助,在面对问题时互相助力,共同解决。如对于数据通路的联通问题,我们曾专门留出一个下午进行集中开发,衡量了迭代的优先级,最终迅速的解决了问题。

posted @ 2018-12-16 03:08  biejiajun  阅读(713)  评论(4编辑  收藏  举报