商汤 x TechBeat系列直播课程回顾(二): OpenMMLab开源工具使用教学(一)

贴心的 将门创投 今天
2021年1月7日,商汤 × TechBeat系列直播课—OpenMMLab第期线上课程开播!课程主讲嘉宾是新加坡南洋理工在读博士生、OpenMMLab核心开发同学张文蔚,他对 MMCV 设计架构以及重要组件进行了详细介绍,并基于此讲解如何使用 MMDetection 和 MMDetection3D 进行研究与开发工作。

登陆将门-TechBeat社区网址,

https://www.techbeat.net/

搜索【OpenMMLab】可观看直播回放~

图片

以下是本期课程总结,希望对大家有所帮助~

1月21日(本周四)还有最后一节
商汤 × TechBeat系列直播课
请锁定将门-TechBeat社区的B站直播间
https://live.bilibili.com/22183939

图片

长按复制链接进入网页 

或扫描二维码进入直播间


MMCV: 计算机视觉基础库


在之前的课程中,商汤科技研究副总监陈恺博士介绍了整个 OpenMMLab 算法体系的架构(详情戳这里👈)。本次课程着重讲解了整个算法体系的基础库 MMCV,并基于此介绍了 MMDetection 和 MMDetection3D 的算法开发流程



1.1 组件概览

MMCV 提供两大功能模块,第一个是公用底层模块,第二个是抽象训练接口


公用底层模块包括:
文件和对象 IO 为了便捷大家的开发,支持了对 JSON、YAML、PKL 文件的统一读写接口;对于不同后端的文件存储形式,支持对象存储、IMDB 等多种后端类型的文件读取。

图像/视频处理支持:
支持对图像进行 Geometric、Photometric、Color space 的变换,支持对 Flow 的处理,同时支持图像和检测结果的可视化。

通用工具:
Progress Bar、Timer、文件路径处理、环境信息收集等小工具。

算子:
目前 CV 领域常见的 CUDA 算子 MMCV 都有高效实现。同时,团队也与商汤的 SenseParrots 团队合作,针对算法库的一些性能瓶颈通过 JIT 来进行优化。为了便捷下游算法库的部署,我们也在逐步支持 ONNX Runtime、TensorRT 等常见的部署方案。
 
通用训练接口
课程开始首先介绍四个关键概念:
  • 执行器 Runner 负责实现完整的训练流程,执行训练流程的抽象逻辑,被用于各算法库中,目前实现了 IterBasedRunner 和 EpochBasedRunner,用户可以自定义 Runner 来定义更灵活的训练流程。
  • 钩子 Hooks 在 Runner 运行过程中被触发而执行的函数,Runner 通过 Hooks 来完成训练流程中的各种具体的行为,如打印 log,存储模型等。
  • 配置文件类将 YAML、JSON、Python 定义的配置转成统一的 dict,一般通过 Registry 来实现配置文件中字段到模块类的映射和实例化。
  • 注册器 Registry 管理从字符串到模块类的映射,一般通过相应的 build 函数将配置字段映射到对应的模块类并将该类实例化。基于最底层的 Registry & Config & Builder ,MMCV 实现了对上层的模块化支持:Data,Model,Optimizer,这三部分都是由 Runner 进行管理。



1.2 Registry 使用

单个注册器(Registry)管理有相同接口的功能模块,建立从配置文件到模型和训练相关模块的映射,以 MMDetection 为例,训练全流程中涉及的模块及其 Registry 包括:训练流程、模型、优化器和数据。


关于如何使用 Registry 有如下四个步骤:
  1. 新建一个 Registry。

  2. 实现对应 build 函数。

  3. 在 Registry 中注册模块。

  4. 构建并使用模块。


代码✍️书写案例,以及使用方式👇

以上是如何使用 Registry 来管理各个模块,并且将他们具体实例化的完整过程。

1.3 Runner 使用

Runner,是 MMCV 中最重要的抽象接口之一,通过注册 hook 在预定义的位点执行自定义函数来实现自定义的训练流程。注:预定义位点(图中红色小方块)包括:训练开始前和结束后,epoch 开始前和结束后,iteration 开始前和结束后。Runner 会执行一个抽象的逻辑,从训练到执行,每到一个特定的位点,会调用这个位点的 hook 来执行功能。


