首页 网站首页 商业资讯 流程 查看内容

轻松掌握 MMDetection 中 Head 流程

私域运营平台 流程 2023-1-2 13:17 5685人围观

文@000007


0 摘要

轻松把握 MMDetection 练习测试流程(二)对全部方针检测框架的练习以及测试整体流程停止的具体分析,旨在帮助大师对 MMDetection 框架停止较为周全的了解。在此根本上,本文首要针对 Model 模块中最为复杂的 Head 部分停止详解,首要内容包括:

  • Head 模块整体概述
  • Head 模块构建流程
  • Head 模块源码分析

项目地址:https://github.com/open-mmlab/mmdetection
接待 star

1 Head 模块整体概述



今朝 MMDetection 中 Head 模块主如果依照 stage 来分别,首要包括两个 package: dense_headsroi_heads , 别离对应 two-stage 算法中的第一和第二个 stage 模块,假如是 one-stage 算法例仅唯一 dense_heads 而已。

(1) dense_heads dense_heads 部分主如果依照 anchor-based 和 anchor-free 来分别,对应的类是 AnchorHead 和 AnchorFreeHead, 这两个类首要区分是 AnchorHead 会额外需要 anchor_generator 设置,用于天生默许 anchor。

同时可以看到有些类并没有间接继续这两个基类,例如 YOLOV3Head。缘由是在该类中大部分函数处置逻辑都需要复写,为了简单就间接继续了 BaseDenseHead,而对于 SABLRetinaHead 而言,由于 SABL 是类似 anchor-based 和 anchor-free 夹杂的算法,故间接继续 BaseDenseHead 是最合适的做法。用户假如要停止扩大开辟,可以根据开辟便利度自在挑选最合适的基类停止继续。

(2) roi_heads roi_heads 部分主如果依照第二阶段内部的 stage 个数来分别,典范的 Faster R-CNN 采用的是 StandardRoIHead,暗示停止一次回归即可,而对于 Cascade R-CNN,其第二阶段内部也包括多个 stage 回归阶段,实现了 CascadeRoIHead,即可以构建肆意次数的分类回归成果。

总结来说,每个 Head 内部都能够包括:

  1. RoI 特征提取器 roi_extractor
  2. 同享模块 shared_heads
  3. bbox 分类回归模块 bbox_heads
  4. mask 猜测模块 mask_heads

其中1、3是必备模块。

2 Head 模块构建流程

为了方便了解,首先需要回首下 MMDetection 练习和测试流程,然后再对每个 Head 模块停止深入分析。

2.1 MMDetection 练习和测试流程

(1) 练习流程

对应 two-stage 而言,具体以下所示:

#============= mmdet/models/detectors/two_stage.py/TwoStageDetector ============
def forward_train(...):
# 先辈行 backbone+neck 的特征提取
x = self.extract_feat(img)
losses = dict()
# RPN forward and loss
if self.with_rpn:
# 练习 RPN
proposal_cfg = self.train_cfg.get('rpn_proposal',
self.test_cfg.rpn)
# 主如果挪用 rpn_head 内部的 forward_train 方式
rpn_losses, proposal_list = self.rpn_head.forward_train(x,...)
losses.update(rpn_losses)
else:
proposal_list = proposals
# 第二阶段,主如果挪用 roi_head 内部的 forward_train 方式
roi_losses = self.roi_head.forward_train(x, ...)
losses.update(roi_losses)
return losses

Head 模块焦点是挪用 self.rpn_head.forward_trainself.roi_head.forward_train 函数,输出 losses 和其他相关数据

对于 one-stage 而言,具体以下所示:

#============= mmdet/models/detectors/single_stage.py/SingleStageDetector ============
def forward_train(...):
super(SingleStageDetector, self).forward_train(img, img_metas)
# 先辈行 backbone+neck 的特征提取
x = self.extract_feat(img)
# 主如果挪用 bbox_head 内部的 forward_train 方式
losses = self.bbox_head.forward_train(x, ...)
return losses

这个比 two-stage head 模块简单,由于其只要第一个 stage,对应的函数是 self.bbox_head.forward_train

