计算机视觉开源算法体系。 https://github.com/open-mmlab https://www.zhihu.com/people/openmmlab
教你在 PyTorch 中支持更多 ONNX 算子~
1)MIM 方法中,网络结构的哪个部分是学习表征的,哪个部分是解决 pretext task? 2)为什么之前典型的 contrastive learning 方法,在下游任务(例如检测、分割)上只能取得跟 supervised pretraining 类似的性能? 3)MIM 方法为什么优于目前的 contrastive learning 方法?
在 MMDetection3D 的官方可视化文档中,我们已经提供了如何进行可视化的一些指令和效果,这篇文章我们将从代码层级介绍可视化的细节过程,带大家一探究竟。
在 MMDetection3D 的官方可视化文档中,我们已经提供了如何进行可视化的一些指令和效果,这篇文章我们将从代码层级介绍可视化的细节过程,带大家一探究竟。
在之前的两篇文章中,我们介绍了配置 Logging 的流程。(是谁偷偷动了我的 logger、三句话,让 logger 言听计从)然而除此之外,Logging 还有一些高级用法,如果不了解的话,可能会产生意想不到的 Bug。今天的文章,我们就来详细解析一下这些高级用法。
小伙伴们大家好呀~前面的文章中(PyTorch 小课堂开课啦!带你解析数据处理全流程(一)、PyTorch 小课堂!带你解析数据处理全流程(二)),我们介绍了数据处理模块。而当我们解决了数据处理部分,接下来就需要构建自己的网络结构,从而才能将我们使用数据预处理模块得到的 batch data 送进网络结构当中。接下来,我们就带领大家一起再认识一下 PyTorch 中的神经网络模块,即 torch.nn。
小伙伴们大家好呀~前面的文章中(PyTorch 小课堂开课啦!带你解析数据处理全流程(一)、PyTorch 小课堂!带你解析数据处理全流程(二)),我们介绍了数据处理模块。而当我们解决了数据处理部分,接下来就需要构建自己的网络结构,从而才能将我们使用数据预处理模块得到的 batch data 送进网络结构当中。接下来,我们就带领大家一起再认识一下 PyTorch 中的神经网络模块,即 torch.nn。
RealBasicVSR 小课堂继续开课啦!上一期文章中我们解读了真实视频超分的文章 RealBasicVSR,今天我们将手把手带大家一起使用 MMEditing 训练 RealBasicVSR。这一次我们会重点关注数据处理,希望大家看完这一期的内容后能更了解 RealBasicVSR 的训练方式和 MMEditing 的数据处理流程。
在把 PyTorch 模型转换成 ONNX 模型时,我们往往只需要轻松地调用一句 torch.onnx.export 就行了。这个函数的接口看上去简单,但它在使用上还有着诸多的“潜规则”。在这篇教程中,我们会详细介绍 PyTorch 模型转 ONNX 模型的原理及注意事项。除此之外,我们还会介绍 PyTorch 与 ONNX 的算子对应关系,以教会大家如何处理 PyTorch 模型转换时可能会遇到的算子支持问题。
今天,我们着重对单进程/多进程,prefetch,pin_memory 等组件进行介绍,并对其特定功能予以解读,最后也会附上数据处理代码详解。
这里,以我们最为常见的跨任务研究——搭建主干网络为例,介绍一下如何快速开发一个新的主干网络,并分别使用 MMClassification、MMDetection 和 MMSegmentation 轻松实现分类、检测和分割任务上的评测。
OK,在正式解析 PyTorch 中的 torch.utils.data 模块之前,我们需要理解一下 Python 中的迭代器(Iterator),因为在源码的 Dataset, Sampler 和 DataLoader 这三个类中都会用到包括 __len__(self),__getitem__(self) 和 __iter__(self) 的抽象类的魔法方法。
作为最常见的骨干网络,ResNet 在目标检测算法中起到了至关重要的作用。许多目标检测经典算法,如 RetinaNet 、Faster R-CNN 和 Mask R-CNN 等都是以 ResNet 为骨干网络,并在此基础上进行调优。同时,大部分后续改进算法都会以 RetinaNet 、Faster R-CNN 和 Mask R-CNN 为 baseline 进行公平对比。
现代的深度学习推理框架通常遵循编译器的范式,将模型的中间表示(IR)会分为两部分:包括与硬件、环境等无关的前端(frontend)以及针对特定环境的后端(backend),比如 TVM 的 Relay 和 tir 就是一个典型的例子。在 PyTorch 的 jit 中源码中,也包含前端与后端的部分(不过后端部分的更新似乎不是很频繁)。frontend 目录下有对 Graph IR 的定义,function_schema 的解析工具,以及将 torchscript 转换成 SSA(static single assignment)形式的转换器等等。
在 3D 物体检测任务兴起的初期,群雄争霸,研究者还在探索如何使用现有的数据集进行 3D 检测器的训练,在一些数据预处理的流程上并未达到统一。加之数据集本身的格式也往往不同,因此包围框的格式比较混乱。MMDetection3D 在经历了一些坐标系相关的挫折之后,痛定思痛,决定使用统一的范式一统坐标系江湖,让使用者尽可能少在包围框坐标系上伤脑筋,我们在最新版本的 v1.0.0.rc0 版本中,重构了我们的坐标系。
最早提出 cGAN 的是论文 《Conditional Generative Adversarial Nets》,为了达到条件生成的目的,我们在输入给生成器网络 G 的噪声 z 上 concat 一个标签向量 y, 告诉生成网络生成标签所指定的数据。对于输入给判别器 D 的数据,也 concat 这样的一个标签,告诉判别网络判断输入是否为真实的该类别数据。
最近要新开一个项目,配个 logger 来管理日志吧,我配!
PyTorch 无疑是现在最成功的深度学习训练框架之一,是各种顶会顶刊论文实验的大热门。比起其他的框架,PyTorch 最大的卖点是它对动态网络的支持,比其他需要构建静态网络的框架拥有更低的学习成本。
对于 MMPose 我是慕名已久,一直以来跟不少做 Pose 的大佬交流时也常常提起,说同样的模型用 MMPose 跑出来点数会高不少,然而 MM 系列的封装逻辑和学习门槛让我一再搁置,终于最近才下定决心要把它啃下来。 本系列将记录我第一次接触 MMPose 系列的学习轨迹,学习思路,以及过程中的一些心得体会。
时间回到 2 月 25 日下午 6 点,我们的 Z 同学在模型部署后,推理图像的时候,输入图像预处理时间远远超出预期,竟然达到了 2 秒!Z 同学又是改函数又是 debug,还是一头雾水。可 Z 同学锲而不舍,继续钻研,最后推理成功了,但是奈何遇到了推理性能低、速度慢的问题。几经辗转,还是不得解决……
为什么 Transformer 结构的网络中需要指定输入的图像尺寸呢?我们能否移除这个限制,让网络动态地支持各种尺寸的输入图像呢?这对于一些下游任务有重要的作用,也已经有了一些成熟的解决方案。在最新版的 MMClassification 中,我们将这一功能扩展到了各种基于 Transformer 结构的主干网络中,实现了分类任务与下游任务主干网络的统一。
那到底能用 RealBasicVSR 干些啥呢?下面这条经典电影片段,展示了输入和 RealBasicVSR 输出的对比,可以看到 RealBasicVSR 能够对真实视频进行复原,提高分辨率,改善画质。
在 3D CNN 视频模型中, 每一个 mini-batch 的输入 shape 为 Batch_size x T (采样帧数) x H (高度) x W(宽度), 通常在训练中 Batch_size,T,H,W 的值都是固定的。 为了解决训练效率的问题,论文 "A Multigrid Method for Efficiently Training Video Models" 提出了一种动态改变 Batch_size、采样帧数 T、 每一帧的宽度 W 和高度 H 的方式,能在保证训练精度不变的情况下,加速训练收敛。
新创建的 logger 为何无法正确 “发声”,不怀好意的日志究竟从何而来,精心配置的 logger 竟然然口口吐吐叠叠词词,到底是配置者的失误还是来自三方库的暗箱操作
在之前的学习中,我们在模型部署上顺风顺水,没有碰到任何问题。这是因为 SRCNN 模型只包含几个简单的算子,而这些卷积、插值算子已经在各个中间表示和推理引擎上得到了完美支持。如果模型的操作稍微复杂一点,我们可能就要为兼容模型而付出大量的功夫了。
由于 3D 本身数据的复杂性和 MMDetection3D 支持任务(点云 3D 检测、单目 3D 检测、多模态 3D 检测和点云 3D 语义分割等)和场景(室内和室外)的多样性,整个框架结构相对复杂,新人用户的上手门槛相对较高。所以我们推出新的系列文章,让各个细分方向的用户都能轻松上手 MMDetection3D,基于框架进行自己的研究和开发。在系列文章的初期,我们会先带大家了解整个框架的设计流程,分析框架中的各种核心组件,介绍数据集的处理方法,然后再对各个细分任务及经典模型进行具体细节的代码层级介绍。
在软件工程中,部署指把开发完毕的软件投入使用的过程,包括环境配置、软件安装等步骤。类似地,对于深度学习模型来说,模型部署指让训练好的模型在特定环境中运行的过程。相比于软件部署,模型部署会面临更多的难题
随着 Vision Transformer (ViT) 在 2021 年霸榜各大数据集,如何基于 ViT 构建更加合适的自监督学习范式成为了该领域的一大问题。最初,DINO 和 MoCo v3 尝试将对比学习和 ViT 相结合,取得了不错的效果。不过长期以来,由于 CV 和 NLP 领域数据和基础模型之间的差异,NLP 的 Masked Language Modeling (MLM) 掩码模式机制没能成功应用于 CV 领域,但最近 ViT 的蓬勃发展,为掩码学习机制应用于视觉自监督打开了一扇大门。
作者提出了 Momentum Contrast 的概念,另外为无监督对比损失函数构建了足够大且具有高度一致性的字典,并通过队列 (queue) 的数据结构进行维护,下图即为 MoCo 论文思路的示意图,动量编码器以及通过队列存储特征向量,便是该文章两大最主要的特点了。
这些非典型操作出现的原因各种各样,有部分来自内部和社区用户所提需求,有部分来自复现算法本身的需求。希望大家通过学习本系列文章,在使用 MMDetection 进行扩展开发时可以更加游刃有余,轻松秀出各种骚操作。
MMEditing 是面向底层视觉任务的工具包,属于 OpenMMLab 开源算法体系。近期,我们在 MMEditing 中拓展了一个新的方向:视频插帧。本文将简要介绍视频插帧的技术原理,并带大家使用 MMEditing 实现一个视频插帧的 Demo。
自监督学习有一个非常强的动机:目前,大部分神经网络的训练仍然使用的是有监督范式,需要耗费大量的标注数据,标注这些数据是非常耗时费力的。而自监督的提出就是为了打破对人工标注的依赖,即使在没有标注数据的情况下,也可以高效地训练网络。众所周知,神经网络的训练需要任务来进行驱动,所以自监督学习的核心就是来合理构造有利于模型学习的任务。
收到社区同学的反馈,希望 MMClassification 支持 kfold-cross-valid 交叉验证功能,开发同学立马安排起来,计划 24 小时内支持该特性。 然而,开发的时候却遇到了难题:深拷贝生成的 Config 对象没有 dump 方法。于是打印对象的类型想一探究竟,发现深拷贝生成的对象并不是 Config 类型。那么真相只有一个,深拷贝出了问题。
墩墩生成器的原理非常简单。只需要从原图中识别出特定几个关键点的位置,与冰墩墩素材中标注好的锚点做匹配,计算出合适的图像变换。最后将变换后的图像叠加在冰墩墩素材上,并抠出脸部区域即可。得益于 MMPose Model Zoo 中丰富的人体、动物姿态估计模型,我们可以轻松实现这些步骤,并可以处理各种不同的目标类型。
不知道大家在使用 MMCV 的过程中有没有遇到这种情况:MMCV 没有提供自己需要的 CPU/CUDA 算子,于是希望提一个 PR(Pull Request),将这个算子加入 MMCV,但是又不知从何处下手。本文以最简单的 TensorAdd 算子为例,向大家展示为 MMCV 贡献算子的全过程,希望能够帮助大家更好地理解 MMCV 算子的
在 Vision Transformer 大行其道碾压万物的同时,也有人在尝试非注意力的 Transformer 架构(如果没有注意力模块,那还能称为 Transformer 吗)。这是一个好的现象,总有人要去开拓新方向。相比 Attention-based 结构,MLP-based 顾名思义就是不需要注意力了,将 Transformer 内部的注意力计算模块简单替换为 MLP 全连接结构,也可以达到同样性能。典型代表是 MLP-Mixer 和后续的 ResMLP。
在 Vision Transformer 大行其道碾压万物的同时,也有人在尝试非注意力的 Transformer 架构(如果没有注意力模块,那还能称为 Transformer 吗)。这是一个好的现象,总有人要去开拓新方向。相比 Attention-based 结构,MLP-based 顾名思义就是不需要注意力了,将 Transformer 内部的注意力计算模块简单替换为 MLP 全连接结构,也可以达到同样性能。典型代表是 MLP-Mixer 和后续的 ResMLP。
Transformer 结构是 Google 在 2017 年为解决机器翻译任务(例如英文翻译为中文)而提出,从题目中可以看出主要是靠 Attention 注意力机制,其最大特点是抛弃了传统的 CNN 和 RNN,整个网络结构完全是由 Attention 机制组成。为此需要先解释何为注意力机制,然后再分析模型结构。
Transformer 结构是 Google 在 2017 年为解决机器翻译任务(例如英文翻译为中文)而提出,从题目中可以看出主要是靠 Attention 注意力机制,其最大特点是抛弃了传统的 CNN 和 RNN,整个网络结构完全是由 Attention 机制组成。为此需要先解释何为注意力机制,然后再分析模型结构。
Transformer 结构是 Google 在 2017 年为解决机器翻译任务(例如英文翻译为中文)而提出,从题目中可以看出主要是靠 Attention 注意力机制,其最大特点是抛弃了传统的 CNN 和 RNN,整个网络结构完全是由 Attention 机制组成。为此需要先解释何为注意力机制,然后再分析模型结构。
。本文核心内容是按照抽象到具体方式,从多个层次进行训练和测试流程深入解析。从最抽象层讲起,到最后核心代码实现,希望帮助大家更容易理解 MMDetection 开源框架整体构建细节。
作为系列文章的第一篇解读,本文主要是从整体框架构建角度来解析,不会涉及到具体算法和代码,希望通过本文讲解: - MMDetection 整体构建流程和思想 - 目标检测算法核心组件划分 - 目标检测核心组件功能
Transformer 结构是 Google 在 2017 年为解决机器翻译任务(例如英文翻译为中文)而提出,从题目 Attention is All You Need 中可以看出主要是靠 Attention 注意力机制,其最大特点是抛弃了传统的 CNN 和 RNN,整个网络结构完全是由 Attention 机制组成。为此需要先解释何为注意力机制,然后再分析模型结构。
OpenMMLab 系列的一大特色是其所采用的 Hook 机制。同样作为计算机视觉算法框架, 相比于简单易懂、对新手友好的 Gluon-CV, Hook 机制无疑提高了初学者入门 OpenMMLab 系列工具箱的难度。一个很自然的问题就是,为什么要引入 Hook 机制?
3D Human Pose Estimation(以下简称 3D HPE )的目标是在三维空间中估计人体关键点的位置。3D HPE 的应用非常广泛,包括人机交互、运动分析、康复训练等,它也可以为其他计算机视觉任务(例如行为识别)提供 skeleton 等方面的信息。关于人体的表示一般有两种方式:第一种以骨架的形式表示人体姿态,由一系列的人体关键点和关键点之间的连线构成;另一种是参数化的人体模型(如 SMPL [2]),以 mesh 形式表示人体姿态和体型。
在深度学习中可视化模型的训练过程有助于我们分析模型的状态。可视化训练过程的库很多,我们将一些常用的库集成到 MMCV 中方便用户使用。在 MMCV 中使用这些库只需简单配置。在本文中将介绍这些库以及它们在 MMCV 中的使用方法。
你是不是曾经有这样的苦恼,python 真的太好用了,但是它真的好慢啊(哭死) ; C++ 很快,但是真的好难写啊,此生能不碰它就不碰它。老天啊,有没有什么两全其美的办法呢?俗话说的好:办法总是比困难多,大家都有这个问题,自然也就有大佬来试着解决这个问题,这就请出我们今天的主角: numba
可视化特征图 (b) 方法出自 2014 年的《Visualizing and Understanding Convolutional Networks》一文,这种方法通过反卷积和反池化对特征图进行了可视化,对于浅层网络的可视化效果良好。
假设一个团队有一个项目经理和三个程序员,甲方正在疯狂地提各种需求,然后项目经理要做的就是根据每位程序员的专长,将不同的需求分配给不同的程序员来做,但是项目经理自己不会去实现需求,此时我们可以说,项目经理就是一个 Dispatcher。
在训练过程中,通常有十个关键位点,如下图所示,从训练开始到结束,所有关键位点已用红色标出,共有 10 个。我们可以在这十个位点插入各种逻辑,例如加载模型权重、保存模型权重。而我们将同一类型的逻辑组织成一个 Hook。因此,MMCV 中 Hook 的作用就是训练和验证模型时,在不改变其他代码的前提下,灵活地在不同位点插入定制化的逻辑。