MMAction2 学习笔记 (三)——通用工具使用及网络DIY (下)
0- 写在前面
继续上一篇骨骼关键点识别算法相关内容的学习,今天学习通用领域的工具使用以及网络的DIY
目前正在实习,具体的内容方向是基于骨骼关键点的动作识别(skeleton based action recognition)。 在经过了多多的调研之后,觉得目前还是mmaction2平台最香,因此希望后续工作(包括效果的验证、实验、对比等等)包括前期的端到端工作都在mmaction2工具箱上展开。
学习mmaction2的目的是能够借助该平台对数据集、算法、演示、流程、搭建等等环节都能够理解的更加清晰和透彻(毕竟目前是一个小白),为后续自己的真正实际问题解决做准备。
本篇文章主要是基于mmaction2的中文教程(链接见文末),此外还有一些参考的文章以及github库中的注释性教程。
1- MMAction2 简介
mmaction2是商汤和港中文联合研发的一个基于pytorch框架的人体动作识别的深度学习开源工具库,可以提供包括行为识别(分类)、时序动作检测、时空动作检测、骨骼动作识别(分类)等等多种子类问题的算法框架,包括数据集等等,可以非常方便的使用。
mmaction2 和广为人知的检测工具库mmdetection 一样,都属于open-mmlab 工具箱下属的一个模块,目前仍在不断更新与拓展功能及算法,可以预见的是,其在人体行为识别方面将被更多人使用。
2- 添加新模块
《先放参考链接》
在本教程中,我们将介绍一些有关如何为该项目定制优化器,开发新组件,以及添加新的学习率调整器(更新器)的方法。
2.1 自定义优化器
CopyOfSGD 是自定义优化器的一个例子,写在 mmaction/core/optimizer/copy_of_sgd.py
文件中。 更一般地,可以根据如下方法自定义优化器。
假设添加的优化器名为 MyOptimizer
,它有 a
,b
和 c
三个参数。 用户需要首先实现一个新的优化器文件,如 mmaction/core/optimizer/my_optimizer.py
:
from mmcv.runner import OPTIMIZERS
from torch.optim import Optimizer
@OPTIMIZERS.register_module()
class MyOptimizer(Optimizer):
def __init__(self, a, b, c):
然后添加这个模块到 mmaction/core/optimizer/__init__.py
中,从而让注册器可以找到这个新的模块并添加它:
from .my_optimizer import MyOptimizer
之后,用户便可以在配置文件的 optimizer 字段中使用 MyOptimizer
。 在配置中,优化器由 optimizer
字段所定义,如下所示:
optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001)
用户可以直接根据 PyTorch API 文档 对参数进行直接设置。
2.2 自定义优化器构造器
某些模型可能对不同层的参数有特定的优化设置,例如 BatchNorm
层的梯度衰减。 用户可以通过自定义优化器构造函数来进行那些细粒度的参数调整。
用户可以编写一个基于 DefaultOptimizerConstructor
的新的优化器构造器, 并且重写 add_params(self, params, module)
方法。
一个自定义优化器构造器的例子是 TSMOptimizerConstructor
。 更具体地,可以如下定义定制的优化器构造器。
在 mmaction/core/optimizer/my_optimizer_constructor.py
:
from mmcv.runner import OPTIMIZER_BUILDERS, DefaultOptimizerConstructor
@OPTIMIZER_BUILDERS.register_module()
class MyOptimizerConstructor(DefaultOptimizerConstructor):
在 mmaction/core/optimizer/__init__.py
:
from .my_optimizer_constructor import MyOptimizerConstructor
之后便可在配置文件的 optimizer
域中使用 MyOptimizerConstructor
。
# 优化器
optimizer = dict(
type='SGD',
constructor='MyOptimizerConstructor',
paramwise_cfg=dict(fc_lr5=True),
lr=0.02,
momentum=0.9,
weight_decay=0.0001)
2.3开发新组件
MMAction2 将模型组件分为 4 种基础模型:
-
识别器(recognizer):整个识别器模型流水线,通常包含一个主干网络(backbone)和分类头(cls_head)。
-
主干网络(backbone):通常为一个用于提取特征的 FCN 网络,例如 ResNet,BNInception。
-
分类头(cls_head):用于分类任务的组件,通常包括一个带有池化层的 FC 层。
-
时序检测器(localizer):用于时序检测的模型,目前有的检测器包含 BSN,BMN,SSN。
- 添加新的backbone
这里以 TSN 为例,说明如何开发新的组件。
1- 创建新文件mmaction/models/backbones/resnet.py
import torch.nn as nn
from ..builder import BACKBONES
@BACKBONES.register_module()
class ResNet(nn.Module):
def __init__(self, arg1, arg2):
pass
def forward(self, x): # 应该返回一个元组
pass
def init_weights(self, pretrained=None):
pass
2- 在 mmaction/models/backbones/__init__.py
中导入模型
from .resnet import ResNet
3- 在配置文件中使用它
model = dict