(2) 测试流程

  1. 挪用 MMDataParallel 或 MMDistributedDataParallel 中的 forward 方式
  2. 挪用 base.py 中的 forward 方式
  3. 挪用 base.py 中的 self.forward_test 方式
  4. 假如是单标准测试,则会挪用 TwoStageDetector 或 SingleStageDetector 中的 simple_test 方式,假如是多标准测试,则挪用 aug_test 方式
  5. 终极挪用的是每个具体 Head 模块的 simple_test 大概 aug_test 方式(one-stage 和 two-stage 的 head 挪用逻辑有些区分)

可以看出在测试阶段,主如果挪用了 Head 模块本身的 simple_testaug_test 方式。

2.2 dense_heads 模块练习和测试流程

(1) 练习流程

dense_heads 练习流程最外层函数是 forward_train, 实在现是在 mmdet/models/dense_heads/base_dense_head.py/BaseDenseHead 中,以下所示:

def forward_train(self,
x,
img_metas,
gt_bboxes,
gt_labels=None,
gt_bboxes_ignore=None,
proposal_cfg=None,
**kwargs):
# 挪用各个子类实现的 forward 方式
outs = self(x)
if gt_labels is None:
loss_inputs = outs + (gt_bboxes, img_metas)
else:
loss_inputs = outs + (gt_bboxes, gt_labels, img_metas)
# 挪用各个子类实现的 loss 计较方式
losses = self.loss(*loss_inputs, gt_bboxes_ignore=gt_bboxes_ignore)
if proposal_cfg is None:
return losses
else:
# two-stage 算法还需要返回 proposal
proposal_list = self.get_bboxes(*outs, img_metas, cfg=proposal_cfg)
return losses, proposal_list

每个算法的 Head 子类一般不会重写上述方式,可是每个 Head 子类城市重写 forwardloss 方式,其中 forward 方式用于运转 head 收集部分输出分类回归分支的特征图,而 loss 方式接收 forward 输出,而且连系 label 计较 loss。

(1-1) BaseDenseHead

BaseDenseHead 基类过于简单,对于 anchor-based 和 anchor-free 算法又进一步停止了继续,获得 AnchorHead 大概 AnchorFreeHead 类。在今朝的各类算法实现中,绝大部份子类都是继续自 AnchorHead 大概 AnchorFreeHead,其供给了一些相关的默许操纵,假如间接继续 BaseDenseHead 则子类需要重写大部分算法逻辑。

(1-2) AnchorHead

首先分析 AnchorHead,其主如果封装了 anchor 天生进程。下面临 forwardloss 函数停止分析

# BBoxTestMixin 是多标准测试时辰挪用
class AnchorHead(BaseDenseHead, BBoxTestMixin):
# feats 是 backbone+neck 输出的多个标准图
def forward(self, feats):
# 对每张特征图零丁计较猜测输出
return multi_APPly(self.forward_single, feats)

# head 模块分类回归分支输出
def forward_single(self, x):
cls_score = self.conv_cls(x)
bbox_pred = self.conv_reg(x)
return cls_score, bbox_pred

forward 函数比力简单,就是对多标准特征图中每个特征图别离计较分类和回归输出即可,首要复杂度在 loss 函数中,其运转流程图以下所示:



  • 在 loss 函数中首先会挪用 get_anchors 函数获得默许 anchor 列表。而 get_anchors 函数内部会先计较多标准特征图上每个特征点位置的 anchor,然后再计较有用 anchor 标志(由于在构造 batch 时辰有些图片会停止左上角 padding,这部分像素报酬加的,不需要斟酌 anchor)
  • 然后基于 anchor、gt bbox 以及其他必备信息挪用 get_targets 函数计较每个猜测分支对应的 target。get_targets 函数内部会挪用 multi_apply(_get_targets_single) 函数对每张图片零丁计较 target,而 _get_targets_single 函数实现的功用比力多,包括:bbox assigner、bbox sampler 和 bbox encoder 三个关键环节
  • 在获得 targets 后,挪用 loss_single 函数计较每个输出标准的 loss 值,终极返回各个分支的 loss

(1-3) AnchorFreeHead

AnchorFreeHead 逻辑比 AnchorHead 简单很多,主如果由于 anchor-free 类算法比 anchor-based 算法加倍灵活多变,而且少了复杂的 anchor 天生进程,其 forward 方式实现和 AnchorHead 完全不异,而 loss 方式没有实现,其子类必须实现。

(2) 测试流程

前面说过在测试流程中,终极会挪用 Head 模块的 simple_testaug_test 方式别离停止单标准和多标准测试,触及到具体代码层面,one-stage 和 two-stage 挪用函数有区分,可是终极挪用的仍然是 Head 模块的 get_bboxes 方式。

(2-1) AnchorHead

在单标准测试形式下,对于 one-stage 而言,是间接挪用 self.bbox_head.get_bboxes 方式,假如是 AnchorHead,其流程是:

  1. 遍历每个特征标准输出分支,操纵 nms_pre 设置参数对该层猜测成果依照 scores 值停止从大到小停止 topk 截取,保存 scores 最高的前 nms_pre 的猜测成果
  2. 对保存的猜测成果停止 bbox 解码复原操纵
  3. 复原到最原始图片标准
  4. 假如需要停止 nms,则对一切分支猜测保存成果停止同一 nms 即可,否则间接属于多标准猜测成果

对于 two-stage 而言,其第一阶段 Head 推理是间接挪用了 simple_test_rpn 方式,该方式内部终极也是挪用了 AnchorHead 中的get_bboxes 方式。

# mmdet/models/dense_heads/rpn_test_mixin.py/RPNTestMixin
def simple_test_rpn(self, x, img_metas):
rpn_outs = self(x)
proposal_list = self.get_bboxes(*rpn_outs, img_metas)
return proposal_list

(2-2) AnchorFreeHead

AnchorFreeHead 比力灵活, get_bboxes 都是由具体算法子类实现。

def get_bboxes(self,
cls_scores,
bbox_preds,
img_metas,
cfg=None,
rescale=None):
raise NotImplementedError

(2-3) 多标准测试

除了 RPN 算法的多标准测试是在mmdet/models/dense_heads/rpn_test_mixin.py,其他 Head 多标准测试都是在 mmdet/models/dense_heads/dense_test_mixins.py/BBoxTestMixin 中实现,其思绪是对多标准图片中每张图片零丁运转 get_bboxes,然后复原到原图标准,最初把多标准图片猜测成果合并停止同一 nms。

2.3 roi_heads 模块练习和测试流程

以最常用的 StandardRoIHead 为例停止分析。

(1) 练习流程 练习流程最外层仍然是挪用 forward_train, 其焦点代码以下所示:

def forward_train(self,
x,
img_metas,
proposal_list,
gt_bboxes,
gt_labels,
...):
if self.with_bbox or self.with_mask:
num_imgs = len(img_metas)
sampling_results = []
for i in range(num_imgs):
# 对每张图片停止 bbox 正负样本属性分派
assign_result = self.bbox_assigner.assign(
proposal_list[i], ...)
# 然落后行正负样本采样
sampling_result = self.bbox_sampler.sample(
assign_result,
proposal_list[i],
...)
sampling_results.append(sampling_result)
losses = dict()

if self.with_bbox:
# bbox 分支 forward,返回 loss
bbox_results = self._bbox_forward_train(...)
losses.update(bbox_results['loss_bbox'])

if self.with_mask:
# mask 分支 forward,返回 loss
return losses


def _bbox_forward_train(self, x, sampling_results, gt_bboxes, gt_labels,
img_metas):
rois = bbox2roi([res.bboxes for res in sampling_results])
# forward
bbox_results = self._bbox_forward(x, rois)
# 计较 target
bbox_targets = self.bbox_head.get_targets(...)
# 计较 loss
loss_bbox = self.bbox_head.loss(...)
return ...

def _bbox_forward(self, x, rois):
# roi 提取
bbox_feats = self.bbox_roi_extractor(
x[:self.bbox_roi_extractor.num_inputs], rois)
# bbox head 收集前向
cls_score, bbox_pred = self.bbox_head(bbox_feats)
return ...

从上述逻辑可以看出,StandardRoIHeadforward_train 函数仅仅是对内部的 bbox_head 相关函数停止挪用,例如 get_targetsloss,自己 StandardRoIHead 类不做具体算法逻辑计较。

可以参考 Faster R-CNN 设置文件了解 StandardRoIHeadbbox_head 的关系:

