在上一篇文章中,我们带大家了解了新一代训练架构 MMEngine ,既然 Runner、Hook 这些核心组件都在 MMEngine 里实现了,那 MMCV 还有啥嘞?架构升级后,我们还能用 MMCV 做哪些事情?今天我们就来为大家一一揭晓。
在 MMCV2.x 中有两大变化:一个是模块的增删,另一个是包名的变更。
MMCV1.x 中主要包含 Runner、Hook、Parallel、Registry、Config、FileIO、Image/Video、CNN 和 OPS 组件。
而在 MMCV2.x 中,我们将和训练流程相关的组件删除,这些组件会由 MMEngine 提供(MMEngine 对这些组件进行了重新设计),只保留图像视频处理、网络基础模块和算子。除此之外,还新增了数据预处理模块(Transform)。
另一个变化是包名的变更。在 MMCV1.x 中,它有两个包名 mmcv-full 和 mmcv,前者比后者多包含了 CUDA 算子。
包名的变更主要有两点原因:一是有些用户可能会混淆 mmcv-full 和 mmcv 的关系并安装了错误的包,例如原本希望安装 mmcv-full 却安装了 mmcv,导致出现意想不到的问题;二是我们观察到绝大多数的用户都会安装 mmcv-full,而仓库名却叫 mmcv,这样的不一致会给用户带来不便。
因此,在 MMCV2.x 中,我们决定将 mmcv-full 重命名为 mmcv,将 mmcv 重名为 mmcv-lite。
下面表格是包对应的版本上下限。
包名 | <2.0 | >=2.0 |
---|---|---|
mmcv-full | 包含 CUDA 算子 | 无 |
mmcv | 不包含 CUDA 算子 | 包含 CUDA 算子 |
mmcv-lite | 无 | 不包含 CUDA 算子 |
介绍完了 MMCV2.x 的变化,我们接下来介绍在 2.x 中新增的数据预处理模块。
在 OpenMMLab 算法库中,数据集的构建和数据的准备是相互解耦的。通常,数据集的构建只对数据集进行解析,记录每个样本的基本信息;而数据的准备则是通过一系列的数据变换,根据样本的基本信息进行数据加载、预处理、格式化等操作。
按照功能,常用的数据变换类可以大致分为数据加载、数据预处理与增强、数据格式化。在 MMCV 中,我们提供了如下常用的数据变换类:
为了支持大规模数据集的加载,通常在 Dataset
初始化时不加载数据,只加载相应的路径。因此需要在数据流水线中进行具体数据的加载。
数据变换类 | 功能 |
---|---|
LoadImageFromFile | 根据路径加载图像 |
LoadAnnotations | 加载和组织标注信息,如 bbox、语义分割图等 |
数据预处理和增强通常是对图像本身进行变换,如裁剪、填充、缩放等。
数据变换类 | 功能 |
---|---|
Pad | 填充图像边缘 |
CenterCrop | 居中裁剪 |
Normalize | 对图像进行归一化 |
Resize | 按照指定尺寸或比例缩放图像 |
RandomResize | 缩放图像至指定范围的随机尺寸 |
RandomMultiscaleResize | 缩放图像至多个尺寸中的随机一个尺寸 |
RandomGrayscale | 随机灰度化 |
RandomFlip | 图像随机翻转 |
MultiScaleFlipAug | 支持缩放和翻转的测试时数据增强 |
数据格式化操作通常是对数据进行的类型转换。
数据变换类 | 功能 |
---|---|
ToTensor | 将指定的数据转换为 torch.Tensor |
ImageToTensor | 将图像转换为 torch.Tensor |
由于数据变换的输入输出都是字典,我们可以将所有的数据变换操作首尾相接,组合成为一条数据流水线(data pipeline) ,输入数据集样本的信息字典,输出完成一系列处理后的信息字典。
以分类任务为例,我们在下图展示了一个典型的数据流水线。对每个样本,数据集中保存的基本信息是一个如图中最左侧所示的字典,之后每经过一个由蓝色块代表的数据变换操作,数据字典中都会加入新的字段(标记为绿色)或更新现有的字段(标记为橙色)。
除了常用的数据变换类和数据流水线,数据变换模块还提供了四个特殊的数据变换类,它们本身并不操作数据字典中的图像、标签等信息,而是对其中定义的数据变换的行为进行增强。
它们分别是字段映射(KeyMapper)、随机选择(RandomChoice)、随机执行(RandomApply)和多目标扩展(TransformBroadcaster)。下面简单介绍字段映射变换和随机选择这两个特殊的数据变换类。
字段映射包装(KeyMapper
)用于对数据字典中的字段进行映射。例如,一般的图像处理变换都从数据字典中的 "img"
字段获得值。但有些时候,我们希望这些变换处理数据字典中其他字段的图像,比如 "gt_img"
字段。
以下图为例,RandomFlip 要求输入的字典中包含 img 字段,但是用户的输入只包含了 gt_img 字段,这种情况下我们可以使用字段映射包装,将 gt_img 字段映射为 img 字段,在 RandomFlip 完成处理后再将 img 映射回 gt_img。
利用字段映射包装,我们在实现数据变换类时,不需要在 transform
方法中考虑各种可能的输入字段名,只需要处理默认的字段即可。
随机选择包装(RandomChoice
)用于从一系列数据变换组合中随机应用一个数据变换组合。利用这一包装,我们可以简单地实现一些数据增强功能,比如 AutoAugment。
以下图为例,有两组 transform,其中有 40% 的概率选择第一组,60% 的概率选择第二组。
MMCV2.x 中依然提供了丰富的算子,目前一共提供了 55 个算子。提供的算子覆盖多个领域,包括但不限于目标检测、语义分割、文字识别。此外,提供的算法支持数种芯片,包括 NVIDIA、苹果 M1、寒武纪、中科曙光,如下图所示。
我们简单总结一下 MMEngine 和 MMCV 的使用场景。
MMEngine 主要包含了训练相关的组件,例如 Runner、Hook、Parallel,而 MMCV 主要包含数据处理相关的组件以及丰富的视觉任务算子。
如果想要构建一个训练模型项目,您可以只基于 MMEngine 构建,但由于 MMCV 包含了开箱即用的数据处理模块和算子,使用它可以提升您构建训练模型项目的效率。
我们曾做过一份问卷调查,其中的一个问题是“你使用 OpenMMLab 项目遇到的最大困难是什么”,绝大多数的社区用户给出的回答都是安装问题。安装问题主要是两个,一个是 MMCV 的安装,另一个是下游算法库的安装。
首先介绍安装 MMCV 为什么会有困难。我们知道,MMCV 包含两个版本,一个是 mmcv,一个是 mmcv-lite,前者包含所有的特性以及丰富的开箱即用的 CUDA 算子,后者不包含 CUDA 算子但包含其余所有特性和功能。由于编译 CUDA 算子耗时较长且容易出错,我们提供了 Linux 平台和 Windows 平台的全量预编译包。用户可以通过以下命令使用预编译包安装 mmcv,这非常方便。
pip install 'mmcv>=2.0.0rc0' -f https://download.openmmlab.com/mmcv/dist/{cu_version}/{torch_version}/index.html
但是这条命令有个小问题,它不仅冗长,还需要用户手动获取 PyTorch 和 CUDA 的版本并更换命令的对应项。
下图是 MMCV issue 关于安装问题的截图,可见安装问题是 MMCV 的用户经常遇到的问题(即使提供了预编译包)。
接下来介绍下游库的安装为什么也会有困难。下游算法库不仅需要依赖 MMCV,有些算法库还需要依赖其他的下游算法库。以 MMTracking 为例,正确安装 MMTracking 需要四步:
以上过程不仅繁琐,且可能会出现依赖冲突的问题,例如 MMClassification 和 MMDetection 对 MMCV 或者第三方库的版本不存在交集,这样就会出现依赖冲突导致安装失败。
为了解决以上的安装问题,我们去年推出了 MIM,它的推出使得安装 OpenMMLab 项目变得异常简单。在介绍 MIM 是如何解决(或简化)安装问题之前,我们先介绍一下 MIM 的三类功能。
包含 install、uninstall 和 list 命令。install 命令用于安装包,uninstall 用于卸载包,list 用于展示已安装的包。
包含 search 和 download 命令。search 命令用于从算法库中搜索符合条件(例如 fps 大于 50)的模型,download 命令用于下载某一个名称对应的配置文件和模型权重。
包含 train、test、gridsearch 和 run 命令。train 命令用于启动训练,test 命令用于启动测试,gridsearch 命令用于启动超参数搜索训练,run 命令用于运行脚本。
介绍完 MIM 的功能,我们回到上面的问题,MIM 是如何解决上面提到的两个安装问题。我们可以使用 MIM 的 install 命令去安装 MMCV 或者下游算法库,install 命令的使用方式和 pip install 完全一致,但相比 pip install 有两个额外的功能:
下面几行命令展示如何使用 MIM 安装 MMCV 和 MMTracking:
# 安装 openmim
pip install openmim
# 安装 mmcv
pip install 'mmcv>=2.0.0rc0'
# 安装 mmtracking
git clone https://github.com/open-mmlab/mmtracking.git
cd mmtracking
mim install -e . -v