前言
本文主要分析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_heads
、roi_heads
、seg_heads
、tracking_heads
,目标检测网络的两种主要类型是one_stage和two_stage,one-stage 需要 DenseHead, two-stage 需要RoIHead,分别在dense_heads
和roi_heads
中,seg_heads
和tracking_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