roi_head=dict(
type='StandardRoIHead',
bbox_roi_extractor=dict(
type='SingleRoIExtractor',
roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0),
out_channels=256,
featmap_strides=[4, 8, 16, 32]),
bbox_head=dict(
type='Shared2FCBBoxHead',
in_channels=256,
fc_out_channels=1024,
roi_feat_size=7,
num_classes=80,
bbox_coder=dict(
type='DeltaXYWHBBoxCoder',
target_means=[0., 0., 0., 0.],
target_stds=[0.1, 0.1, 0.2, 0.2]),
reg_class_agnostic=False,
loss_cls=dict(
type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0),
loss_bbox=dict(type='L1Loss', loss_weight=1.0))))

StandardRoIHead 类包装了 bbox_roi_extractorbbox_head 的实例,前者用于 RoI 特征提取,后者才是真正计较分类和回归的逻辑。在 bbox_head 中除了收集模子有些变更外,loss计较进程是很是类似的,其 get_targetsloss 计较进程都是封装在基类 mmdet/models/roi_heads/bbox_heads/bbox_head.py 中。

(2) 测试流程

测试流程是挪用 Head 模块的 simple_testaug_test 函数,单标准测试 bbox 相关实现代码在 mmdet/models/roi_heads/test_mixins.py/BBoxTestMixinsimple_test_bboxes 函数中。

def simple_test_bboxes(self,
x,
...):
rois = bbox2roi(proposals)
# roi 提取+ forward,输出猜测成果
bbox_results = self._bbox_forward(x, rois)
cls_score = bbox_results['cls_score']
bbox_pred = bbox_results['bbox_pred']
det_bboxes = []
det_labels = []
for i in range(len(proposals)):
# 对猜测成果停止解码输出 bbox 和对应 label
det_bbox, det_label = self.bbox_head.get_bboxes(...)
det_bboxes.append(det_bbox)
det_labels.append(det_label)
return det_bboxes, det_labels

现实上仍然是挪用了 Head 模块内部的 get_bboxes 函数,处置逻辑和 dense_head 差不多( 解码+复原标准+ nms)。

3 总结

本文是 MMDetection 流程解读三部曲的终极章,重点是对最复杂的 Head 模块停止深入具体解读。经过三篇解读,读者可以领会到:

  • MMDetection 框架的整体设想思惟和算法模块分别原则
  • MMDetection 框架的整体练习和测试流程
  • MMDetection 框架每个组件的具体代码实现进程
  • 针对任何一个新复现代码,可以很快了解 MMDetection 是若何经过模块组合实现的


快速指引:

快速指引:

高端人脉微信群

高端人脉微信群

人脉=钱脉,我们相信天下没有聚不拢的人脉,扫码进群找到你所需的人脉,对接你所需的资源。

商业合作微信

商业合作微信

本站创始人微信,13年互联网营销经验,擅长引流裂变、商业模式、私域流量,高端人脉资源丰富。

我有话说......
  • lzd21cn 2023-1-2 13:26
    [飙泪笑]冲~
  • 敢想敢做敢拼 2023-1-2 13:25
    先进是先进,就是本来只用会pytorch就差不多可以看懂代码,现在又需要学mmdet[大哭]
  • quanquan. 2023-1-2 13:25
    部署问题我们现在发布了全新的 mmdeploy 框架,支持大部分 OpenMMLab 算法库的模型,欢迎试用。GitHub - open-mmlab/mmdeploy: OpenMMLab Model Deployment Framework
  • 探马汽配SaaS 2023-1-2 13:25
    能不能讲解一下检测模型怎样部署,比如导出onnx、trt等
  • Wangbo0918 2023-1-2 13:24
    不会的,他本质就是 for 循环
  • 顾薇卿 2023-1-2 13:24
    请问在two-stage的训练阶段中rpn部分的dense_head不需要调用getboxes把proposal传递给roi_head吗,因为我看文章说尽在测试阶段才调用getboxes,所以有疑问

查看全部评论>>

相关推荐

非常详细的企业管理流程模板,整理了很久,管理者日常工作必备!

非常详细的企业管理流程模板,整理了很久,管理者日常工作必备!

阅读前请点击右上角“关注”,每天免费获取职场文化及管理知识。职场千里马文化,只做

外企英语之公司流程是procedure还是process?

外企英语之公司流程是procedure还是process?

先考考大家,SOP里的P到底是procedure 还是process?或许你会想SOP不就是「标准作业流

