☰
MMCV 入门指南:OpenMMLab 计算机视觉基础库功能全景与快速上手
2026/10/4 1:48:13 网站建设 项目流程
  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】mmcv

OpenMMLab Computer Vision Foundation

项目地址:https://gitcode.com/gh_mirrors/mm/mmcv
点击查看免费下载

MMCV 是 OpenMMLab 系列算法库(MMDetection、MMSegmentation、MMPose、MMAction2 等)共同依赖的计算机视觉基础库,为上层算法库统一提供图像/视频处理、结果可视化、数据变换、CNN 网络构件与高性能算子的底层能力。读完本文,你将系统掌握 MMCV 的模块划分与核心 API 用法,理解它是如何支撑整个 OpenMMLab 生态的,并知道在哪些场景下可以直接复用这些开箱即用的能力。

MMCV 是什么:基础库的定位与核心功能

MMCV 的定位是"面向计算机视觉研究的基础库"。从 官方中文介绍 看,它把视觉研究中最通用、最高频的能力沉淀为五大功能模块:

  • 图像和视频处理:读写、缩放、旋转、翻转、裁剪、填充图像,读取/编辑视频,处理光流;
  • 图像和标注结果可视化:展示图像、标注框、光流等特殊图像;
  • 图像变换(数据变换):以可组合的数据变换类构成数据流水线,供各算法库的数据集使用;
  • 多种 CNN 网络结构:提供网络层的构建方法、常用模块组件与经典网络骨架;
  • 高质量实现的常见 CUDA 算子:检测、分割等任务中常用的高性能算子。

从顶层 mmcv/init.py 可以看到,这些能力对应仓库中的arraymisc、image、transforms、video、visualization等子包;而cnn与ops则按需在 PyTorch 环境下导入使用。这种"基础功能不依赖 PyTorch 也可使用"的设计,让 MMCV 既能服务于深度学习算法库,也能独立用于纯图像处理任务。

支持的平台与安装方式概览

根据官方介绍,MMCV 支持 Linux、Windows、macOS 三大主流平台。安装方面,MMCV 提供两个版本:

  • mmcv(完整版):包含所有特性以及丰富的开箱即用的 CPU 和 CUDA 算子,但完整版编译时间较长;
  • mmcv-lite(精简版):不包含 CPU 和 CUDA 算子,但包含其余所有特性和功能,类似 MMCV 1.0 之前的版本,适合不需要使用算子的场景。

官方明确警告不要在同一个环境中安装两个版本,否则可能遇到类似ModuleNotFound的错误;在安装一个版本之前需要先卸载另一个。详细的分步安装指引(使用mim install mmcv或pip install mmcv==版本 -f ...指定 CUDA/PyTorch 组合、Docker 镜像构建、安装后运行check_installation.py脚本验证等)参见 安装 MMCV。

图像与视频处理:mmcv.image与mmcv.video

图像处理模块依赖 OpenCV,相关实现集中在 mmcv/image 目录,常用函数通过 mmcv/image/init.py 导出。

读取 / 保存 / 显示

import mmcv img = mmcv.imread('test.jpg') img = mmcv.imread('test.jpg', flag='grayscale') img_ = mmcv.imread(img) # 相当于什么也没做(输入已是数组时直接返回) mmcv.imwrite(img, 'out.jpg')

也可以从二进制数据读取图像,或直接显示图像文件/已读取的图像数组:

with open('test.jpg', 'rb') as f: data = f.read() img = mmcv.imfrombytes(data) mmcv.imshow('tests/data/color.jpg') for i in range(10): img = np.random.randint(256, size=(100, 100, 3), dtype=np.uint8) mmcv.imshow(img, win_name='test image', wait_time=200)

此外mmcv.image.io还提供了supported_backends与use_backend,支持在cv2、turbojpeg等后端间切换,以适应不同环境下的解码需求。

色彩空间转换

mmcv.image.colorspace提供了一组纯函数式转换接口,覆盖 BGR/Gray/RGB/HSV 等常用空间:

img = mmcv.imread('tests/data/color.jpg') img1 = mmcv.bgr2rgb(img) img2 = mmcv.rgb2gray(img1) img3 = mmcv.bgr2hsv(img)

除了文档列出的bgr2gray、gray2bgr、bgr2rgb、rgb2bgr、bgr2hsv、hsv2bgr,从源码看还额外提供了bgr2hls、bgr2ycbcr、rgb2ycbcr等转换,足以覆盖大多数预处理需求。

几何变换:缩放、旋转、翻转、裁剪、填充

缩放。所有以imresize_*开头的函数都有return_scale参数:为False时只返回调整后的图像,为True时返回元组(resized_img, scale)。

# 缩放图像至给定的尺寸 mmcv.imresize(img, (1000, 600), return_scale=True) # 缩放图像至与给定图像同样的尺寸 mmcv.imresize_like(img, dst_img, return_scale=False) # 以一定的比例缩放图像 mmcv.imrescale(img, 0.5) # 缩放图像至最长边不大于1000、最短边不大于800且保持长宽比 mmcv.imrescale(img, (1000, 800))

旋转。imrotate默认以图像中心为旋转中心;有两种模式:保持原尺寸(旋转后部分区域被裁剪)或扩大尺寸保留完整图像(auto_bound=True):

img = mmcv.imread('tests/data/color.jpg') # 顺时针旋转30度 img_ = mmcv.imrotate(img, 30) # 逆时针旋转90度 img_ = mmcv.imrotate(img, -90) # 顺时针旋转30度并缩放为原始图像的1.5倍 img_ = mmcv.imrotate(img, 30, scale=1.5) # 以坐标(100, 100)为中心顺时针旋转30度 img_ = mmcv.imrotate(img, 30, center=(100, 100)) # 顺时针旋转30度并扩大图像尺寸以保留完整图像 img_ = mmcv.imrotate(img, 30, auto_bound=True)

翻转。

# 水平翻转 mmcv.imflip(img) # 垂直翻转 mmcv.imflip(img, direction='vertical')

裁剪。imcrop支持同时裁剪一个或多个区域,区域用 (x1, y1, x2, y2) 表示:

import mmcv import numpy as np img = mmcv.imread('tests/data/color.jpg') # 裁剪单个区域 (10, 10, 100, 120) bboxes = np.array([10, 10, 100, 120]) patch = mmcv.imcrop(img, bboxes) # 同时裁剪两个区域 bboxes = np.array([[10, 10, 100, 120], [0, 0, 50, 50]]) patches = mmcv.imcrop(img, bboxes) # 裁剪两个区域并缩放1.2倍 patches = mmcv.imcrop(img, bboxes, scale=1.2)

填充。impad与impad_to_multiple用给定值把图像填充到指定尺寸或指定倍数:

# 用给定值将图像填充至 (1000, 1200),单值作用于所有通道 img_ = mmcv.impad(img, shape=(1000, 1200), pad_val=0) # 分别指定3个通道的填充值 img_ = mmcv.impad(img, shape=(1000, 1200), pad_val=(100, 50, 200)) # 分别填充左、右、上、下四条边 img_ = mmcv.impad(img, padding=(10, 20, 30, 40), pad_val=0) # 四条边的3个通道分别填充 img_ = mmcv.impad(img, padding=(10, 20, 30, 40), pad_val=(100, 50, 200)) # 将图像四条边填充至能够被32整除 img_ = mmcv.impad_to_multiple(img, 32)

视频处理与光流

视频相关能力集中在 mmcv/video 目录,提供VideoReader、视频编辑函数与光流读写三部分:

  • VideoReader:提供类似序列的接口获取视频帧,并缓存所有访问过的帧:
video = mmcv.VideoReader('test.mp4') # 基本属性 print(len(video)) print(video.width, video.height, video.resolution, video.fps) # 遍历所有帧 / 读取下一帧 / 按索引取帧 / 按范围取帧 for frame in video: print(frame.shape) img = video.read() img = video[100] img = video[5:10]

配合cvt2frames/frames2video可以在视频与帧目录之间互相转换:

video = mmcv.VideoReader('test.mp4') video.cvt2frames('out_dir') mmcv.frames2video('out_dir', 'test.avi')
  • 编辑函数:cut_video、concat_video、resize_video是对ffmpeg的封装:
mmcv.cut_video('test.mp4', 'clip1.mp4', start=3, end=10, vcodec='h264') mmcv.concat_video(['clip1.mp4', 'clip2.mp4'], 'joined.mp4', log_level='quiet') mmcv.resize_video('test.mp4', 'resized1.mp4', (360, 240)) mmcv.resize_video('test.mp4', 'resized2.mp4', ratio=2)
  • 光流处理:flowread/flowwrite支持两种存储方式——非压缩方法直接将浮点光流写入.flo二进制文件(无损但体积大);压缩方法先量化到 0-255 再存为 JPEG(x、y 两个维度拼接到图像中,体积小)。示例:
