【MMDetection系列 - 3】 MMdetection文件目录结构解析之mmdet文件(模型构建思想和流程)

本文详细解读了MMDetection框架的文件目录结构,重点介绍了config和models下的关键组件,包括模型配置文件、各种网络结构和组件的作用,以及目标检测的整体构建流程。
摘要由CSDN通过智能技术生成


前言

本文主要分析mmdet文件目录结构中的mmdet文件,了解mmdetection整体构建流程、思想及其中各部分所完成的主要功能。 (更新中)


一、mmdet文件目录结构

MMDetection作为目标检测工具箱,提供了许多目标检测、实例分割、全景分割等算法及相关组件模块,其中mmdet文件即为其核心组成文件。

文件路径:mmdetection-main/mmdet
在这里插入图片描述
该文件主要由以下几个子文件构成:

文件名描述
apis提供模型推理的API
configs模型的配置文件
datasets支持用于目标检测、实例分割和全景分割的各种数据集
engine运行组件的一部分
evaluation评估模型的指标
models检测器的不同组件
structures提供bbox、mask、DetDataSample等数据结构
testing提供模型推理的API
visualization检测结果的可视化工具

下面详细介绍其中的重要文件(已更configs、models)。

1. configs

进入mmdetection-main/mmdet/configs,文件目录结构如下。
在这里插入图片描述在此文件中,提供了方法的配置参数,每个文件是一个模型的配置文件(文件名为模型名称)。

mmdetection-main/mmdet/configs/_base_下,有4个基本组件类型,分别为:datasets(数据集)、model(模型)、schedules(训练策略)以及default_runtime(运行时的默认配置)。可以通过继承_base_下的组件来构建我们的方法。

在configs文件下的文件夹,以方法名来命名,对于里面的每个配置文件,遵循以下样式来命名。

{model}_[model setting]_{backbone}_{neck}_[norm setting]_[misc]_[gpu x batch_per_gpu]_{schedule}_{dataset}

其中:

{model}: 模型种类,例如 faster_rcnn, mask_rcnn 等。

[model setting]: 特定的模型,例如 htc 中的without_semantic, reppoints 中的 moment 等。

{backbone}: 主干网络种类例如 r50 (ResNet-50), x101 (ResNeXt-101) 等。

{neck}: Neck 模型的种类包括 fpn, pafpn, nasfpn, c4 等。

[norm_setting]: 默认使用 bn (Batch Normalization),其他指定可以有 gn (Group Normalization), syncbn (Synchronized Batch Normalization) 等。 gn-head/gn-neck 表示 GN 仅应用于网络的 Head 或 Neck, gn-all 表示 GN 用于整个模型, 例如主干网络、Neck 和 Head。

[misc]: 模型中各式各样的设置/插件,例如 dconv、 gcb、 attention、albu、 mstrain 等。

[gpu x batch_per_gpu]:GPU 数量和每个 GPU 的样本数,默认使用 8x2。

{schedule}: 训练方案,选项是 1x、 2x、 20e 等。1x 和 2x 分别代表 12 epoch 和 24 epoch,20e 在级联模型中使用,表示 20 epoch。对于 1x/2x,初始学习率在第 8/16 和第 11/22 epoch 衰减 10 倍;对于 20e ,初始学习率在第 16 和第 19 epoch 衰减 10 倍。

{dataset}:数据集,例如 coco、 cityscapes、 voc_0712、 wider_face 等。

如detr,其中有四个配置文件,他们均为detr模型,采用了不同的主干网络以及训练方案。
在这里插入图片描述

2. models

进入mmdetection-main/mmdet/models,可以看到文件目录结构如下图。
在这里插入图片描述
在目前代码中,目标检测算法训练遵循以下流程:

backbone -> neck -> head ->  bbox assigner -> bbox sampler -> bbox encoder -> loss

(1)backbone主要用于特征提取,在models/backbones文件下集成了大部分骨架网络:

__all__ = [
    'RegNet', 'ResNet', 'ResNetV1d', 'ResNeXt', 'SSDVGG', 'HRNet',
    'MobileNetV2', 'Res2Net', 'HourglassNet', 'DetectoRS_ResNet',
    'DetectoRS_ResNeXt', 'Darknet', 'ResNeSt', 'TridentResNet', 'CSPDarknet',
    'SwinTransformer', 'PyramidVisionTransformer',
    'PyramidVisionTransformerV2', 'EfficientNet', 'CSPNeXt' ]

改变backbone:通过注册器机制注册使用

(2)neck 主要负责对 backbone 的特征进行高效融合和增强,能够对输入的单尺度或者多尺度特征进行融合、增强输出等,在models/necks文件下实现的neck:

__all__ = [
    'FPN', 'BFP', 'ChannelMapper', 'HRFPN', 'NASFPN', 'FPN_CARAFE', 'PAFPN',
    'NASFCOS_FPN', 'RFP', 'YOLOV3Neck', 'FPG', 'DilatedEncoder',
    'CTResNetNeck', 'SSDNeck', 'YOLOXPAFPN', 'DyHead', 'CSPNeXtPAFPN', 'SSH',
    'FPN_DropBlock' ]

