OpenMMLab-AI实战营第二期——4-2.MMDetection代码课

1. MMDetection介绍(vs MMSegmentation,MMdetection3d)

三个项目的Github Readme:

MMDetection 支持了各种不同的检测任务,包括目标检测,实例分割,全景分割,以及半监督目标检测

  • 检测是分割的基础,所以它也包含了很多分割任务,和MMSegmentation的区别是:
    • 目前,MMSegmentation 支持的分割任务为语义分割MMDetection 中支持了实例分割和全景分割
    • 详见:超详细!带你轻松掌握 MMSegmentation 整体构建流程
    • 语义分割的应用:①自动驾驶;②遥感图像分析;③医学图像分析。
    • 所以可以理解为专门为了这三个垂直方向把语义分割方向的模型(MMSegmentation)单独列出来了
  • MMdetection3d这个库主要是面向3D的,感觉重点在点云数据上,支持与 2D 检测器(MMDetection)的自然整合
  • 关于MMpretrain,前面说的三个库也都有自己的预训练模型。
    • 其实MMpretrain里主要放的模型大部分都是作为主干网络的模型,目前主要包括图像分类图像多标签分类图像检索,里面并不包含mmdetection等的检测的预训练模型,详见:模型库统计

所以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
    • 其实知乎上也分了专栏,但是感觉标题有点模糊

其实找找,有几个挺有意思的项目

2.3 MMengine

关于MMengine,详见:MMengine-Doc-介绍

  • 核心组件包含训练引擎评测引擎模块管理
  1. 训练引擎的核心模块是执行器(Runner)。执行器负责执行训练、测试和推理任务并管理这些过程中所需要的各个组件。在训练、测试、推理任务执行过程中的特定位置,执行器设置了钩子(Hook)来允许用户拓展、插入和执行自定义逻辑。执行器主要调用如下组件来完成训练和推理过程中的循环
    • 数据集(Dataset):负责在训练、测试、推理任务中构建数据集,并将数据送给模型。实际使用过程中会被数据加载器DataLoader封装一层,数据加载器会启动多个子进程来加载数据。
    • 模型(Model):在训练过程中接受数据并输出 loss;在测试、推理任务中接受数据,并进行预测。分布式训练等情况下会被模型的封装器Model Wrapper,如 MMDistributedDataParallel)封装一层。
    • 优化器封装Optimizer:优化器封装负责在训练过程中执行反向传播优化模型,并且以统一的接口支持了混合精度训练和梯度累加。
    • 参数调度器Parameter Scheduler:训练过程中,对学习率、动量等优化器超参数进行动态调整。
  2. 在训练间隙或者测试阶段,评测指标与评测器Metrics & Evaluator会负责对模型性能进行评测。其中评测器负责基于数据集对模型的预测进行评估。评测器内还有一层抽象是评测指标,负责计算具体的一个或多个评测指标(如召回率、正确率等)。
  3. 公共基础模块,算法模型执行过程中需要用到的公共基础模块,包括:
    • 配置类(Config):在 OpenMMLab 算法库中,用户可以通过编写 config 来配置训练、测试过程以及相关的组件。
    • 注册器(Registry):负责管理算法库中具有相同功能的模块。MMEngine 根据对算法库模块的抽象,定义了一套根注册器,算法库中的注册器可以继承自这套根注册器,实现模块的跨算法库调用。
    • 文件读写(File I/O):为各个模块的文件读写提供了统一的接口,以统一的形式支持了多种文件读写后端和多种文件格式,并具备扩展性。
    • 分布式通信原语(Distributed Communication Primitives):负责在程序分布式运行过程中不同进程间的通信。这套接口屏蔽了分布式和非分布式环境的区别,同时也自动处理了数据的设备和通信后端。
    • 其他工具(Utils):还有一些工具性的模块,如 ManagerMixin,它实现了一种全局变量的创建和获取方式,执行器内很多全局可见对象的基类就是 ManagerMixin。

所以config主要是MMengine,config里有什么问题去MMengine里搜


2.4 MMCV

关于MMCV,详见:MMCV-Doc-介绍

包括以下功能:

  1. 图像和视频处理:图像模块提供了一些图像预处理的函数,该模块依赖 opencv
  2. 图像和标注结果可视化:展示图像以及标注(目前只支持标注框)
    • 这个功能比较简单,对应的就是代码里的这部分:mmcv/mmcv
      /visualization/
    • 目前只有三个脚本:color.pyimage.pyoptflow.py
  3. 图像变换:就是配置文件里的数据变换pipeline指定的那部分内容
    • 约定所有数据变换都接受一个字典作为输入,并将处理后的数据输出为一个字典
    • 默认情况下,在需要图像尺寸作为初始化参数的数据变换 (如Resize, Pad) 中,图像尺寸的顺序均为 (width, height)numpy; 在数据变换返回的字典中,图像相关的尺寸, 如 img_shape、ori_shape、pad_shape 等,均为 (height, width)opencv
    • 详见:数据变换
  4. 多种 CNN 网络结构:为卷积神经网络提供了一些构建模块,包括层构建、模块组件和权重初始化(专门的视觉库,所以不涉及RNN、LSTM那些)
  5. ✅高质量实现的常见 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及其系列存在的意义是什么?

  • 结论就是:可能更适合学术,工程方面还是有点弱吧

3. 代码

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配置文件

  1. 歪门邪道的技巧,运行模型训练,在–work-dirs中会生成一个完整的配置.py文件
  2. 借用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)

参考:

3.3 mmdet的数据集可视化问题(VISUALIZERS)

from mmdet.registry import DATASETS,VISUALIZERS

我的结果是Filling的,教程的结果是没有Filling的

这是因为:

  1. 这个猫咪数据集其实是没有Segmentation的标注的,是直接使用bbox的四个顶点作为Segmentation的
  2. 在对应的配置文件的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

参考:

3.6 MMYOLO特征图可视化

AM(特征图可视化,激活值可视化),CAM(带有类的特征图可视化)

这个暂时涉及不到,以后用到了再来填坑

参考:

3.7 数据集转为COCO格式

这个问题和3.1有相关性,都放在另一篇博客里了:OpenMMLab-AI实战营第二期——相关1. COCO数据集格式和pycocotools使用(目标检测方向)

参考:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吨吨不打野

解决了问题,觉得还行就给点

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值