flow = np.random.rand(800, 600, 2).astype(np.float32) # 保存光流到 flo 文件 mmcv.flowwrite(flow, 'uncompressed.flo') # 保存光流为 jpeg 图像(concat_axis=1 表示按水平方向拼接 x/y 分量) mmcv.flowwrite(flow, 'compressed.jpg', quantize=True, concat_axis=1) # 读取光流,两种方式读出的尺寸均为 (800, 600, 2) flow = mmcv.flowread('uncompressed.flo') flow = mmcv.flowread('compressed.jpg', quantize=True, concat_axis=1)

光流还可以用flowshow可视化,以及用flow_warp按光流对图像进行变换:

img1 = mmcv.imread('img1.jpg') flow = mmcv.flowread('flow.flo') warped_img2 = mmcv.flow_warp(img1, flow)

上图为光流可视化示意(来源:数据处理);mmcv.video.optflow中还提供quantize_flow/dequantize_flow、flow_from_bytes、sparse_flow_from_bytes等底层工具函数,支持流数据的量化往返与字节流加载。

图像与标注可视化:mmcv.visualization

可视化模块位于 mmcv/visualization,通过 mmcv/visualization/init.py 导出imshow、imshow_bboxes、imshow_det_bboxes、flowshow等接口。官方介绍明确其当前支持展示图像以及标注框:

# 展示图像文件 mmcv.imshow('a.jpg') # 展示已加载的图像 img = np.random.rand(100, 100, 3) mmcv.imshow(img) # 展示带有标注框的图像 img = np.random.rand(100, 100, 3) bboxes = np.array([[0, 0, 50, 50], [20, 20, 60, 60]]) mmcv.imshow_bboxes(img, bboxes)

同时支持展示光流这类特殊图像:

flow = mmcv.flowread('test.flo') mmcv.flowshow(flow)

对于检测类任务,imshow_det_bboxes还支持传入类别标签与分数、设置颜色与置信度阈值、按show/out_file控制显示或落盘,是调试检测模型输出的常用工具。相关设计细节可参考 可视化。

数据变换体系:mmcv.transforms

在 OpenMMLab 算法库中,数据集构建与数据准备相互解耦:数据集只负责解析并记录样本基本信息,数据的加载、预处理与格式化由一系列数据变换(transform)完成。这一体系在 数据变换 中有完整设计说明,其实现位于 mmcv/transforms。

设计约定:字典进、字典出

所有数据变换类都继承统一的基类BaseTransform(见 mmcv/transforms/base.py),约定输入输出均为一个数据字典;变换可能读取、新增或更新字典中的字段。示例:

>>> import numpy as np >>> from mmcv.transforms import Resize >>> >>> transform = Resize(scale=(224, 224)) >>> data_dict = {'img': np.random.rand(256, 256, 3)} >>> data_dict = transform(data_dict) >>> print(data_dict['img'].shape) (224, 224, 3)

一个需要注意的约定:在需要图像尺寸作为初始化参数的变换(如Resize、Pad)中,尺寸顺序为 (width, height);而在变换返回的字典中,img_shape、ori_shape、pad_shape等字段均为 (height, width)。

数据流水线(pipeline)

由于所有变换都是"字典进、字典出",可以首尾相接组成数据流水线。在配置文件中,pipeline 是一个由变换配置字典组成的列表,每个数据集通过pipeline参数定义数据准备操作。以分类任务为例:

pipeline = [ dict(type='LoadImageFromFile'), dict(type='Resize', size=256, keep_ratio=True), dict(type='CenterCrop', crop_size=224), dict(type='Normalize', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375]), dict(type='ClsFormatBundle') ] dataset = dict( ... pipeline=pipeline, ... )

常用数据变换类

从 mmcv/transforms/init.py 可以看到仓库实际提供的类,按功能可分为三类:

类别常用类功能
数据加载LoadImageFromFile、LoadAnnotations根据路径加载图像;加载并组织 bbox、语义分割图等标注
预处理与增强Resize、RandomResize、RandomChoiceResize、CenterCrop、Pad、Normalize、RandomFlip、RandomGrayscale、MultiScaleFlipAug、TestTimeAug缩放、裁剪、填充、归一化、翻转、灰度化及测试时增强
数据格式化ToTensor、ImageToTensor(需 PyTorch 环境,从 mmcv/transforms/formatting.py 导入)将数据/图像转换为torch.Tensor

