【学术研究】Pet是什么?
总括:Pet是我们实验室的一个深度学习工具包,我们在逐渐完善丰富功能的同时,寻找共性和特性,慢慢的优化我们这个框架。
面向教学, 文档。
它里面包含了三个大的模块,task模块以及Project模块,CNN模块。
其中Project模块就是包含一些和我们结构不太兼容但比较重要的一些方法,比如densepose,联合训练,3D人脸,部分全景分割的方法。
task模块包含一些重要领域但不是我们实验室主要做的任务,例如分类,行为,人脸,3d检测
cnn模块是主要的模块,里面整合了全图和基于roi的两种任务,全图的任务比如分割,一些anchor free的检测,单阶段实力分割这些,基于roi的任务就比如faster rcnn,mask rcnn,keypoint rcnn这些。
facebook-maskrcnn benchmark --> 项目需求添加任务 --> 代码复用性整合 --> 吸收
加法 - 减法 (共性)
介绍
Situation: 该项目是在什么背景下展开的,做这个项目的目的是什么
Target: 该项目的目标是什么,例如DAU等
Action: 为了目标你们采取了什么动作,这里可以分点阐述
Result:最终项目结果,最好能有数据作证
该项目是为了减少代码复用性而展开的,目标是形成一套方便实验室技术继承和教学的工具包,因为涉及技术继承和教学两个目标,我们分成了两块进行研发,一块是技术更新,我们会对现有框架的比较好的特性进行吸收,同时在我们工具包中进行工程复现一些比较优秀的方法。二是教学,我们针对架构这块进行的压缩扁平的设计,提高代码这块的易读性。
对比mmdet/detectron2
mmdet:
优点:
- 适合学术工作者,更新吸纳新的方法快
缺点:
- 不易读,层级结构嵌套很多
- py结构对于参数过于随意
- 为了减少代码复用性,任务区分度较低,任务之间互相调用
- 依赖包mmcv,不能git就跑
detectron2
优点:
- config系统整齐,对参数整齐度比较高
- 任务区分度较高
- detectron2改进细节提升精度
缺点:
- 对于新的方法支持较少
哪个更好,为什么
detectron2,因为架构清晰,继承少
数据流这块有什么具体的设计?
高层设计imagecontainer,统一coco格式,简化测试流,按任务包装测试接口,易读性。
维护工作如何展开
如果版本更新周期为一个月,会先开两次会,第一次先做加法,添加所有觉得可能需要添加的功能,然后在做减法,对于相互之间存在冲突,或者优先级没那么高的任务进行删除操作。最后敲定TODO list,然后分配每个的具体负责人,每一周进行一次小会,主要同步进度以及对遇到的问题进行反馈,然后半个月和领导过一下整体的大方向,看有没有隐含的问题,如果没有就继续做,最后进行交付,整体进行一次代码review。
你具体做了什么,解决了项目难点亮点?
工作:
任务层面:
- 方法迁移:人脸(3DDFA)目标检测(anchor:Cascade/HTC/Grid RCNN/FCOS/ATSS/PAA)实例分割(Condinst/PolarMask/SOLO)
架构层面:
- 每一次架构升级,rcnn方法架构整理,整体维护代码可读性,面向教学
v0.4: 修bug的工作,没有体系,任务之间差异性比较大,能跑通的状态,尽量在保证精度的情况下做到一致。
v0.5: anchor free工作的添加,单阶段检测/实例分割
v0.6: 合并任务(按本质划分,全图任务,实例任务,串联数据流以及模型构建),规范数据流接口,标准化注释,整体维护代码可读性,面向教学
v0.7: nlp+cv/3d检测/动作识别 新方法的适配
未来的方向
- 面向从业人员,便于吸纳新方法,快速迭代模型以及改进,对工程支持以及对学术进行支持
- 面向初学者,注重任务区分度,简易化代码阅读难度,架构统一,深刻理解工程化实现。
代码可读性体现在哪
- pet lib
- 独立任务训练脚本
- 区分的config,尽量减少复用性关键词
- 少用继承结构
- 保留经典基础方法,减少新方法的魔改
- 数据流只支持coco格式,减少由于适配数据集而带来的冗余代码
难点:
- 有一次版本更新后,整体的训练时间变慢了,然后我就具体分析,现针对最简单的结构faster rcnn,对训练流的三个阶段进行对比,发现主要是数据流那块变慢流,后面的前向以及loss回传都是正常的(加了初始化种子,cudnn.deterministic设置错了)
- 华为的多任务训练(关键点/实例分割/部位检测/部位分割/密集姿态预测),理清楚每个任务的数据流和模型构建逻辑,当时loss不收敛,训不起来,离线在线并集数据流
- Anchor free高精度检测器的设计,需要都移植一遍,对比看是否有1+1=2的效果,精度对齐,细节上(比如初始化,激活函数的特殊设计,loss截断梯度回传,+0.5对齐)