原创:赵明明
做目标检测的同学应该已经接触过或者正要接触MMDetection,当你接触到MMDeteciton的时候,你会发现,它的代码有点奇怪:它不写train函数,不写eval函数,反而配置了一个runner,把训练过程配置到runner中,运行runner,就是运行train/eval函数.如下:
图1 配置runner完成训练过程
上图第84行,就是对runner的运行。在运行之前的第62行,第78行,分别将模型model,优化器optimizer,日志logger,学习率调整策略配置入runner内。配置好后,运行runner就可以i实现模型的训练了。
为什么要使用runner?
我认为最大的特点就是:方便了算法研究,同学们可以少花一点时间在写代码上,把更多的精力花在模型的设计上。runner里面集成了图像和视频处理,图像和标注结果的可视化,对训练过程记时统计,以及高质量的常见的GPU算子等,也集成了多种CNN网络机构,基本上常用的网络结构都已经集成在这个模型里了。
由于mmcv的便利性,基于mmcv的开发已经支持了CV各个领域的开源项目:
- 有MMClassification,图像分类工具箱;
- MMDetection图像检测工具箱;
- MMDetection3D新一代通用3D目标检测平台,
- 以及MMSegmentation图像分割工具箱。
- 除了经典的视觉任务,还实现了视频理解工具箱MMAction2,
- 目标感知平台MMTracking,
- 姿态估计工具箱MMPose,
- 文字检测工具箱MMOCR,
- 图像视频编辑工具箱MMEditing等一些常见的应用场景
- 最后,也有部署方面的模型压缩工具箱MMRazor,模型部署框架MMDeploy.
为何mmcv可以支持开发从模型设计,到模型应用,再到模型部署这样全方位的工具箱?
原因有很多,其中配置型的runner功不可没。
下面咱们就了解下runner的思路
runner通过配置信息构建了训练工作流,测试工作流。比如设置 workflow=[(‘train’,200),(‘val’,1)],表示循环的训练200个epoch,然后验证1个epoch.
构建逻辑如下:
while curr_epoch < max_epochs:
# 遍历用户设置的工作流,例如 workflow = [('train', 200),('val', 1)]
for i, flow in enumerate(workflow):
# mode 是工作流函数,例如 train, epochs 是