自定义数据变换类

实现新变换只需继承BaseTransform并实现transform方法,再用@TRANSFORMS.register_module()注册即可在配置文件中使用:

import random import mmcv from mmcv.transforms import BaseTransform, TRANSFORMS @TRANSFORMS.register_module() class MyFlip(BaseTransform): def __init__(self, direction: str): super().__init__() self.direction = direction def transform(self, results: dict) -> dict: img = results['img'] results['img'] = mmcv.imflip(img, direction=self.direction) return results

注册后即可在 pipeline 中这样使用:

pipeline = [ ... dict(type='MyFlip', direction='horizontal'), ... ]

注意:如需在配置文件中使用,需保证MyFlip类所在的文件在运行时能被导入。

变换包装:字段映射、随机组合与多目标扩展

变换包装(wrapper)本身不操作图像/标签,而是增强被包裹变换的行为,相关类见 mmcv/transforms/wrappers.py:

  • KeyMapper(字段映射):把"img"等默认字段映射到其他字段(如"gt_img"),使复用已有变换时无需关心输入字段名,配合auto_remap可在变换完成后自动写回原字段;
  • RandomChoice / RandomApply(随机选择与随机执行):前者以给定概率从多组变换组合中随机选用一组(可用来实现 AutoAugment 式增强),后者以指定概率决定是否执行某组变换;
  • TransformBroadcaster(多目标扩展):将同一变换同时作用于多个字段(如超分任务中的"lq"与"gt"),或作用于某个字段下的目标列表,并可通过share_random_params=True在多个目标间共享随机变量,保证变换同步一致。

要支持随机变量共享,自定义类中可用cache_randomness装饰器标注"输出可共享随机变量"的方法;若第三方库把随机逻辑封装在内部无法抽出,则用avoid_cache_randomness装饰类,此时若被TransformBroadcaster以share_random_params=True包装会抛出异常,从而避免误用。

多种 CNN 网络结构:mmcv.cnn

MMCV 为卷积神经网络提供层构建、模块组件和经典网络骨架,核心代码在 mmcv/cnn,通过 mmcv/cnn/init.py 导出。其设计目标是:同一种类型、不同配置的层无需改代码,通过配置字典即可构建。

网络层的构建

from mmcv.cnn import build_conv_layer cfg = dict(type='Conv3d') layer = build_conv_layer(cfg, in_channels=3, out_channels=8, kernel_size=3)

各构建方法支持的类型如下:

  • build_conv_layer:Conv1d、Conv2d、Conv3d、Conv(Conv 是 Conv2d 的别名);
  • build_norm_layer:BN1d、BN2d、BN3d、BN(BN2d 别名)、SyncBN、GN、LN、IN1d、IN2d、IN3d、IN(IN2d 别名);
  • build_activation_layer:ReLU、LeakyReLU、PReLU、RReLU、ReLU6、ELU、Sigmoid、Tanh、GELU;
  • build_upsample_layer:nearest、bilinear、deconv、pixel_shuffle;
  • build_padding_layer:zero、reflect、replicate。

扩展:构建方法基于注册器实现,可注册自定义模块后直接用配置引用:

from mmengine.registry import MODELS @MODELS.register_module() class MyUpsample: def __init__(self, scale_factor): pass def forward(self, x): pass
from mmcv.cnn import build_upsample_layer cfg = dict(type='MyUpsample', scale_factor=2) layer = build_upsample_layer(cfg)

常用模块组件

卷积组件ConvModule将 convolution、normalization、activation 三层组合起来,是网络搭建中使用频率极高的积木:

from mmcv.cnn import ConvModule # conv + bn + relu conv = ConvModule(3, 8, 2, norm_cfg=dict(type='BN')) # conv + gn + relu conv = ConvModule(3, 8, 2, norm_cfg=dict(type='GN', num_groups=2)) # conv + relu conv = ConvModule(3, 8, 2) # 仅 conv(关闭激活) conv = ConvModule(3, 8, 2, act_cfg=None) # conv + leaky relu conv = ConvModule(3, 8, 3, padding=1, act_cfg=dict(type='LeakyReLU')) # 调整顺序:bn + conv + relu conv = ConvModule( 3, 8, 2, norm_cfg=dict(type='BN'), order=('norm', 'conv', 'act'))

