You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

config.md 32 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. # 教程 1: 学习配置文件
  2. 我们在配置文件中支持了继承和模块化,这便于进行各种实验。如果需要检查配置文件,可以通过运行 `python tools/misc/print_config.py /PATH/TO/CONFIG` 来查看完整的配置。
  3. ## 通过脚本参数修改配置
  4. 当运行 `tools/train.py` 和 `tools/test.py` 时,可以通过 `--cfg-options` 来修改配置文件。
  5. - 更新字典链中的配置
  6. 可以按照原始配置文件中的 dict 键顺序地指定配置预选项。例如,使用 `--cfg-options model.backbone.norm_eval=False` 将模型主干网络中的所有 BN 模块都改为 `train` 模式。
  7. - 更新配置列表中的键
  8. 在配置文件里,一些字典型的配置被包含在列表中。例如,数据训练流程 `data.train.pipeline` 通常是一个列表,比如 `[dict(type='LoadImageFromFile'), ...]`。如果需要将 `'LoadImageFromFile'` 改成 `'LoadImageFromWebcam'`,需要写成下述形式: `--cfg-options data.train.pipeline.0.type=LoadImageFromWebcam`。
  9. - 更新列表或元组的值
  10. 如果要更新的值是列表或元组。例如,配置文件通常设置 `workflow=[('train', 1)]`,如果需要改变这个键,可以通过 `--cfg-options workflow="[(train,1),(val,1)]"` 来重新设置。需要注意,引号 \" 是支持列表或元组数据类型所必需的,并且在指定值的引号内**不允许**有空格。
  11. ## 配置文件结构
  12. 在 `config/_base_` 文件夹下有 4 个基本组件类型,分别是:数据集(dataset),模型(model),训练策略(schedule)和运行时的默认设置(default runtime)。许多方法,例如 Faster R-CNN、Mask R-CNN、Cascade R-CNN、RPN、SSD 能够很容易地构建出来。由 `_base_` 下的组件组成的配置,被我们称为 _原始配置(primitive)_。
  13. 对于同一文件夹下的所有配置,推荐**只有一个**对应的**原始配置**文件。所有其他的配置文件都应该继承自这个**原始配置**文件。这样就能保证配置文件的最大继承深度为 3。
  14. 为了便于理解,我们建议贡献者继承现有方法。例如,如果在 Faster R-CNN 的基础上做了一些修改,用户首先可以通过指定 `_base_ = ../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py` 来继承基础的 Faster R-CNN 结构,然后修改配置文件中的必要参数以完成继承。
  15. 如果你在构建一个与任何现有方法不共享结构的全新方法,那么可以在 `configs` 文件夹下创建一个新的例如 `xxx_rcnn` 文件夹。更多细节请参考 [MMCV](https://mmcv.readthedocs.io/en/latest/understand_mmcv/config.html) 文档。
  16. ## 配置文件名称风格
  17. 我们遵循以下样式来命名配置文件。建议贡献者遵循相同的风格。
  18. ```
  19. {model}_[model setting]_{backbone}_{neck}_[norm setting]_[misc]_[gpu x batch_per_gpu]_{schedule}_{dataset}
  20. ```
  21. `{xxx}` 是被要求的文件 `[yyy]` 是可选的。
  22. - `{model}`: 模型种类,例如 `faster_rcnn`, `mask_rcnn` 等。
  23. - `[model setting]`: 特定的模型,例如 `htc` 中的`without_semantic`, `reppoints` 中的 `moment` 等。
  24. - `{backbone}`: 主干网络种类例如 `r50` (ResNet-50), `x101` (ResNeXt-101) 等。
  25. - `{neck}`: Neck 模型的种类包括 `fpn`, `pafpn`, `nasfpn`, `c4 ` 等。
  26. - `[norm_setting]`: 默认使用 `bn` (Batch Normalization),其他指定可以有 `gn` (Group Normalization), `syncbn` (Synchronized Batch Normalization) 等。
  27. `gn-head`/`gn-neck` 表示 GN 仅应用于网络的 Head 或 Neck, `gn-all` 表示 GN 用于整个模型, 例如主干网络、Neck 和 Head。
  28. - `[misc]`: 模型中各式各样的设置/插件,例如 `dconv`、 `gcb`、 `attention`、`albu`、 `mstrain` 等。
  29. - `[gpu x batch_per_gpu]`:GPU 数量和每个 GPU 的样本数,默认使用 `8x2`。
  30. - `{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 倍。
  31. - `{dataset}`:数据集,例如 `coco`、 `cityscapes`、 `voc_0712`、 `wider_face` 等。
  32. ## 弃用的 train_cfg/test_cfg
  33. `train_cfg` 和 `test_cfg` 在配置文件中已弃用,请在模型配置中指定它们。原始配置结构如下:
  34. ```python
  35. # 已经弃用的形式
  36. model = dict(
  37. type=...,
  38. ...
  39. )
  40. train_cfg=dict(...)
  41. test_cfg=dict(...)
  42. ```
  43. 推荐的配置结构如下:
  44. ```python
  45. # 推荐的形式
  46. model = dict(
  47. type=...,
  48. ...
  49. train_cfg=dict(...),
  50. test_cfg=dict(...),
  51. )
  52. ```
  53. ## Mask R-CNN 配置文件示例
  54. 为了帮助用户对 MMDetection 检测系统中的完整配置和模块有一个基本的了解,我们对使用 ResNet50 和 FPN 的 Mask R-CNN 的配置文件进行简要注释说明。更详细的用法和各个模块对应的替代方案,请参考 API 文档。
  55. ```python
  56. model = dict(
  57. type='MaskRCNN', # 检测器(detector)名称
  58. backbone=dict( # 主干网络的配置文件
  59. type='ResNet', # 主干网络的类别,可用选项请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/backbones/resnet.py#L308
  60. depth=50, # 主干网络的深度,对于 ResNet 和 ResNext 通常设置为 50 或 101。
  61. num_stages=4, # 主干网络状态(stages)的数目,这些状态产生的特征图作为后续的 head 的输入。
  62. out_indices=(0, 1, 2, 3), # 每个状态产生的特征图输出的索引。
  63. frozen_stages=1, # 第一个状态的权重被冻结
  64. norm_cfg=dict( # 归一化层(norm layer)的配置项。
  65. type='BN', # 归一化层的类别,通常是 BN 或 GN。
  66. requires_grad=True), # 是否训练归一化里的 gamma 和 beta。
  67. norm_eval=True, # 是否冻结 BN 里的统计项。
  68. style='pytorch', # 主干网络的风格,'pytorch' 意思是步长为2的层为 3x3 卷积, 'caffe' 意思是步长为2的层为 1x1 卷积。
  69. init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), # 加载通过 ImageNet 与训练的模型
  70. neck=dict(
  71. type='FPN', # 检测器的 neck 是 FPN,我们同样支持 'NASFPN', 'PAFPN' 等,更多细节可以参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/necks/fpn.py#L10。
  72. in_channels=[256, 512, 1024, 2048], # 输入通道数,这与主干网络的输出通道一致
  73. out_channels=256, # 金字塔特征图每一层的输出通道
  74. num_outs=5), # 输出的范围(scales)
  75. rpn_head=dict(
  76. type='RPNHead', # RPN_head 的类型是 'RPNHead', 我们也支持 'GARPNHead' 等,更多细节可以参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/dense_heads/rpn_head.py#L12。
  77. in_channels=256, # 每个输入特征图的输入通道,这与 neck 的输出通道一致。
  78. feat_channels=256, # head 卷积层的特征通道。
  79. anchor_generator=dict( # 锚点(Anchor)生成器的配置。
  80. type='AnchorGenerator', # 大多是方法使用 AnchorGenerator 作为锚点生成器, SSD 检测器使用 `SSDAnchorGenerator`。更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/anchor/anchor_generator.py#L10。
  81. scales=[8], # 锚点的基本比例,特征图某一位置的锚点面积为 scale * base_sizes
  82. ratios=[0.5, 1.0, 2.0], # 高度和宽度之间的比率。
  83. strides=[4, 8, 16, 32, 64]), # 锚生成器的步幅。这与 FPN 特征步幅一致。 如果未设置 base_sizes,则当前步幅值将被视为 base_sizes。
  84. bbox_coder=dict( # 在训练和测试期间对框进行编码和解码。
  85. type='DeltaXYWHBBoxCoder', # 框编码器的类别,'DeltaXYWHBBoxCoder' 是最常用的,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/coder/delta_xywh_bbox_coder.py#L9。
  86. target_means=[0.0, 0.0, 0.0, 0.0], # 用于编码和解码框的目标均值
  87. target_stds=[1.0, 1.0, 1.0, 1.0]), # 用于编码和解码框的标准方差
  88. loss_cls=dict( # 分类分支的损失函数配置
  89. type='CrossEntropyLoss', # 分类分支的损失类型,我们也支持 FocalLoss 等。
  90. use_sigmoid=True, # RPN通常进行二分类,所以通常使用sigmoid函数。
  91. los_weight=1.0), # 分类分支的损失权重。
  92. loss_bbox=dict( # 回归分支的损失函数配置。
  93. type='L1Loss', # 损失类型,我们还支持许多 IoU Losses 和 Smooth L1-loss 等,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/losses/smooth_l1_loss.py#L56。
  94. loss_weight=1.0)), # 回归分支的损失权重。
  95. roi_head=dict( # RoIHead 封装了两步(two-stage)/级联(cascade)检测器的第二步。
  96. type='StandardRoIHead', # RoI head 的类型,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/standard_roi_head.py#L10。
  97. bbox_roi_extractor=dict( # 用于 bbox 回归的 RoI 特征提取器。
  98. type='SingleRoIExtractor', # RoI 特征提取器的类型,大多数方法使用 SingleRoIExtractor,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/roi_extractors/single_level.py#L10。
  99. roi_layer=dict( # RoI 层的配置
  100. type='RoIAlign', # RoI 层的类别, 也支持 DeformRoIPoolingPack 和 ModulatedDeformRoIPoolingPack,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/ops/roi_align/roi_align.py#L79。
  101. output_size=7, # 特征图的输出大小。
  102. sampling_ratio=0), # 提取 RoI 特征时的采样率。0 表示自适应比率。
  103. out_channels=256, # 提取特征的输出通道。
  104. featmap_strides=[4, 8, 16, 32]), # 多尺度特征图的步幅,应该与主干的架构保持一致。
  105. bbox_head=dict( # RoIHead 中 box head 的配置.
  106. type='Shared2FCBBoxHead', # bbox head 的类别,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/bbox_heads/convfc_bbox_head.py#L177。
  107. in_channels=256, # bbox head 的输入通道。 这与 roi_extractor 中的 out_channels 一致。
  108. fc_out_channels=1024, # FC 层的输出特征通道。
  109. roi_feat_size=7, # 候选区域(Region of Interest)特征的大小。
  110. num_classes=80, # 分类的类别数量。
  111. bbox_coder=dict( # 第二阶段使用的框编码器。
  112. type='DeltaXYWHBBoxCoder', # 框编码器的类别,大多数情况使用 'DeltaXYWHBBoxCoder'。
  113. target_means=[0.0, 0.0, 0.0, 0.0], # 用于编码和解码框的均值
  114. target_stds=[0.1, 0.1, 0.2, 0.2]), # 编码和解码的标准方差。因为框更准确,所以值更小,常规设置时 [0.1, 0.1, 0.2, 0.2]。
  115. reg_class_agnostic=False, # 回归是否与类别无关。
  116. loss_cls=dict( # 分类分支的损失函数配置
  117. type='CrossEntropyLoss', # 分类分支的损失类型,我们也支持 FocalLoss 等。
  118. use_sigmoid=False, # 是否使用 sigmoid。
  119. loss_weight=1.0), # 分类分支的损失权重。
  120. loss_bbox=dict( # 回归分支的损失函数配置。
  121. type='L1Loss', # 损失类型,我们还支持许多 IoU Losses 和 Smooth L1-loss 等。
  122. loss_weight=1.0)), # 回归分支的损失权重。
  123. mask_roi_extractor=dict( # 用于 mask 生成的 RoI 特征提取器。
  124. type='SingleRoIExtractor', # RoI 特征提取器的类型,大多数方法使用 SingleRoIExtractor。
  125. roi_layer=dict( # 提取实例分割特征的 RoI 层配置
  126. type='RoIAlign', # RoI 层的类型,也支持 DeformRoIPoolingPack 和 ModulatedDeformRoIPoolingPack。
  127. output_size=14, # 特征图的输出大小。
  128. sampling_ratio=0), # 提取 RoI 特征时的采样率。
  129. out_channels=256, # 提取特征的输出通道。
  130. featmap_strides=[4, 8, 16, 32]), # 多尺度特征图的步幅。
  131. mask_head=dict( # mask 预测 head 模型
  132. type='FCNMaskHead', # mask head 的类型,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/mask_heads/fcn_mask_head.py#L21。
  133. num_convs=4, # mask head 中的卷积层数
  134. in_channels=256, # 输入通道,应与 mask roi extractor 的输出通道一致。
  135. conv_out_channels=256, # 卷积层的输出通道。
  136. num_classes=80, # 要分割的类别数。
  137. loss_mask=dict( # mask 分支的损失函数配置。
  138. type='CrossEntropyLoss', # 用于分割的损失类型。
  139. use_mask=True, # 是否只在正确的类中训练 mask。
  140. loss_weight=1.0)))) # mask 分支的损失权重.
  141. train_cfg = dict( # rpn 和 rcnn 训练超参数的配置
  142. rpn=dict( # rpn 的训练配置
  143. assigner=dict( # 分配器(assigner)的配置
  144. type='MaxIoUAssigner', # 分配器的类型,MaxIoUAssigner 用于许多常见的检测器,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/assigners/max_iou_assigner.py#L10。
  145. pos_iou_thr=0.7, # IoU >= 0.7(阈值) 被视为正样本。
  146. neg_iou_thr=0.3, # IoU < 0.3(阈值) 被视为负样本。
  147. min_pos_iou=0.3, # 将框作为正样本的最小 IoU 阈值。
  148. match_low_quality=True, # 是否匹配低质量的框(更多细节见 API 文档).
  149. ignore_iof_thr=-1), # 忽略 bbox 的 IoF 阈值。
  150. sampler=dict( # 正/负采样器(sampler)的配置
  151. type='RandomSampler', # 采样器类型,还支持 PseudoSampler 和其他采样器,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/samplers/random_sampler.py#L8。
  152. num=256, # 样本数量。
  153. pos_fraction=0.5, # 正样本占总样本的比例。
  154. neg_pos_ub=-1, # 基于正样本数量的负样本上限。
  155. add_gt_as_proposals=False), # 采样后是否添加 GT 作为 proposal。
  156. allowed_border=-1, # 填充有效锚点后允许的边框。
  157. pos_weight=-1, # 训练期间正样本的权重。
  158. debug=False), # 是否设置调试(debug)模式
  159. rpn_proposal=dict( # 在训练期间生成 proposals 的配置
  160. nms_across_levels=False, # 是否对跨层的 box 做 NMS。仅适用于 `GARPNHead` ,naive rpn 不支持 nms cross levels。
  161. nms_pre=2000, # NMS 前的 box 数
  162. nms_post=1000, # NMS 要保留的 box 的数量,只在 GARPNHHead 中起作用。
  163. max_per_img=1000, # NMS 后要保留的 box 数量。
  164. nms=dict( # NMS 的配置
  165. type='nms', # NMS 的类别
  166. iou_threshold=0.7 # NMS 的阈值
  167. ),
  168. min_bbox_size=0), # 允许的最小 box 尺寸
  169. rcnn=dict( # roi head 的配置。
  170. assigner=dict( # 第二阶段分配器的配置,这与 rpn 中的不同
  171. type='MaxIoUAssigner', # 分配器的类型,MaxIoUAssigner 目前用于所有 roi_heads。更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/assigners/max_iou_assigner.py#L10。
  172. pos_iou_thr=0.5, # IoU >= 0.5(阈值)被认为是正样本。
  173. neg_iou_thr=0.5, # IoU < 0.5(阈值)被认为是负样本。
  174. min_pos_iou=0.5, # 将 box 作为正样本的最小 IoU 阈值
  175. match_low_quality=False, # 是否匹配低质量下的 box(有关更多详细信息,请参阅 API 文档)。
  176. ignore_iof_thr=-1), # 忽略 bbox 的 IoF 阈值
  177. sampler=dict(
  178. type='RandomSampler', #采样器的类型,还支持 PseudoSampler 和其他采样器,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/samplers/random_sampler.py#L8。
  179. num=512, # 样本数量
  180. pos_fraction=0.25, # 正样本占总样本的比例。.
  181. neg_pos_ub=-1, # 基于正样本数量的负样本上限。.
  182. add_gt_as_proposals=True
  183. ), # 采样后是否添加 GT 作为 proposal。
  184. mask_size=28, # mask 的大小
  185. pos_weight=-1, # 训练期间正样本的权重。
  186. debug=False)) # 是否设置调试模式。
  187. test_cfg = dict( # 用于测试 rnn 和 rnn 超参数的配置
  188. rpn=dict( # 测试阶段生成 proposals 的配置
  189. nms_across_levels=False, # 是否对跨层的 box 做 NMS。仅适用于`GARPNHead`,naive rpn 不支持做 NMS cross levels。
  190. nms_pre=1000, # NMS 前的 box 数
  191. nms_post=1000, # NMS 要保留的 box 的数量,只在`GARPNHHead`中起作用。
  192. max_per_img=1000, # NMS 后要保留的 box 数量
  193. nms=dict( # NMS 的配置
  194. type='nms', # NMS 的类型
  195. iou_threshold=0.7 # NMS 阈值
  196. ),
  197. min_bbox_size=0), # box 允许的最小尺寸
  198. rcnn=dict( # roi heads 的配置
  199. score_thr=0.05, # bbox 的分数阈值
  200. nms=dict( # 第二步的 NMS 配置
  201. type='nms', # NMS 的类型
  202. iou_thr=0.5), # NMS 的阈值
  203. max_per_img=100, # 每张图像的最大检测次数
  204. mask_thr_binary=0.5)) # mask 预处的阈值
  205. dataset_type = 'CocoDataset' # 数据集类型,这将被用来定义数据集。
  206. data_root = 'data/coco/' # 数据的根路径。
  207. img_norm_cfg = dict( #图像归一化配置,用来归一化输入的图像。
  208. mean=[123.675, 116.28, 103.53], # 预训练里用于预训练主干网络模型的平均值。
  209. std=[58.395, 57.12, 57.375], # 预训练里用于预训练主干网络模型的标准差。
  210. to_rgb=True
  211. ) # 预训练里用于预训练主干网络的图像的通道顺序。
  212. train_pipeline = [ # 训练流程
  213. dict(type='LoadImageFromFile'), # 第 1 个流程,从文件路径里加载图像。
  214. dict(
  215. type='LoadAnnotations', # 第 2 个流程,对于当前图像,加载它的注释信息。
  216. with_bbox=True, # 是否使用标注框(bounding box), 目标检测需要设置为 True。
  217. with_mask=True, # 是否使用 instance mask,实例分割需要设置为 True。
  218. poly2mask=False), # 是否将 polygon mask 转化为 instance mask, 设置为 False 以加速和节省内存。
  219. dict(
  220. type='Resize', # 变化图像和其注释大小的数据增广的流程。
  221. img_scale=(1333, 800), # 图像的最大规模。
  222. keep_ratio=True
  223. ), # 是否保持图像的长宽比。
  224. dict(
  225. type='RandomFlip', # 翻转图像和其注释大小的数据增广的流程。
  226. flip_ratio=0.5), # 翻转图像的概率。
  227. dict(
  228. type='Normalize', # 归一化当前图像的数据增广的流程。
  229. mean=[123.675, 116.28, 103.53], # 这些键与 img_norm_cfg 一致,因为 img_norm_cfg 被
  230. std=[58.395, 57.12, 57.375], # 用作参数。
  231. to_rgb=True),
  232. dict(
  233. type='Pad', # 填充当前图像到指定大小的数据增广的流程。
  234. size_divisor=32), # 填充图像可以被当前值整除。
  235. dict(type='DefaultFormatBundle'), # 流程里收集数据的默认格式捆。
  236. dict(
  237. type='Collect', # 决定数据中哪些键应该传递给检测器的流程
  238. keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks'])
  239. ]
  240. test_pipeline = [
  241. dict(type='LoadImageFromFile'), # 第 1 个流程,从文件路径里加载图像。
  242. dict(
  243. type='MultiScaleFlipAug', # 封装测试时数据增广(test time augmentations)。
  244. img_scale=(1333, 800), # 决定测试时可改变图像的最大规模。用于改变图像大小的流程。
  245. flip=False, # 测试时是否翻转图像。
  246. transforms=[
  247. dict(type='Resize', # 使用改变图像大小的数据增广。
  248. keep_ratio=True), # 是否保持宽和高的比例,这里的图像比例设置将覆盖上面的图像规模大小的设置。
  249. dict(type='RandomFlip'), # 考虑到 RandomFlip 已经被添加到流程里,当 flip=False 时它将不被使用。
  250. dict(
  251. type='Normalize', # 归一化配置项,值来自 img_norm_cfg。
  252. mean=[123.675, 116.28, 103.53],
  253. std=[58.395, 57.12, 57.375],
  254. to_rgb=True),
  255. dict(
  256. type='Pad', # 将配置传递给可被 32 整除的图像。
  257. size_divisor=32),
  258. dict(
  259. type='ImageToTensor', # 将图像转为张量
  260. keys=['img']),
  261. dict(
  262. type='Collect', # 收集测试时必须的键的收集流程。
  263. keys=['img'])
  264. ])
  265. ]
  266. data = dict(
  267. samples_per_gpu=2, # 单个 GPU 的 Batch size
  268. workers_per_gpu=2, # 单个 GPU 分配的数据加载线程数
  269. train=dict( # 训练数据集配置
  270. type='CocoDataset', # 数据集的类别, 更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/coco.py#L19。
  271. ann_file='data/coco/annotations/instances_train2017.json', # 注释文件路径
  272. img_prefix='data/coco/train2017/', # 图片路径前缀
  273. pipeline=[ # 流程, 这是由之前创建的 train_pipeline 传递的。
  274. dict(type='LoadImageFromFile'),
  275. dict(
  276. type='LoadAnnotations',
  277. with_bbox=True,
  278. with_mask=True,
  279. poly2mask=False),
  280. dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
  281. dict(type='RandomFlip', flip_ratio=0.5),
  282. dict(
  283. type='Normalize',
  284. mean=[123.675, 116.28, 103.53],
  285. std=[58.395, 57.12, 57.375],
  286. to_rgb=True),
  287. dict(type='Pad', size_divisor=32),
  288. dict(type='DefaultFormatBundle'),
  289. dict(
  290. type='Collect',
  291. keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks'])
  292. ]),
  293. val=dict( # 验证数据集的配置
  294. type='CocoDataset',
  295. ann_file='data/coco/annotations/instances_val2017.json',
  296. img_prefix='data/coco/val2017/',
  297. pipeline=[ # 由之前创建的 test_pipeline 传递的流程。
  298. dict(type='LoadImageFromFile'),
  299. dict(
  300. type='MultiScaleFlipAug',
  301. img_scale=(1333, 800),
  302. flip=False,
  303. transforms=[
  304. dict(type='Resize', keep_ratio=True),
  305. dict(type='RandomFlip'),
  306. dict(
  307. type='Normalize',
  308. mean=[123.675, 116.28, 103.53],
  309. std=[58.395, 57.12, 57.375],
  310. to_rgb=True),
  311. dict(type='Pad', size_divisor=32),
  312. dict(type='ImageToTensor', keys=['img']),
  313. dict(type='Collect', keys=['img'])
  314. ])
  315. ]),
  316. test=dict( # 测试数据集配置,修改测试开发/测试(test-dev/test)提交的 ann_file
  317. type='CocoDataset',
  318. ann_file='data/coco/annotations/instances_val2017.json',
  319. img_prefix='data/coco/val2017/',
  320. pipeline=[ # 由之前创建的 test_pipeline 传递的流程。
  321. dict(type='LoadImageFromFile'),
  322. dict(
  323. type='MultiScaleFlipAug',
  324. img_scale=(1333, 800),
  325. flip=False,
  326. transforms=[
  327. dict(type='Resize', keep_ratio=True),
  328. dict(type='RandomFlip'),
  329. dict(
  330. type='Normalize',
  331. mean=[123.675, 116.28, 103.53],
  332. std=[58.395, 57.12, 57.375],
  333. to_rgb=True),
  334. dict(type='Pad', size_divisor=32),
  335. dict(type='ImageToTensor', keys=['img']),
  336. dict(type='Collect', keys=['img'])
  337. ])
  338. ],
  339. samples_per_gpu=2 # 单个 GPU 测试时的 Batch size
  340. ))
  341. evaluation = dict( # evaluation hook 的配置,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/evaluation/eval_hooks.py#L7。
  342. interval=1, # 验证的间隔。
  343. metric=['bbox', 'segm']) # 验证期间使用的指标。
  344. optimizer = dict( # 用于构建优化器的配置文件。支持 PyTorch 中的所有优化器,同时它们的参数与 PyTorch 里的优化器参数一致。
  345. type='SGD', # 优化器种类,更多细节可参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/optimizer/default_constructor.py#L13。
  346. lr=0.02, # 优化器的学习率,参数的使用细节请参照对应的 PyTorch 文档。
  347. momentum=0.9, # 动量(Momentum)
  348. weight_decay=0.0001) # SGD 的衰减权重(weight decay)。
  349. optimizer_config = dict( # optimizer hook 的配置文件,执行细节请参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/optimizer.py#L8。
  350. grad_clip=None) # 大多数方法不使用梯度限制(grad_clip)。
  351. lr_config = dict( # 学习率调整配置,用于注册 LrUpdater hook。
  352. policy='step', # 调度流程(scheduler)的策略,也支持 CosineAnnealing, Cyclic, 等。请从 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py#L9 参考 LrUpdater 的细节。
  353. warmup='linear', # 预热(warmup)策略,也支持 `exp` 和 `constant`。
  354. warmup_iters=500, # 预热的迭代次数
  355. warmup_ratio=
  356. 0.001, # 用于热身的起始学习率的比率
  357. step=[8, 11]) # 衰减学习率的起止回合数
  358. runner = dict(
  359. type='EpochBasedRunner', # 将使用的 runner 的类别 (例如 IterBasedRunner 或 EpochBasedRunner)。
  360. max_epochs=12) # runner 总回合数, 对于 IterBasedRunner 使用 `max_iters`
  361. checkpoint_config = dict( # Checkpoint hook 的配置文件。执行时请参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py。
  362. interval=1) # 保存的间隔是 1。
  363. log_config = dict( # register logger hook 的配置文件。
  364. interval=50, # 打印日志的间隔
  365. hooks=[
  366. # dict(type='TensorboardLoggerHook') # 同样支持 Tensorboard 日志
  367. dict(type='TextLoggerHook')
  368. ]) # 用于记录训练过程的记录器(logger)。
  369. dist_params = dict(backend='nccl') # 用于设置分布式训练的参数,端口也同样可被设置。
  370. log_level = 'INFO' # 日志的级别。
  371. load_from = None # 从一个给定路径里加载模型作为预训练模型,它并不会消耗训练时间。
  372. resume_from = None # 从给定路径里恢复检查点(checkpoints),训练模式将从检查点保存的轮次开始恢复训练。
  373. workflow = [('train', 1)] # runner 的工作流程,[('train', 1)] 表示只有一个工作流且工作流仅执行一次。根据 total_epochs 工作流训练 12个回合。
  374. work_dir = 'work_dir' # 用于保存当前实验的模型检查点和日志的目录文件地址。
  375. ```
  376. ## 常问问题 (FAQ)
  377. ### 忽略基础配置文件里的部分内容
  378. 有时,您也许会设置 `_delete_=True` 去忽略基础配置文件里的一些域内容。 您也许可以参照 [mmcv](https://mmcv.readthedocs.io/en/latest/understand_mmcv/config.html#inherit-from-base-config-with-ignored-fields) 来获得一些简单的指导。
  379. 在 MMDetection里,例如为了改变 Mask R-CNN 的主干网络的某些内容:
  380. ```python
  381. model = dict(
  382. type='MaskRCNN',
  383. pretrained='torchvision://resnet50',
  384. backbone=dict(
  385. type='ResNet',
  386. depth=50,
  387. num_stages=4,
  388. out_indices=(0, 1, 2, 3),
  389. frozen_stages=1,
  390. norm_cfg=dict(type='BN', requires_grad=True),
  391. norm_eval=True,
  392. style='pytorch'),
  393. neck=dict(...),
  394. rpn_head=dict(...),
  395. roi_head=dict(...))
  396. ```
  397. 基础配置的 `Mask R-CNN` 使用 `ResNet-50`,在需要将主干网络改成 `HRNet` 的时候,因为 `HRNet` 和 `ResNet` 中有不同的字段,需要使用 `_delete_=True` 将新的键去替换 `backbone` 域内所有老的键。
  398. ```python
  399. _base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py'
  400. model = dict(
  401. pretrained='open-mmlab://msra/hrnetv2_w32',
  402. backbone=dict(
  403. _delete_=True,
  404. type='HRNet',
  405. extra=dict(
  406. stage1=dict(
  407. num_modules=1,
  408. num_branches=1,
  409. block='BOTTLENECK',
  410. num_blocks=(4, ),
  411. num_channels=(64, )),
  412. stage2=dict(
  413. num_modules=1,
  414. num_branches=2,
  415. block='BASIC',
  416. num_blocks=(4, 4),
  417. num_channels=(32, 64)),
  418. stage3=dict(
  419. num_modules=4,
  420. num_branches=3,
  421. block='BASIC',
  422. num_blocks=(4, 4, 4),
  423. num_channels=(32, 64, 128)),
  424. stage4=dict(
  425. num_modules=3,
  426. num_branches=4,
  427. block='BASIC',
  428. num_blocks=(4, 4, 4, 4),
  429. num_channels=(32, 64, 128, 256)))),
  430. neck=dict(...))
  431. ```
  432. ### 使用配置文件里的中间变量
  433. 配置文件里会使用一些中间变量,例如数据集里的 `train_pipeline/test_pipeline`。我们在定义新的 `train_pipeline/test_pipeline` 之后,需要将它们传递到 `data` 里。例如,我们想在训练或测试时,改变 Mask R-CNN 的多尺度策略 (multi scale strategy),`train_pipeline/test_pipeline` 是我们想要修改的中间变量。
  434. ```python
  435. _base_ = './mask_rcnn_r50_fpn_1x_coco.py'
  436. img_norm_cfg = dict(
  437. mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
  438. train_pipeline = [
  439. dict(type='LoadImageFromFile'),
  440. dict(type='LoadAnnotations', with_bbox=True, with_mask=True),
  441. dict(
  442. type='Resize',
  443. img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736),
  444. (1333, 768), (1333, 800)],
  445. multiscale_mode="value",
  446. keep_ratio=True),
  447. dict(type='RandomFlip', flip_ratio=0.5),
  448. dict(type='Normalize', **img_norm_cfg),
  449. dict(type='Pad', size_divisor=32),
  450. dict(type='DefaultFormatBundle'),
  451. dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']),
  452. ]
  453. test_pipeline = [
  454. dict(type='LoadImageFromFile'),
  455. dict(
  456. type='MultiScaleFlipAug',
  457. img_scale=(1333, 800),
  458. flip=False,
  459. transforms=[
  460. dict(type='Resize', keep_ratio=True),
  461. dict(type='RandomFlip'),
  462. dict(type='Normalize', **img_norm_cfg),
  463. dict(type='Pad', size_divisor=32),
  464. dict(type='ImageToTensor', keys=['img']),
  465. dict(type='Collect', keys=['img']),
  466. ])
  467. ]
  468. data = dict(
  469. train=dict(pipeline=train_pipeline),
  470. val=dict(pipeline=test_pipeline),
  471. test=dict(pipeline=test_pipeline))
  472. ```
  473. 我们首先定义新的 `train_pipeline`/`test_pipeline` 然后传递到 `data` 里。
  474. 同样的,如果我们想从 `SyncBN` 切换到 `BN` 或者 `MMSyncBN`,我们需要修改配置文件里的每一个 `norm_cfg`。
  475. ```python
  476. _base_ = './mask_rcnn_r50_fpn_1x_coco.py'
  477. norm_cfg = dict(type='BN', requires_grad=True)
  478. model = dict(
  479. backbone=dict(norm_cfg=norm_cfg),
  480. neck=dict(norm_cfg=norm_cfg),
  481. ...)
  482. ```

No Description

Contributors (1)