ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MMCV 入门指南:OpenMMLab 计算机视觉基础库功能全景与快速上手

MMCV 入门指南:OpenMMLab 计算机视觉基础库功能全景与快速上手 人工智能计算机视觉深度学习【免费下载链接】mmcvOpenMMLab 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, flaggrayscale) 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), dtypenp.uint8) mmcv.imshow(img, win_nametest image, wait_time200)此外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_scaleTrue) # 缩放图像至与给定图像同样的尺寸 mmcv.imresize_like(img, dst_img, return_scaleFalse) # 以一定的比例缩放图像 mmcv.imrescale(img, 0.5) # 缩放图像至最长边不大于1000、最短边不大于800且保持长宽比 mmcv.imrescale(img, (1000, 800))旋转。imrotate默认以图像中心为旋转中心有两种模式保持原尺寸旋转后部分区域被裁剪或扩大尺寸保留完整图像auto_boundTrueimg 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, scale1.5) # 以坐标(100, 100)为中心顺时针旋转30度 img_ mmcv.imrotate(img, 30, center(100, 100)) # 顺时针旋转30度并扩大图像尺寸以保留完整图像 img_ mmcv.imrotate(img, 30, auto_boundTrue)翻转。# 水平翻转 mmcv.imflip(img) # 垂直翻转 mmcv.imflip(img, directionvertical)裁剪。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, scale1.2)填充。impad与impad_to_multiple用给定值把图像填充到指定尺寸或指定倍数# 用给定值将图像填充至 (1000, 1200)单值作用于所有通道 img_ mmcv.impad(img, shape(1000, 1200), pad_val0) # 分别指定3个通道的填充值 img_ mmcv.impad(img, shape(1000, 1200), pad_val(100, 50, 200)) # 分别填充左、右、上、下四条边 img_ mmcv.impad(img, padding(10, 20, 30, 40), pad_val0) # 四条边的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, start3, end10, vcodech264) mmcv.concat_video([clip1.mp4, clip2.mp4], joined.mp4, log_levelquiet) mmcv.resize_video(test.mp4, resized1.mp4, (360, 240)) mmcv.resize_video(test.mp4, resized2.mp4, ratio2)光流处理flowread/flowwrite支持两种存储方式——非压缩方法直接将浮点光流写入.flo二进制文件无损但体积大压缩方法先量化到 0-255 再存为 JPEGx、y 两个维度拼接到图像中体积小。示例flow np.random.rand(800, 600, 2).astype(np.float32) # 保存光流到 flo 文件 mmcv.flowwrite(flow, uncompressed.flo) # 保存光流为 jpeg 图像concat_axis1 表示按水平方向拼接 x/y 分量 mmcv.flowwrite(flow, compressed.jpg, quantizeTrue, concat_axis1) # 读取光流两种方式读出的尺寸均为 (800, 600, 2) flow mmcv.flowread(uncompressed.flo) flow mmcv.flowread(compressed.jpg, quantizeTrue, concat_axis1)光流还可以用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(typeLoadImageFromFile), dict(typeResize, size256, keep_ratioTrue), dict(typeCenterCrop, crop_size224), dict(typeNormalize, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375]), dict(typeClsFormatBundle) ] dataset dict( ... pipelinepipeline, ... )常用数据变换类从 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, directionself.direction) return results注册后即可在 pipeline 中这样使用pipeline [ ... dict(typeMyFlip, directionhorizontal), ... ]注意如需在配置文件中使用需保证MyFlip类所在的文件在运行时能被导入。变换包装字段映射、随机组合与多目标扩展变换包装wrapper本身不操作图像/标签而是增强被包裹变换的行为相关类见 mmcv/transforms/wrappers.pyKeyMapper字段映射把img等默认字段映射到其他字段如gt_img使复用已有变换时无需关心输入字段名配合auto_remap可在变换完成后自动写回原字段RandomChoice / RandomApply随机选择与随机执行前者以给定概率从多组变换组合中随机选用一组可用来实现 AutoAugment 式增强后者以指定概率决定是否执行某组变换TransformBroadcaster多目标扩展将同一变换同时作用于多个字段如超分任务中的lq与gt或作用于某个字段下的目标列表并可通过share_random_paramsTrue在多个目标间共享随机变量保证变换同步一致。要支持随机变量共享自定义类中可用cache_randomness装饰器标注输出可共享随机变量的方法若第三方库把随机逻辑封装在内部无法抽出则用avoid_cache_randomness装饰类此时若被TransformBroadcaster以share_random_paramsTrue包装会抛出异常从而避免误用。多种 CNN 网络结构mmcv.cnnMMCV 为卷积神经网络提供层构建、模块组件和经典网络骨架核心代码在 mmcv/cnn通过 mmcv/cnn/init.py 导出。其设计目标是同一种类型、不同配置的层无需改代码通过配置字典即可构建。网络层的构建from mmcv.cnn import build_conv_layer cfg dict(typeConv3d) layer build_conv_layer(cfg, in_channels3, out_channels8, kernel_size3)各构建方法支持的类型如下build_conv_layerConv1d、Conv2d、Conv3d、ConvConv 是 Conv2d 的别名build_norm_layerBN1d、BN2d、BN3d、BNBN2d 别名、SyncBN、GN、LN、IN1d、IN2d、IN3d、ININ2d 别名build_activation_layerReLU、LeakyReLU、PReLU、RReLU、ReLU6、ELU、Sigmoid、Tanh、GELUbuild_upsample_layernearest、bilinear、deconv、pixel_shufflebuild_padding_layerzero、reflect、replicate。扩展构建方法基于注册器实现可注册自定义模块后直接用配置引用from mmengine.registry import MODELS MODELS.register_module() class MyUpsample: def __init__(self, scale_factor): pass def forward(self, x): passfrom mmcv.cnn import build_upsample_layer cfg dict(typeMyUpsample, scale_factor2) layer build_upsample_layer(cfg)常用模块组件卷积组件ConvModule将 convolution、normalization、activation 三层组合起来是网络搭建中使用频率极高的积木from mmcv.cnn import ConvModule # conv bn relu conv ConvModule(3, 8, 2, norm_cfgdict(typeBN)) # conv gn relu conv ConvModule(3, 8, 2, norm_cfgdict(typeGN, num_groups2)) # conv relu conv ConvModule(3, 8, 2) # 仅 conv关闭激活 conv ConvModule(3, 8, 2, act_cfgNone) # conv leaky relu conv ConvModule(3, 8, 3, padding1, act_cfgdict(typeLeakyReLU)) # 调整顺序bn conv relu conv ConvModule( 3, 8, 2, norm_cfgdict(typeBN), 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.opsMMCV 为检测、分割等任务提供了大量常用算子并针对 CPU、CUDA、MLU、MPS、Ascend 等设备做了多后端实现见 算子 中的设备支持矩阵。核心 Python 封装位于 mmcv/opsC/CUDA 等底层实现分散在 mmcv/ops/csrc 的pytorch、parrots等目录中。设备支持矩阵节选完整见 docs/zh_cn/understand_mmcv/ops.md算子CPUCUDAMLUMPSAscendBBoxOverlaps√√√√BoxIouRotated√√√√CARAFE√√Deformable Convolution v1/v2√√√√ModulatedDeformConv2d√√√√MultiScaleDeformableAttn√√√NMS / NMSRotated√√√√RoIAlign / RoIAlignRotated√√√√Sparse Convolution√√Voxelization√√√√以最常用的nms为例其 Python 入口见 mmcv/ops/nms.pyCUDA 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 完成环境搭建再结合本文给出的代码示例逐一实践并深入阅读 数据处理、数据变换、卷积神经网络 与 算子 四篇进阶文档即可全面掌握这个基础库的用法。赞分享人工智能计算机视觉深度学习【免费下载链接】mmcvOpenMMLab Computer Vision Foundation项目地址https://gitcode.com/gh_mirrors/mm/mmcv点击查看免费下载相关推荐SQLFluff-rs 核心类型库解读sqlfluffrs_types 的表驱动语法引擎与共享数据模型SQLFluff rs 核心类型库解读sqlfluffrs_types 的表驱动语法引擎与共享数据模型 sqlfluffrs_types 是 SQLFluff人工智能计算机视觉深度学习MMCV 2.x 中文指南OpenMMLab 计算机视觉基础库的功能全景与安装实践MMCV 2.x 中文指南OpenMMLab 计算机视觉基础库的功能全景与安装实践 MMCVOpenMMLab Computer Vision Founda人工智能计算机视觉深度学习OpenMMLab 基石MMCV 计算机视觉基础库全方位解析OpenMMLab 基石MMCV 计算机视觉基础库全方位解析 引言计算机视觉开发的痛点与MMCV的解决方案 你是否曾在计算机视觉项目开发中面临以下挑战数据人工智能计算机视觉深度学习上一篇Shader Park Core CLI命令详解快速生成ThreeJS、离线渲染和原始SDF文件的终极指南下一篇5分钟掌握FunASR零配置Docker部署语音识别服务终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表