runner与hook
Runner和Hook详细解析
1.Runner和Hook概述
Runner又称执行器,负责模型训练过程的调度,主要目的是让用户使用更少的代码以及灵活可配置的方式开启训练。换句话说,MMCV将整个训练过程封装起来了,并使用Runner进行管理和配置。高度封装虽然减少了代码量,但如何对内部流程进行自定义的修改(比如动态调整学习率等)?这时就需要用到Hook机制。
Hook是能够改变程序执行流程的一种技术统称。通俗的说,Hook可以理解为一种触发器,在程序预定义的位置执行预定义的函数。MMCV已经在几个常用的位置预留了接口函数(称为回调函数),如下图所示。MMCV已经实现了一些常用的Hook函数,同时用户也可以增加自己的Hook函数,非常方便。当程序执行到指定位置时,就会进入到回调函数中,执行相应的功能,执行结束后再接着执行主流程。
上图对应到具体的代码:
# 开始运行时调用
before_run()
while self.epoch < self._max_epochs:
# 开始 epoch 迭代前调用
before_train_epoch()
...
cnn_batch形成
Sampler,
DataLoader和数据batch的形成
1. 简介
本文将简介pytorch采样器Sampler和数据加载器DataLoader,并解释在读取数据时每个batch形成的过程
2. 整体流程
简要来说在pytorch中,Sampler负责决定读取数据时的先后顺序,DataLoader负责装载数据并根据Sampler提供的顺序安排数据,具体过程绘图和描述如下。
初始化DataLoader的时候需指定数据集Dataset(包括数据和标签),Sampler可选,没有Sampler时会根据是否打乱数据顺序(shuffle)分别采用顺序采样器(sequential
sampler)和随机采样器(random sampler)。
第①步,Sampler首先根据Dataset的大小n形成一个可迭代的序号列表[0~n-1]。
第②步,BatchSampler根据DataLoader的batch_size参数将Sampler提供的序列划分成多个batch大小的可迭代序列组,drop_last参数决定是否保留最后一组。
第③步,兵分两路的Sampler(BatchSampler)和Da ...
Logging日志模块
Python中Logging 日志模块
一、基础知识
Logging库是非常常用的记录日志库,通过logging模块存储各种格式的日志,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等
Logging优点:
1.你可以控制消息的级别,过滤掉那些并不重要的消息。
2.你可决定输出到什么地方,以及怎么输出。有许多的重要性别级可供选择,debug、info、warning、error 以及 critical。通过赋予
logger 或者 handler
不同的级别,你就可以只输出错误消息到特定的记录文件中,或者在调试时只记录调试信息。
for example:
import logging
# 1、创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 2、创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBU ...
mmd3d数据提取、模型搭建过程
熟悉mmdetection3d数据提取、模型搭建过程
1、读取配置文件
1.1
mmdetection3d配置文件的组成
配置文件存放于mmdetection3d/config目录下,其中base_目录为mmdetection3d自带的基础配置,即原始配置,从_base目录的组成来看,mmdetection3d将配置文件分为四种,分别是:数据集
(dataset),模型 (model),训练策略 (schedule) 和运行时的默认设置 (default
runtime)
下面基于一个配置文件的部分内容,解释一下该怎么看
# configs/centerpoint/centerpoint_01voxel_second_secfpn_4x8_cyclic_20e_nus.py
_base_ = [
'../_base_/datasets/nus-3d.py',
'../_base_/models/centerpoint_01voxel_second_secfpn_nus.py', # 继承了这个模型的基础文件
'../_ba ...
mmd_hook
python importlib 用法小结
在使用Python的时候,大部分时候引入包,都是通过import
语句,比如
import numpy as np
有时候为了更复杂的需求,我们需要用程序化的方式来引入包
(Programmatic Importing),
比如根据输入不同,选择执行两个不同包里面的同名函数,这时候就需要用到importlib这个库了。这里先从一个简单例子开始,逐渐深入地讲一下这个库的用法。
import_module用法
importlib
是Python3.1增加的系统库,其中最常用的函数是其中的import_module
,功能是用程序语句的方式替代import 语句,用法如下:
import importlib
# 与 import time 效果一样
time = importlib.import_module('time')
print(time.time())
# 与 import os.path as path 效果一样
path = importlib.import_module('os.path')
pa ...
mmd_hook
MMCV 自定义
假设想要添加MyOptimizer的新优化器,有a,b,c三个参数,需要创建一个新的路径
mmdet/core/optimizer。然后在config文件中应用一个新的优化器
mmdet/core/optimizer/my_optimizer.py:
from .registry import OPTIMIZERS
from torch.optim import Optimizer
@OPTIMIZERS.register_module()
class MyOptimizer(Optimizer):
def __init__(self, a, b, c)
1.2.2
将新的优化器添加到注册器中
上边定义完成的模块想要在config文件中使用,就必须import到一个明明空间中,两种方法,实现这个工作:
直接在__init__.py文件中,导入,在mmdet/core/optimizer/__init__.py中
from .my_optimizer import MyOptimizer
在config文件中实现
custom_imports = dic ...
mmd_hook
MMCV核心组件:Hook
0 摘要
Hook 机制在 OpenMMLab 系列框架中应用非常广泛,结合 Runner
类可以实现对训练过程的整个生命周期进行管理。同时内置了多种
Hook,通过注册的形式注入 Runner
中实现了丰富的扩展功能,例如模型权重保存、日志记录等等。
1 Hook 通俗理解
(1)Hook是什么
在wiki百科中的定义如下:
钩子编程(hooking),也称作“挂钩”,是计算机程序设计语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为(钩子hook)
简而言之,就是能改变程序执行流程的一种技术统称。
(2)Hook用途
Hook
技术应用非常广泛,可以随便找一个简单例子来说明其用途。在软件编程的设计模式中,有一种设计模式叫做观察者设计模式,该设计模式实现的功能是:对于被观察者的一举一动,观察者都能够立即观测到,其内部实现机制可以简单通过
hook 机制实现,下面具体说明。
假设气象台可以提供两种对外服务:各大城市未来五天的天气情况和是否会出现地质 ...
mmd_hook
build_from_cfg()
前言
本篇主要介绍mmdetection如何构建目标检测模型的。在读本文之前,建议读者先阅读mmcv之Config类介绍。该系列文章以构建FasterRcnn为具体例子。当然,本文不会详细介绍如何构建FasterRcnn,仅仅介绍mmdetection是如何建立目标检测模型的。
1、总体流程
我这里简单介绍下流程:“模型配置字典”以字典形式存储着实例化类的信息。而检测器注册类里面存储了目标检测类(FasterRcnn,Yolo,ssd等,里面存储着是类,不是实例)。而函数build_from_cfg则是根据模型配置字典中type字段FasterRcnn来从
检测器注册类 中提取出FasterRcnn类。然后完成实例化。
本篇文章分配顺序如下:
介绍“模型配置字典”和“检测器注册类”;
介绍build_from_cfg;
实例化faster_rcnn。
2、模型配置字典和检测器注册类
2.1.模型配置字典
这里放张FasterRcnn的配置字典。关于这个字典怎么生成的请转mmdet之Config类介绍。
这里注意下‘type’字段。type ...
mmd_hook
MMCV核心组件:Hook
0 摘要
mmd_hook
MMD3D:模型之registry.py和builder.py解读
1.引言:
本篇文章主要就是讲一下,搭建模型的思路,以及registry.py和builder.py中各个函数块的作用。
注:builder.py是在mmdet/models文件夹下,是用来创建BACKBONES、NECKS、ROI_EXTRACTORS、SHARED_HEADS、HEADS、LOSSES、DETECTORS的模型的。而关于build_dataset()(在mmdet/datasets/builder.py中),在后面讲到数据集的时候再来讲它。
在mmdet/utils文件夹下的registry.py为主要的实现过程,后面详细讲解。
先来看在mmdet/models文件夹下的registry.py,较简单,代码如下:
# -*- coding: utf-8 -*-
from mmdet.utils import Registry
BACKBONES = Registry('backbone')
NECKS = Registry('neck')
ROI_EXTRACT ...