目录
- MMCV
- Registry使用
- Runner使用
- mmCLS
- 结构:
- MMDetection
- 如何使用 MMDetection 以支持新的算法/神经网络模块
- 如何使用 MMDetection 以支持新数据集
- mmdetection3D
MMCV
内容基本来至于公众号“商汤学术”:
https://mp.weixin.qq.com/s/vRCjM0RBxzpcaD39Hk-fjQ
MMCV两大功能:
公用底层模块
- 文件和对象 IO:对 JSON、YAML、PKL文件的统一读写接口(所以不用再导其它包对吧)
- 图像/视频处理支持:对图像进行 Geometric, Photometric, Color space 的变换(理解应该时数据增强),支持对 Flow (不就是视频嘛)的处理, 同时支持图像和检测结果的可视化(不需要cv matplotlib了)。
- 通用工具:Progress Bar(显示训练进度),Timer(运行时间),文件路径处理,环境信息收集等小工具
- 算子:加速模型训练,CUDA 算子的高效实现
抽象训练接口(抽象接口就是C++中的多态)
- Runner:负责训练流程,目前实现了 IterBasedRunner 和 EpochBasedRunner两个类。
- Hooks:在 Runner 运行过程中被触发而执行的函数,如,打印 log,存储模型。
- 配置文件类:将 YAML、JSON、Python 定义的配置转成统一的 dict。一般通过 Registry 来实现配置文件中字段到模块类的映射和实例化。
- Registry:管理从字符串到模块类的映射,一般通过相应的 build 函数将配置字段映射到对应的模块类并将该类实例化。
- Runner:负责训练流程,目前实现了 IterBasedRunner 和 EpochBasedRunner两个类。
Registry使用
使用 Registry 有如下四个步骤:
建Registry =》实现build函数 =》 在Registry 中注册模块 =》 使用模块
Runner使用
通过注册 hook 在预定义的位点执行自定义函数来实现自定义的训练流程。
如下图所示的红色小方块即是预定义的位点,包括:训练开始前和结束后,epoch 开始前和结束后,iteration 开始前和结束后。
Hook是如何实现的?
首先每个固定的点位都有一个对应的接口函数,如下:
一个具体自定义hook的例子,如下:
是不是还是有点乱?下面给出我的理解:
看call_hook函数,每次到预定义的位点时调用这个函数。它做了啥?for轮询注册过的hook(比如这里的ClearCacheHook和SamplerSeedHook)。用getattr获得hook的fn_name的函数,实现调用。这里的fn_name应该就是hook预定于的6个接口函数。
mmCLS
参考视频:https://www.bilibili.com/video/BV1Tg4y1K7hS/?spm_id_from=333.1391.0.0&p=3&vd_source=1038a506ff56b51d53ae087a5b536aea
自行安装mmlab。网上教程一大堆
结构:
整个目录结构如下:
-configs- _base_ - datasets# 处理数据(加载数据,数据增强等)的具体的配置文件,如下图2所示- models#- schedules# 配置优化器、学习率等,如下图3所示- default_runtime.py# 其他配置,如图4所示- resnet - ***.py# 各种resnet的配置文件的路径等。文件内容基本形式如下图1。图1
图2
图3
图4
- config下(除_base_外)是各种模型的一些.py配置文件
- _base_下是models、datasets、等一些文件的路径
MMDetection
目标检测框架分为目标检测和实例分割。
- 目标检测是预测每个物体的矩形框,框住其外边沿;
- 实例分割除了预测矩形框之外,还需要对物体进行像素级别的分割。
- 目标检测和实例分割都需要对物体的类别进行识别。
MMDetection 主要将检测器拆分成四个主要的模块,分别是:Backbone,Neck,RoIHead,DenseHead。
如何使用 MMDetection 以支持新的算法/神经网络模块
- 实现这个模块并将它注册进对应的 Registry,如 NECKS、HEADS、BACKBONES。
如,利用MMDetection框架实现 PAFPN 。先将 PAFPN 注册进 NECKS。
Import 这个模块,这里在necks中import,因为第一步是注册进 NECKS,所以necks需要实例化对象,故要import。
修改配置文件,让算法跑起来
训练与测试
如何使用 MMDetection 以支持新数据集
详情可见:https://github.com/open-mmlab/mmdetection/blob/master/demo/MMDet_Tutorial.ipynb
在 MMDetection 中有如下三种方式去支持一个新数据集:
- 将数据转成中间数据格式。
- 将数据转成 COCO 格式。
- 实现一个新数据集类。
注:方法1和方法3所写的核心代码是一样的,只不过实现起来有点差别。
以Kitti数据集为了,转成中间数据格式的具体步骤分为:
解析目录结构并比对中间格式。
实现新的数据集类。
KITTI 数据集在继承 CustomDataset 后只需要重载 load_annotations 函数将原KITTI 格式转化成中间数据格式。目前我理解的意思是,如,把00XXXX.jpeg转为 filename = “00XXXX.jpeg”,把00XXXX.txt转为 labels = <np.ndarray> (n, )的格式。修改配置文件进行训练。
这里将类别调整为3。
mmdetection3D
是 MMDetection 框架的拓展,在一个场景中检测出物体的 3D 框架。预测每个物体在 3D 世界的坐标以及大小和旋转方向。
对拓展 MMDetection:
- MMDet3D 直接使用MMDet 中的训练/测试 API。
- 相同类型的模块直接使用 MMDetection 的 Registry。
- 使用基本相同的目录结构+3D 相关拓展模块。
模块化设计:
算法丰富:
下略。我觉得对我没什么帮助。