文@000007 0 摘要轻松把握 MMDetection 练习测试流程(二)对全部方针检测框架的练习以及测试整体流程停止的具体分析,旨在帮助大师对 MMDetection 框架停止较为周全的了解。在此根本上,本文首要针对 Model 模块中最为复杂的 Head 部分停止详解,首要内容包括:
项目地址:https://github.com/open-mmlab/mmdetection 1 Head 模块整体概述今朝 MMDetection 中 Head 模块主如果依照 stage 来分别,首要包括两个 package: (1) dense_heads 同时可以看到有些类并没有间接继续这两个基类,例如 YOLOV3Head。缘由是在该类中大部分函数处置逻辑都需要复写,为了简单就间接继续了 BaseDenseHead,而对于 SABLRetinaHead 而言,由于 SABL 是类似 anchor-based 和 anchor-free 夹杂的算法,故间接继续 BaseDenseHead 是最合适的做法。用户假如要停止扩大开辟,可以根据开辟便利度自在挑选最合适的基类停止继续。 (2) roi_heads 总结来说,每个 Head 内部都能够包括:
其中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 模块焦点是挪用 对于 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,对应的函数是 (2) 测试流程
可以看出在测试阶段,主如果挪用了 Head 模块本身的 2.2 dense_heads 模块练习和测试流程(1) 练习流程
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 子类城市重写 (1-1) BaseDenseHead
(1-2) AnchorHead 首先分析 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
(1-3) AnchorFreeHead
(2) 测试流程 前面说过在测试流程中,终极会挪用 Head 模块的 (2-1) AnchorHead 在单标准测试形式下,对于 one-stage 而言,是间接挪用
对于 two-stage 而言,其第一阶段 Head 推理是间接挪用了 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
cls_scores, bbox_preds, img_metas, cfg=None, rescale=None): raise NotImplementedError (2-3) 多标准测试 除了 RPN 算法的多标准测试是在 2.3 roi_heads 模块练习和测试流程以最常用的 StandardRoIHead 为例停止分析。 (1) 练习流程 练习流程最外层仍然是挪用 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 ... 从上述逻辑可以看出, 可以参考 Faster R-CNN 设置文件了解 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))))
(2) 测试流程 测试流程是挪用 Head 模块的 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 模块内部的 3 总结本文是 MMDetection 流程解读三部曲的终极章,重点是对最复杂的 Head 模块停止深入具体解读。经过三篇解读,读者可以领会到:
快速指引: 快速指引: |
阅读前请点击右上角“关注”,每天免费获取职场文化及管理知识。职场千里马文化,只做
先考考大家,SOP里的P到底是procedure 还是process?或许你会想SOP不就是「标准作业流
为大家精选了10片优秀的流程图文章~画了多年的流程图,你真的画规范了吗?如何画逻辑
最近有一个朋友找我抱怨,说他们公司的太规范了。我一听,这肯定不是表扬,问他怎么了
引言最近恶补计网,HTTPS涉及到的知识比较多,整理一下。HTTPS实际上就是HTTP穿上了SS
最近后台私信收到比较多关于报名相关的提问,尤其是往届生问得多一些,关于报考点、档
优秀的流程图需要遵循一定的规范,包括符号规范、结构规范、路径规范等。只要熟练掌握
最近在做项目和复习的时候,用了不少流程图软件给我帮了大忙,所以今天就来分享分享你
自从切换到mac之后,我一直在寻找一款趁手的流程图工具。遇到http://draw.io之后,我
文@0000070 摘要轻松掌握 MMDetection 训练测试流程(二)对整个目标检测框架的训练以及
0 摘要最近 YOLOX 火爆全网,速度和精度相比 YOLOv3、v4 都有了大幅提升,并且提出了
鱼羊 发自 凹非寺量子位 报道 | 公众号 QbitAI流程图/思维导图让工作变得高效。但是,
以下25张图总结了工程建设项目的一般流程,建议收藏,随手查阅!一、工程建设项目前期
1 概述本文内容篇幅比较长,为方便阅读,先放一张本文的框架图,便于理解。IPD,Inte
现在很多企业在搞流程管理,都会安排各个部门、各个岗位将自己做的事情画成流程图。等
编辑导语:你了解供应链5大流程吗?它们分别为计划、采购、生产制造、交付和退货,本
不知道大家有没有被流程图困扰过,在阐述生信分析流程时有它的身影,在规划科研基金
在工作中,画流程图是产品经理的基本技能之一,对于业务流程图、功能流程图和页面流程
前言最近很多朋友的Aspen都过期了。借此机会,介绍一下两款开源的流程模拟软件,DWSIM
夏天到了,天气晴朗,又是装修的好季节!最近也有很多业主私信飞墨君,询问关于装修的
声明:本站内容由网友分享或转载自互联网公开发布的内容,如有侵权请反馈到邮箱 1415941@qq.com,我们会在3个工作日内删除,加急删除请添加站长微信:15924191378
Copyright @ 2022-2024 私域运营网 https://www.yunliebian.com/siyu/ Powered by Discuz! 浙ICP备19021937号-4