关于流程图,你想知道的都在这里

关于流程图,你想知道的都在这里

为大家精选了10片优秀的流程图文章~画了多年的流程图,你真的画规范了吗?如何画逻辑

亲身经历谈流程管理(共8篇)——第一篇,什么是流程?

亲身经历谈流程管理(共8篇)——第一篇,什么是流程?

最近有一个朋友找我抱怨,说他们公司的太规范了。我一听,这肯定不是表扬,问他怎么了

让面试官膜拜你的HTTPS运行流程(超详细)

让面试官膜拜你的HTTPS运行流程(超详细)

引言最近恶补计网,HTTPS涉及到的知识比较多,整理一下。HTTPS实际上就是HTTP穿上了SS

22考研快要报名了!时间表已出炉,提前看报名流程及注意 ... ...

22考研快要报名了!时间表已出炉,提前看报名流程及注意 ... ...

最近后台私信收到比较多关于报名相关的提问,尤其是往届生问得多一些,关于报考点、档

优秀的流程图都这样画(附三大绘制规范)

优秀的流程图都这样画(附三大绘制规范)

优秀的流程图需要遵循一定的规范,包括符号规范、结构规范、路径规范等。只要熟练掌握

评测了10款画流程图软件,这4款最好用!(完全免费)

评测了10款画流程图软件,这4款最好用!(完全免费)

最近在做项目和复习的时候,用了不少流程图软件给我帮了大忙,所以今天就来分享分享你

强强联手!VS Code让它成为最强流程图工具

强强联手!VS Code让它成为最强流程图工具

自从切换到mac之后,我一直在寻找一款趁手的流程图工具。遇到http://draw.io之后,我

轻松掌握 MMDetection 中 Head 流程

轻松掌握 MMDetection 中 Head 流程

文@0000070 摘要轻松掌握 MMDetection 训练测试流程(二)对整个目标检测框架的训练以及

YOLOX 在 MMDetection 中复现全流程解析

YOLOX 在 MMDetection 中复现全流程解析

0 摘要最近 YOLOX 火爆全网,速度和精度相比 YOLOv3、v4 都有了大幅提升,并且提出了

输入文本直接生成流程图,这个极简工具火了,在线可玩

输入文本直接生成流程图,这个极简工具火了,在线可玩

鱼羊 发自 凹非寺量子位 报道 | 公众号 QbitAI流程图/思维导图让工作变得高效。但是,

史上最全的工程建设项目流程

史上最全的工程建设项目流程

以下25张图总结了工程建设项目的一般流程,建议收藏,随手查阅!一、工程建设项目前期

大名鼎鼎的IPD开发流程为什么这么厉害?一篇文章轻松读懂它 ... ...

大名鼎鼎的IPD开发流程为什么这么厉害?一篇文章轻松读懂它 ...

1 概述本文内容篇幅比较长,为方便阅读,先放一张本文的框架图,便于理解。IPD,Inte

流程的三大概念:分级、分类、分层

流程的三大概念:分级、分类、分层

现在很多企业在搞流程管理,都会安排各个部门、各个岗位将自己做的事情画成流程图。等

供应链的5大流程,从老王的初恋说起

供应链的5大流程,从老王的初恋说起

编辑导语:你了解供应链5大流程吗?它们分别为计划、采购、生产制造、交付和退货,本

科研大佬用什么工具画流程图?看完这篇就知道了。

科研大佬用什么工具画流程图?看完这篇就知道了。

​不知道大家有没有被流程图困扰过,在阐述生信分析流程时有它的身影,在规划科研基金

产品经理必会的3大流程:业务流程、功能流程、页面流程

产品经理必会的3大流程:业务流程、功能流程、页面流程

在工作中,画流程图是产品经理的基本技能之一,对于业务流程图、功能流程图和页面流程

开源的流程模拟软件

开源的流程模拟软件

前言最近很多朋友的Aspen都过期了。借此机会,介绍一下两款开源的流程模拟软件,DWSIM

装修不要当“甩手掌柜”,这份装修流程汇总,说得很详细!请参考

装修不要当“甩手掌柜”,这份装修流程汇总,说得很详细!请参考

夏天到了,天气晴朗,又是装修的好季节!最近也有很多业主私信飞墨君,询问关于装修的

电话咨询: 15924191378
添加微信