如果我们要训练一个完整的模型/大概会涉及到如下到 hook,当然用户也自己自定义一些 hook 来定义 runner 在训练过程中的行为。

基本训练流程以及所涉及到的hook

那 hook 是如何实现的呢?每个固定的位点都有一个对应的函数接口,如 epoch 开始前:before_epoch,epoch 开始后:after_epoch。在每个固定的位点,Runner 会调用 self._hooks 中每个 hook 的对应函数,如在每次 iteration 开始前,会调用每个 hook 中的 before_iter 函数。

代码如下👇

举一个更具体的例子:比如在这里我们实现两个自定义的 hook,一个是:ClearCacheHook,一个是:SamplerSeedHook。

整体runner的一个执行逻辑👆

目标检测框架: MMDetection


目标检测框架分为目标检测和实例分割。


目标检测是预测每个物体的矩形框框住其外边沿;实例分割除了预测矩形框之外,还需要对物体进行像素级别的分割。目标检测和实例分割都需要对物体的类别进行识别。


2.1 组件概览


目前,MMDetection 支持了非常多检测器,这得益于非常灵活的模块化设计,如:



MMDetection 不仅支持了各种各样的检测器,也支持了非常丰富的算法模块,如各种模块化插件和训练手段。



在工业界和学术界都有了广泛的应用。



MMDetection 主要将检测器拆分成四个主要的模块,分别是:Backbone,Neck,RoIHead,DenseHead。

具体设计图示如下👇


2.2 如何在 MMDetection 中支持新的算法/神经网络模块?


  1. 实现这个模块并将它注册进对应的 Registry,如 NECKS、HEADS、BACKBONES。
  2. Import 这个模块。
  3. 修改配置文件。
  4. 训练与测试


第一步:在 MMDetection 中支持 PAFPN,实现 PAFPN 并将 PAFPN 注册进 NECKS。



第二步:Import PAFPN。



第三步:修改配置文件,使算法跑起来。



第四步:训练与测试



2.3 如何在 MMDetection 中支持新数据集?


在 MMDetection 中有如下三种方式去支持一个新数据集:

  1. 将数据转成中间数据格式。
  2. 将数据转成 COCO 格式。
  3. 实现一个新数据集类。
注:方法1和方法3所写的核心代码是一样的,只不过实现起来有点差别。


关于如何支持一个新的数据集,我们举一个例子:如何在 MMDetection 中支持 KITTI 数据集?

详情可见:

https://github.com/open-mmlab/mmdetection/blob/master/demo/MMDet_Tutorial.ipynb


具体步骤分为:

  1. 解析目录结构并比对中间格式。
  2. 实现新的数据集类。
  3. 修改配置文件进行训练。


第一步:实现新的数据集类。



第二步:实现新的数据集类。



KITTI 数据集在继承 CustomDataset 后只需要重载 load_annotations 函数将原 KITTI 格式转化成中间数据格式。


第三步:修改配置文件进行训练。



3D目标检测框架: MMDetection3D


3D目标监测框架是 MMDetection 框架的拓展,在一个场景中检测出物体的 3D 框架。预测每个物体在 3D 世界的坐标以及大小和旋转方向。



3.1 特性介绍


  1. 模块化设计,模型抽象化,方便替换组合各种模块;

  2. 算法丰富,单模态和多模态检测算法,应用于室内和室外场景。比如室内的 ScanNet 和 SUN RGB-D,室外的 NuScense、Waymo、Lyft、KITTI 数据集,单模态检测支持基于点云的 3D 检测,单/双目 3D 检测,多模态检测支持点云+图像等;

  3. 高性能,分布式训练优化,速度远超同类框架;

  4. 集成拓展 MMDetection,作为拓展组件,无缝兼容 MMDetection 中所有模型。


如何理解集成拓展 MMDetection

  1. MMDet3D 直接使用了 MMDet 中的训练/测试 API。

  2. 相同类型的模块直接使用 MMDetection 的 Registry。

  3. 使用基本相同的目录结构 +3D 相关拓展模块。



关于如何理解模块化设计

统一了 2D 和 3D 检测器的模块设计与使用。



关于如何理解高性能