除ConvModule外,mmcv/cnn/bricks 还提供了NonLocal1d/2d/3d、ContextBlock、GeneralizedAttention、HSwish/HSigmoid/Swish、Scale、DepthwiseSeparableConvModule、ConvWS2d/ConvAWS2d等模块组件;mmcv/cnn/resnet.py、mmcv/cnn/vgg.py、mmcv/cnn/alexnet.py 提供经典网络骨架;mmcv/cnn/utils 提供fuse_conv_bn、get_model_complexity_info等实用工具。完整讲解参见 卷积神经网络。

高质量实现的常见算子:mmcv.ops

MMCV 为检测、分割等任务提供了大量常用算子,并针对 CPU、CUDA、MLU、MPS、Ascend 等设备做了多后端实现(见 算子 中的设备支持矩阵)。核心 Python 封装位于 mmcv/ops,C++/CUDA 等底层实现分散在 mmcv/ops/csrc 的pytorch、parrots等目录中。

设备支持矩阵(节选,完整见 docs/zh_cn/understand_mmcv/ops.md):

算子CPUCUDAMLUMPSAscend
BBoxOverlaps√√√√
BoxIouRotated√√√√
CARAFE√√
Deformable Convolution v1/v2√√√√
ModulatedDeformConv2d√√√√
MultiScaleDeformableAttn√√√
NMS / NMSRotated√√√√
RoIAlign / RoIAlignRotated√√√√
Sparse Convolution√√
Voxelization√√√√

以最常用的nms为例,其 Python 入口见 mmcv/ops/nms.py,CUDA kernel 见 mmcv/ops/csrc/common/cuda/nms_cuda_kernel.cuh;类似的算子还有 RoIAlign、Deformable Conv、PSAMask、CornerPool、Voxelization、Sparse Convolution 等 60 余个(详见 mmcv/ops 目录)。这些算子提供开箱即用的 CPU/CUDA 实现,配合完整版 mmcv 的预编译包即可直接使用,无需自己手写 CUDA 扩展。

MMCV 支撑的 OpenMMLab 项目生态

MMCV 是整个 OpenMMLab 生态的公共底座,官方介绍列出的上层算法库覆盖了视觉领域几乎全部分支:

  • 图像分类:MMClassification 图像分类工具箱;
  • 目标检测:MMDetection 目标检测工具箱、MMYOLO YOLO 系列工具箱与基准;
  • 3D 感知:MMDetection3D 通用 3D 目标检测平台、MMRotate 旋转框检测工具箱与基准;
  • 分割与文字:MMSegmentation 语义分割工具箱、MMOCR 全流程文字检测识别理解工具箱;
  • 人体与视频:MMPose 姿态估计工具箱、MMHuman3D 人体参数化模型工具箱与基准、MMAction2 视频理解工具箱、MMTracking 一体化视频目标感知平台;
  • 生成与编辑:MMEditing 图像视频编辑工具箱、MMGeneration 图片视频生成模型工具箱、MMFlow 光流估计工具箱与基准;
  • 学习范式与工程化:MMSelfSup 自监督学习工具箱、MMRazor 模型压缩工具箱、MMFewShot 少样本学习工具箱、MMDeploy 模型部署框架。

这些项目共享 MMCV 提供的图像处理、数据变换、CNN 构件与算子能力;而当上层算法库升级到 MMEngine 体系时,MMCV 2.x 中与训练/推理框架相关的模块(如runner、parallel、engine、device以及utils中的大部分类)已迁移至 MMEngine,具体接口对应关系可查阅 接口对照表。对刚接触 OpenMMLab 生态的开发者来说,理解"MMCV 提供底层能力、MMEngine 提供训练框架、上层算法库聚焦具体任务"这一分层关系,是快速上手整套生态的关键。

结语

MMCV 的核心价值在于"一次实现、处处复用":图像/视频处理、可视化、数据变换、CNN 构件和高性能算子这五大能力,既可以被上层算法库直接消费,也可以独立用于日常的视觉数据工程。建议下一步按 安装 MMCV 完成环境搭建,再结合本文给出的代码示例逐一实践,并深入阅读 数据处理、数据变换、卷积神经网络 与 算子 四篇进阶文档,即可全面掌握这个基础库的用法。

  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】mmcv

OpenMMLab Computer Vision Foundation

项目地址:https://gitcode.com/gh_mirrors/mm/mmcv
点击查看免费下载

相关推荐

上一篇:Shader Park Core CLI命令详解:快速生成ThreeJS、离线渲染和原始SDF文件的终极指南
下一篇:5分钟掌握FunASR:零配置Docker部署语音识别服务终极指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询