(3)head负责模型的输出,得到最终的结果,不同算法的head模块复杂程度不同,灵活度高,目标检测算法输出一般包括分类和框坐标回归两个分支。在models文件下包含多个head文件:dense_headsroi_headsseg_headstracking_heads,目标检测网络的两种主要类型是one_stage和two_stage,one-stage 需要 DenseHead, two-stage 需要RoIHead,分别在dense_headsroi_heads中,seg_headstracking_heads中的head模块分别用于分割任务和追踪任务。

head模块是MMDetection中最复杂的模块(深入学习后,随时更新)

(4)bbox assigner -> bbox sampler -> bbox encoder

assigner: 进行正负样本匹配,确定正负样本;(分配策略见models/task_modules/assigner目录下)

__all__ = [
    'BaseAssigner', 'BinaryFocalLossCost', 'MaxIoUAssigner',
    'ApproxMaxIoUAssigner', 'AssignResult', 'PointAssigner', 'ATSSAssigner',
    'CenterRegionAssigner', 'GridAssigner', 'HungarianAssigner',
    'RegionAssigner', 'UniformAssigner', 'SimOTAAssigner',
    'TaskAlignedAssigner', 'TopkHungarianAssigner', 'BBoxL1Cost',
    'ClassificationCost', 'CrossEntropyLossCost', 'DiceCost', 'FocalLossCost',
    'IoUCost', 'BboxOverlaps2D', 'DynamicSoftLabelAssigner',
    'MultiInstanceAssigner', 'BboxOverlaps2D_GLIP'
]

sampler: 确定每个样本正负属性后,对正负样本进行样本平衡操作,正负样本采样策略;(采样策略见models/task_modules/samplers目录下)

__all__ = [
    'BaseSampler', 'PseudoSampler', 'RandomSampler',
    'InstanceBalancedPosSampler', 'IoUBalancedNegSampler', 'CombinedSampler',
    'OHEMSampler', 'SamplingResult', 'ScoreHLRSampler', 'MaskPseudoSampler',
    'MaskSamplingResult', 'MultiInstanceSamplingResult',
    'MultiInsRandomSampler'
]

encoder:对正样本的gt bbox (ground truth bounding box,真实标注框) 采用某种编码变换,更好地收敛和平衡多个 loss。(编解码策略见models/task_modules/coders目录下

__all__ = [
    'BaseBBoxCoder', 'PseudoBBoxCoder', 'DeltaXYWHBBoxCoder',
    'LegacyDeltaXYWHBBoxCoder', 'TBLRBBoxCoder', 'YOLOBBoxCoder',
    'BucketingBBoxCoder', 'DistancePointBBoxCoder', 'DeltaXYWHBBoxCoderForGLIP'
]

(5)loss一般是分类和回归loss,对head输出的预测值和bbox encoder得到的targets进行剃度下降迭代训练。(常见loss见models/losses目录下)

__all__ = [
    'accuracy', 'Accuracy', 'cross_entropy', 'binary_cross_entropy',
    'mask_cross_entropy', 'CrossEntropyLoss', 'sigmoid_focal_loss',
    'FocalLoss', 'smooth_l1_loss', 'SmoothL1Loss', 'balanced_l1_loss',
    'BalancedL1Loss', 'mse_loss', 'MSELoss', 'iou_loss', 'bounded_iou_loss',
    'IoULoss', 'BoundedIoULoss', 'GIoULoss', 'DIoULoss', 'CIoULoss',
    'EIoULoss', 'SIoULoss', 'GHMC', 'GHMR', 'reduce_loss',
    'weight_reduce_loss', 'weighted_loss', 'L1Loss', 'l1_loss', 'isr_p',
    'carl_loss', 'AssociativeEmbeddingLoss', 'GaussianFocalLoss',
    'QualityFocalLoss', 'DistributionFocalLoss', 'VarifocalLoss',
    'KnowledgeDistillationKLDivLoss', 'SeesawLoss', 'DiceLoss', 'EQLV2Loss',
    'MarginL2Loss', 'MultiPosCrossEntropyLoss', 'L2Loss', 'TripletLoss',
    'DDQAuxLoss', 'CrossEntropyCustomLoss', 'FocalCustomLoss'
]

总结

以上是对MMDetection文件目录结构的介绍,将在学习过程中不断进行完善。
在model文件中可以看到一个目标检测器是由多个组件组合而成的,各组件之间相互隔离,在设计自己的算法时也可以很方便的进行复用和设计。改进算法时,可以分析考虑改进哪几个核心组件。


参考:
[1] https://zhuanlan.zhihu.com/p/337375549
[2] https://mmdetection.readthedocs.io/zh-cn/v2.21.0/tutorials/config.html

  • 26
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值