可以看到是远超其他框架的,目前实现算法也是所有 3D 中最多的。



关于如何理解算法丰富



MMDet3D 在 NeurIPS 2020 的 nuScenes 检测挑战赛中,凭借多模态方法拿到了 Best PKL Award 和第三名,以及基于视觉的 3D 检测方法的最佳结果!


3.2 nuScenes Challenge Best PKL Award 方案介绍


多模态 3D 检测的现状:近年来基于图像和点云的多模态感知算法并没有体现出相对于单模态算法的绝对优势。出于对不同模态间 consistency 的考虑,目前多模态感知算法使用的数据增强技术远不如单模态算法丰富。


针对这个现状,我们有了以下实践:

  1. 验证了单模态算法中常用的数据增强技术对多模态感知算法同样有效。

  2. 提出了一种新的多模态数据增强技术,多模态剪贴(Multi-modality Cutand Paste)MoCa。

  3. 尝试了多模态融合和模型训练上的有益实践。

  4. 参加了第三届 nuScenes 检测挑战赛,在比赛中取得了 Best PKL Award。


感兴趣的同学可以直接去搜索 Multi-Modality Cut and Paste for 3D Object Detection,这里主要讲解一下第三点:如何基于 MMDetection3D 实现这些有益实践。


  1. 经过 COCO 和 nuImages 数据集 pretrain 过的图像分支能提高性能。

  2. 预训练检测器性能增益 HTC > Cascade Mask R-CNN > Mask R-CNN。

  3. 混合优化策略能显著提高图像特征的增益



如何在 MMDetection3D 中使用 nuImages 数据集?



3.3 在 MMDetection3D 中实现新的 optimizer


  1. 实现 HybridOptimizerConstructor。
  2. 实现 HybridOptimizer。
  3. 修改配置文件调用两个模块,就可以进行混合优化训练了。


比如:在 MMDetection3D 中实现混合优化,


实现 HybridOptimizerConstructor:



实现 HybridOptimizer:



修改配置文件并训练:



Q & A


1/不同版本之间的兼容性问题,比如需要获取某个算法指定版本的 Pytorch 模型,可以做到吗?

可以的!目前 MMDetection 兼容 Pytorch 1.3-1.7,基于任意一个 Pytorch 版本训练出来的模型都可以在其他版本的 Pytorch 环境下使用。关于 MMDetection 模型,其实只要是在 V2.0 之后训练出来的模型都可以在各个后续版本中使用。包括 V1.0 的模型我们也有发布模型迁移的教程。


2/请问 MMLab 中,任何算法库的数据集格式都是 coco 格式么?

不是的!我们只是在检测中使用 coco 数据集的格式,其他格式也是支持的。


3/MMDetection3D 有哪些模型的引进计划?

我们今年会支持 LiDAR Segmentation,比如 Cylinder3D;然后还有单目 3D 检测的一些模型。


课程预告


OpenMMLab系列课程将在本周四(1月21日)迎来最后一节开源工具使用教学课程,同时上周四的教学课程(二)也即将在TechBeat进行视频回放,敬请期待~



锁定将门-TechBeat社区的B站直播间
https://live.bilibili.com/22183939

长按复制链接进入网页 

或扫描二维码进入直播间

干货不容错过!



点击查看往期直播预告:

商汤×TechBeat系列直播课:

OpenMMLab  

// 1

OpenMMLab火热来袭!

// 2

OpenMMLab开源工具使用教学(一)

// 3

OpenMMLab开源工具使用教学(二)





扫码观看!

本周上新!



关于我“

将门是一家以专注于发掘、加速及投资技术驱动型创业公司的新型创投机构,旗下涵盖将门创新服务将门技术社群以及将门创投基金


将门成立于2015年底,创始团队由微软创投在中国的创始团队原班人马构建而成,曾为微软优选和深度孵化了126家创新的技术型创业公司。


如果您是技术领域的初创企业,不仅想获得投资,还希望获得一系列持续性、有价值的投后服务,欢迎发送或者推荐项目给我“门”: 

bp@thejiangmen.com

    
点击右上角,把文章分享到朋友圈

扫二维码|关注我们

微信:thejiangmen

bp@thejiangmen.com


点个“在看”,分享好内容