- 视频教程链接:MMDetection代码课
- 对应代码:rtmdet_cat_tutorial_colab.ipynb
- 如果想为OpenMMLab项目做贡献,可以看看这个:https://openmmlab.com/activity/codecamp
1. MMDetection介绍(vs MMSegmentation,MMdetection3d)
三个项目的Github Readme:
MMDetection 支持了各种不同的检测任务,包括目标检测,实例分割,全景分割,以及半监督目标检测。
- 检测是分割的基础,所以它也包含了很多分割任务,和MMSegmentation的区别是:
- 目前,MMSegmentation 支持的分割任务为语义分割 ,MMDetection 中支持了实例分割和全景分割。
- 详见:超详细!带你轻松掌握 MMSegmentation 整体构建流程
- 语义分割的应用:①自动驾驶;②遥感图像分析;③医学图像分析。
- 所以可以理解为专门为了这三个垂直方向把语义分割方向的模型(MMSegmentation)单独列出来了
- MMdetection3d这个库主要是面向3D的,感觉重点在点云数据上,支持与 2D 检测器(MMDetection)的自然整合
- 关于MMpretrain,前面说的三个库也都有自己的预训练模型。
- 其实MMpretrain里主要放的模型大部分都是作为主干网络的模型,目前主要包括
图像分类
,图像多标签分类
和图像检索
,里面并不包含mmdetection等的检测的预训练模型,详见:模型库统计。
- 其实MMpretrain里主要放的模型大部分都是作为主干网络的模型,目前主要包括
所以mmopenlab下面这些不同的repo,彼此之间功能还是很独立的,没有重复什么。
注意,
- (b)语义分割是分类+分割(一类物体一个颜色,自动驾驶其实用语义分割就够了),
- (c)实例分割(语义分割基础上+同类不同个体区分),
- (d)全景分割(全图的每个像素都要分)
图自这里
2. MMCV和MMengine
课程过程中逐渐意识到这两个库的重要性,安装永远都是先安装这两个库,报错最后的位置源头基本也都是这两个库,所以稍微看一下。
注意:
- mmopenlab的库改动很快(还很大),文档有时候跟不上代码的改动。。
- 出问题的时候除了怀疑是自己代码或者配置出错,也要怀疑一下是不是库的问题(issue)
2.1 mmopenlab框架
根据:github-OpenMMLab的介绍,以下是整体框架图
基于Pytorch,
- OpenMMLab使用MMEngine作为统一的训练评估引擎,
- MMCV提供神经网络算子和数据变换,是整个项目的基础
- 其他面向具体方向的库:MMDection、MMSegmentation等,都是基于这两个库进行开发的。
- 所以关于config方面的内容,去MMengine里看;详细的神经网络算子和数据变换,去MMCV里看
2.2 mmopenlab(涵盖其下所有库)的帮助文档和教程
github-OpenMMLab的介绍文档里,其实给了一个比较不起眼的链接: tutorials videos (in Chinese) ,对应的是open-mmlab/OpenMMLabCourse
项目,
- 这里基本涵盖了OpenMMLab的各种公开课,以及和其他机构的视频课程
- 同时还有知乎上的文章合集整理:OpenMMLabCourse/articles.md,
- 其实知乎上也分了专栏,但是感觉标题有点模糊
其实找找,有几个挺有意思的项目:
- mmfashion:https://github.com/open-mmlab/mmfashion
- open-mmlab-Playground:
- MMEditing 将更加拥抱生成式 AI(Generative AI),正式更名为 MMagic(Multimodal Advanced, Generative, and Intelligent Creation),致力于打造更先进、更全面的 AIGC 开源算法库。这个库感觉好玩一点,
2.3 MMengine
关于MMengine,详见:MMengine-Doc-介绍。
- 核心组件包含训练引擎、评测引擎和模块管理
- 训练引擎的核心模块是执行器(Runner)。执行器负责执行训练、测试和推理任务并管理这些过程中所需要的各个组件。在训练、测试、推理任务执行过程中的特定位置,执行器设置了钩子(Hook)来允许用户拓展、插入和执行自定义逻辑。执行器主要调用如下组件来完成训练和推理过程中的循环:
- 数据集(Dataset):负责在训练、测试、推理任务中构建数据集,并将数据送给模型。实际使用过程中会被数据加载器DataLoader封装一层,数据加载器会启动多个子进程来加载数据。
- 模型(Model):在训练过程中接受数据并输出 loss;在测试、推理任务中接受数据,并进行预测。分布式训练等情况下会被模型的封装器Model Wrapper,如 MMDistributedDataParallel)封装一层。
- 优化器封装Optimizer:优化器封装负责在训练过程中执行反向传播优化模型,并且以统一的接口支持了混合精度训练和梯度累加。
- 参数调度器Parameter Scheduler:训练过程中,对学习率、动量等优化器超参数进行动态调整。
- 在训练间隙或者测试阶段,评测指标与评测器Metrics & Evaluator会负责对模型性能进行评测。其中评测器负责基于数据集对模型的预测进行评估。评测器内还有一层抽象是评测指标,负责计算具体的一个或多个评测指标(如召回率、正确率等)。
- 公共基础模块,算法模型执行过程中需要用到的公共基础模块,包括:
- 配置类(Config):在 OpenMMLab 算法库中,用户可以通过编写 config 来配置训练、测试过程以及相关的组件。
- 注册器(Registry):负责管理算法库中具有相同功能的模块。MMEngine 根据对算法库模块的抽象,定义了一套根注册器,算法库中的注册器可以继承自这套根注册器,实现模块的跨算法库调用。
- 文件读写(File I/O):为各个模块的文件读写提供了统一的接口,以统一的形式支持了多种文件读写后端和多种文件格式,并具备扩展性。
- 分布式通信原语(Distributed Communication Primitives):负责在程序分布式运行过程中不同进程间的通信。这套接口屏蔽了分布式和非分布式环境的区别,同时也自动处理了数据的设备和通信后端。
- 其他工具(Utils):还有一些工具性的模块,如 ManagerMixin,它实现了一种全局变量的创建和获取方式,执行器内很多全局可见对象的基类就是 ManagerMixin。
所以config主要是MMengine,config里有什么问题去MMengine里搜
2.4 MMCV
关于MMCV,详见:MMCV-Doc-介绍。
包括以下功能:
- 图像和视频处理:图像模块提供了一些图像预处理的函数,该模块依赖 opencv
- 所以putText默认不支持中文,想支持的话,可以看看这个issue:Can cv2. putText support Chinese output?python opencv #14579)
- 支持的图像处理函数,详见:Docs > 数据处理
- 图像和标注结果可视化:展示图像以及标注(目前只支持标注框)
- 这个功能比较简单,对应的就是代码里的这部分:mmcv/mmcv
/visualization/ - 目前只有三个脚本:
color.py
,image.py
,optflow.py
- 这个功能比较简单,对应的就是代码里的这部分:mmcv/mmcv
- 图像变换:就是配置文件里的数据变换pipeline指定的那部分内容
- 约定所有数据变换都接受一个字典作为输入,并将处理后的数据输出为一个字典
- 默认情况下,在需要图像尺寸作为初始化参数的数据变换 (如Resize, Pad) 中,图像尺寸的顺序均为 (width, height)。
numpy
; 在数据变换返回的字典中,图像相关的尺寸, 如 img_shape、ori_shape、pad_shape 等,均为 (height, width)。opencv
- 详见:数据变换
- 多种 CNN 网络结构:为卷积神经网络提供了一些构建模块,包括层构建、模块组件和权重初始化(专门的视觉库,所以不涉及RNN、LSTM那些)
- ✅高质量实现的常见 CUDA 算子:提供了检测、分割等任务中常用的算子,
- 例如:ActiveRotatedFilter, Iou3d, KNN, NMS等。
- 简单来说,算子就是用把一些功能用torch的tensor重写一遍,同时要保证可以融合到神经网络训练过程中的梯度计算、前向传播等
- 可以去看看代码:mmcv/mmcv/ops/iou3d.py
- 同时每一个都有配套的cuda代码:mmcv/mmcv/ops/csrc/common/cuda/iou3d_cuda_kernel.cuh,大部分都是头文件,确实是C++的语法
关于这个算子,可以看看:
- 手把手教你如何高效地在 MMCV 中贡献算子
- MMCV 是 follow PyTorch 官方提供的 Custom C++ and CUDA extension 进行算子扩展的,不能算是 “搞了一套完全不同的流程”。
另外,还看到一个知乎问题:mmcv及其系列存在的意义是什么?
- 结论就是:可能更适合学术,工程方面还是有点弱吧
3. 代码
- 相关的代码还有:mmdetection/demo/MMDet_Tutorial.ipynb
- 特征可视化部分:
- 我照着视频里内容敲的(库版本可能不是很一致,有些结果无法完全复现):openMMLabCampusLearn/Exercise_3/Exercise_3.ipynb
3.1 使用pycocotools配合exif可视化图像
关于pycocotools
库,捎带连COCO数据集格式一起说了,东西有点多,另外开了一篇,详见:OpenMMLab-AI实战营第二期——相关1. COCO数据集格式和pycocotools使用(目标检测方向)
3.2 mmdetection中config的继承
mmopenlab的config
_base_ = [
'../_base_/default_runtime.py', '../_base_/schedules/schedule_1x.py',
'../_base_/datasets/coco_detection.py', './rtmdet_tta.py'
]
有两种方式可以获得完整的config配置文件
- 歪门邪道的技巧,运行模型训练,在–work-dirs中会生成一个完整的配置.py文件
- 借用mmegine的Config类
from mmengine import Config
# 查看完整的配置文件(包括继承的)
print(cfg.pretty_text)
config_file_path = '/content/drive/MyDrive/OpenMMLab/Exercise_4/pspnet-watermelon_20230618.py'
# 会把继承之后完整的结果写入文件中
cfg.dump(config_file_path)
参考:
- mmdetection.readthedocs.io- 在标准数据集上训练预定义的模型(待更新)
- mmdetection.readthedocs.io-自定义数据集
- https://github.com/open-mmlab/mmdetection/blob/main/configs/rtmdet/rtmdet-ins_tiny_8xb32-300e_coco.py
3.3 mmdet的数据集可视化问题(VISUALIZERS)
from mmdet.registry import DATASETS,VISUALIZERS
我的结果是Filling的,教程的结果是没有Filling的
这是因为:
- 这个猫咪数据集其实是没有Segmentation的标注的,是直接使用bbox的四个顶点作为Segmentation的
- 在对应的配置文件的
train_dataloader->train_pipeline
中,dict( type='LoadAnnotations', with_bbox=True, # Whether to use bounding box, True for detection with_mask=True, # Whether to use instance mask, True for instance segmentation,这个为True,则会把Segmentation也加载,就会显示了 poly2mask=True), # Whether to convert the polygon mask to instance mask, set False for acceleration and to save memory
参考:
3.4 pin_memory参数设置
推荐是设置成True,但是下载的MMDetection的默认config里是False
pin_memory=True
参考:
3.5 max_split_size_mb设置(train后在val阶段报错CUDA out of memory when testing)
报错:
If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation
尝试:
import torch
torch.cuda.empty_cache()
import os
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:512"
没啥用,本质还是因为显存太小.
最后采取的措施是:
- 把config中所有和val相关的配置都删除,如果用了test_XXX=val_XXX,就把test_XXX改了,总是就是跳过val阶段。。。
- 删不干净的话就会报错:
ValueError: val_dataloader, val_cfg, and val_evaluator should be either all
None or not None, but got val_dataloader={'batch_size': 1, 'num_workers': 1,
'persistent_workers': True, 'drop_last': False, 'sampler': {'type':
'DefaultSampler', 'shuffle': False}, 'dataset': {'type': 'CocoDataset',
'data_root': '/content/cat_dataset', 'ann_file': 'annotations/test.json',
'data_prefix': {'img': 'images/'}, 'test_mode': True, 'pipeline': [{'type':
'LoadImageFromFile', 'backend_args': None}, {'type': 'Resize', 'scale': (640,
640), 'keep_ratio': True}, {'type': 'Pad', 'size': (640, 640), 'pad_val':
{'img': (114, 114, 114)}}, {'type': 'PackDetInputs', 'meta_keys': ('img_id',
'img_path', 'ori_shape', 'img_shape', 'scale_factor')}], 'backend_args': None,
'metainfo': {'classes': ('cat',), 'palette': [(220, 20, 60)]}}}, val_cfg=
{'type': None}, val_evaluator=None
参考:
- mmdetection-CUDA out of memory when testing
所以这个问题是已知的,训练结束后的validation阶段就会发生内存泄漏,要么就跳过val阶段。。。(如果显存够大,不会报这个错误。。。) - RuntimeError: CUDA out of memory. How setting max_split_size_mb?
3.6 MMYOLO特征图可视化
AM(特征图可视化,激活值可视化),CAM(带有类的特征图可视化)
这个暂时涉及不到,以后用到了再来填坑
参考:
- https://mmyolo.readthedocs.io/zh_CN/latest/recommended_topics/visualization.html
- 玩转 MMYOLO 工具类第一期: 特征图可视化
3.7 数据集转为COCO格式
这个问题和3.1有相关性,都放在另一篇博客里了:OpenMMLab-AI实战营第二期——相关1. COCO数据集格式和pycocotools使用(目标检测方向)
参考: