MMCV 全新升级,新增超全数据变换功能,还有两大变化

MMCV

在上一篇文章中,我们带大家了解了新一代训练架构 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)

字段映射包装(KeyMapper)用于对数据字典中的字段进行映射。例如,一般的图像处理变换都从数据字典中的 "img" 字段获得值。但有些时候,我们希望这些变换处理数据字典中其他字段的图像,比如 "gt_img" 字段。

以下图为例,RandomFlip 要求输入的字典中包含 img 字段,但是用户的输入只包含了 gt_img 字段,这种情况下我们可以使用字段映射包装,将 gt_img 字段映射为 img 字段,在 RandomFlip 完成处理后再将 img 映射回 gt_img。

在这里插入图片描述

利用字段映射包装,我们在实现数据变换类时,不需要在 transform 方法中考虑各种可能的输入字段名,只需要处理默认的字段即可。

  • 随机选择(RandomChoice)

随机选择包装(RandomChoice)用于从一系列数据变换组合中随机应用一个数据变换组合。利用这一包装,我们可以简单地实现一些数据增强功能,比如 AutoAugment。

以下图为例,有两组 transform,其中有 40% 的概率选择第一组,60% 的概率选择第二组。

在这里插入图片描述

算子

MMCV2.x 中依然提供了丰富的算子,目前一共提供了 55 个算子。提供的算子覆盖多个领域,包括但不限于目标检测、语义分割、文字识别。此外,提供的算法支持数种芯片,包括 NVIDIA、苹果 M1、寒武纪、中科曙光,如下图所示。

在这里插入图片描述

我们简单总结一下 MMEngine 和 MMCV 的使用场景。

MMEngine 主要包含了训练相关的组件,例如 Runner、Hook、Parallel,而 MMCV 主要包含数据处理相关的组件以及丰富的视觉任务算子。

如果想要构建一个训练模型项目,您可以只基于 MMEngine 构建,但由于 MMCV 包含了开箱即用的数据处理模块和算子,使用它可以提升您构建训练模型项目的效率。

使用 MIM 快速安装

我们曾做过一份问卷调查,其中的一个问题是“你使用 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 需要四步:

  • 安装 MMCV
  • 安装 MMClassification 和 MMDetection
  • 拉取 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 有两个额外的功能:

  • 自动为 MMCV 寻找合适的预编译包
  • 自动处理算法库之间的依赖关系

下面几行命令展示如何使用 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
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值